Android学习总结-GetX库常见问题和解决方案

news2025/6/8 16:51:25

GetX库的常见问题

  1. 路由管理:Get.to() 后页面不跳转或卡顿?​

    • 问题:​​ 明明调用了 Get.to(NextPage()),但页面没反应,或者感觉有延迟卡顿。这可能发生在较复杂的页面树或低端设备上。
    • 原因:​
      • 最常见:Snackbar, Dialog, BottomSheet 没有关闭。​​ GetX 的路由管理依赖于它内部的 GetOverlay。任何未关闭的 Snackbar / Dialog / BottomSheet 都会阻塞新的路由导航。这是 极其常见 的原因。
      • Widget 构建耗时过长(特别是 build() 方法中做了耗时的同步操作),导致框架忙于构建而无法及时响应路由请求。
    • 解决方案:​
      • 务必检查并关闭所有 Snackbar / Dialog / BottomSheet!​​ 在尝试 Get.to() 之前,确保所有临时覆盖层都已消失。可以使用 Get.back() 手动关闭(如果确认有打开),或重构代码确保它们在使用后及时关闭。
      • 优化页面 build() 方法:​​ 避免在 build() 中做大量计算、耗时同步 IO 操作。将耗时逻辑移到异步方法或使用 FutureBuilder/StreamBuilder。确保 build() 尽可能快速返回。
      • ​(特定场景) 尝试 Get.offAll():​​ 如果想强制关闭之前的页面栈(包括潜在的临时覆盖层),可以尝试 Get.offAll(NextPage()),但这会清空历史栈,慎用。
      • 确认 GetMaterialApp:​​ 确保应用的顶层入口使用了 GetMaterialApp,而不是常规的 MaterialApp,因为 GetMaterialApp 集成了 GetX 所需的路由管理和依赖注入基础设施。
  2. 状态更新失效:Obx/GetX/GetBuilder 里的 UI 不刷新?​

    • 问题:​​ 修改了 Rx 变量或更新了 GetBuilderid,但对应的 Widget 没有更新。
    • 原因和解决方案:​
      • ​**变量非 Rx / 未使用 .obs:** ObxGetX只能监听Rx类型(如RxInt, RxString, Rxn, RxList)或其扩展变量(使用 .obs创建的变量)。确保你想要被监听的变量确实是Rx` 类型。
      • 忘记给 GetBuilder 设置或更新 id:​GetBuilder 默认监听其关联 Controller 的 update() 方法。如果你只想更新特定 GetBuilder Widget,需要在调用 update() 时传递对应的 id。常见错误:
        • GetBuilder 里忘记了设置 id (id: myId)。
        • 在 Controller 里调用 update(specificId),但 GetBuilder 设置的 id 和传递的 specificId 对不上。
        • 根本没有在 Controller 里调用 update()update(myId)。改变数据后必须调用!
      • ​(Obx/GetX) 在监听范围外访问变量:​
        Obx(() {
          // 错误!someString 是在 Obx 外部访问的,不会触发重建。必须通过 .value 读取 RxObject!
          return Text(controller.someString);
        });
        正确方式:​
        Obx(() => Text(controller.someString.value)); // 或更简洁的 .obs 方式
        final someString = 'Hello'.obs;
        Obx(() => Text(someString())); // 使用 () 直接访问值
      • 类成员 Rx 变量被整个替换:​
        class MyController extends GetxController {
          var myList = [1, 2, 3].obs;
        }
        // 错误:整个 list 替换,原始 RxList 丢失,监听失效
        controller.myList = [4, 5, 6];
        // 正确:使用 RxList 的方法或属性修改(保证监听器在同一个对象上)
        controller.myList.value = [4, 5, 6]; // 或
        controller.myList.assignAll([4, 5, 6]);
        controller.myList.add(4); // 修改单个元素
      • ​**Obx 监听了一个整个变化的 Controller 实例 (比较少见):​**​ 确保用于访问 Controller 的 Get.find<MyController>() 是在 GetBuilderGet.put() 之后,且获取到的是持久化的同一个实例。
      • 变量值改变前后相同 (原始类型):​RxInt(5) 再次设置为 5Obx 不会触发重建,因为值未变。
  3. 内存泄漏/控制器未释放:​

    • 问题:​​ 页面销毁后,关联的 GetXController 没有被自动回收,占用内存。
    • 原因:​
      • GetX (Obx, GetX widget) 和 GetBuilder默认会自动管理它们所依赖的 Controller 的生命周期。它们被创建时绑定到当前路由,当页面被路由系统正常移除时(Get.back()),会自动销毁绑定到该页面的 Controller。
      • 手动 Get.put() 未指定 permanent: true 或 tag​: 如果在 GetMaterialApp 之前或在一个不会被回收的全局地方使用 Get.put(MyController()),这个 Controller 会成为单例且不会被自动销毁。permanent: true 的 Controller 也需要手动处理。
      • ​**使用 Get.lazyPutfenix: true**​: fenix: true 会在 Controller 被删除后重新创建一份实例缓存,下次 find 时直接提供缓存而非重新调用工厂函数。如果不希望缓存,设为 false
      • 引用了其他难以释放的资源:​​ Controller 中如果持有 Disposable 的对象(如 StreamSubscription, AnimationController),但没有在 onClose() 中释放它们。
    • 解决方案:​
      • 优先使用 Bindings 和默认绑定:​​ 使用 GetPage 定义路由时,关联 Bindings,或者在页面 Widget 的 build 方法中使用 Get.put() / Get.lazyPut()。GetX 路由系统会在页面销毁时自动清理这些在页面范围内创建的 Controller (前提是使用了它管理的路由 Get.to() / Get.offXXX())。GetBuilder / Obx 也是同样。
      • 谨慎对待全局 Controller:​​ 如果确实需要全局、持久化的 Controller(比如用户认证状态),使用 Get.put(MyController(), permanent: true)。但要意识到需要自己管理其生命周期,或者在应用退出时调用 Get.delete<MyController>() 手动销毁。
      • ​**务必实现 onClose()**​:在你的 GetxController 中必须重写 onClose() 方法,并在其中释放它占有的所有资源:
        @override
        void onClose() {
          myStreamSubscription?.cancel(); // 取消Stream监听
          myAnimationController?.dispose(); // 销毁动画控制器
          myTimer?.cancel(); // 取消定时器
          super.onClose();
        }
      • 理解 fenix:​​ 根据业务需求谨慎设置 Get.lazyPut(..., fenix: true/false)。需要频繁创建销毁又想避免工厂函数开销用 true;严格避免内存占用且允许创建开销用 false
      • 手动调用 Get.delete():​​ 对于特殊场景或 permanent: true 的 Controller,在确定不再需要时(如用户退出登录),调用 Get.delete<MyController>(force: true) 强制立即销毁并触发 onClose()
  4. 依赖找不到:Get.find() 抛出异常找不到实例?​

    • 问题:​Get.find<MyController>() 抛出错误,提示没有找到 MyController
    • 原因和解决方案:​
      • put/lazyPutfind:​​ 调用 Get.find() 之前,必须先在同级或上级的 widget/controller/binding 中调用 Get.put()Get.lazyPut() 注入该类型的实例。顺序错误最常见。
      • lazyPut 导致初次 find 失败?​​ Get.lazyPut 只是注册了工厂函数,第一次调用 Get.find() 时才会真正创建。确保 find 发生在 lazyPut 注册之后。如果是在 initState 中使用 Get.find(),并且依赖关系复杂,可能需要考虑 put 或调整初始化顺序。
      • tag 不匹配:​ 如果在 Get.put(MyController(), tag: 'special') 时指定了 tag,那么在 Get.find<MyController>(tag: 'special') 时也必须带上相同的 tag 才能找到。确保两边 tag 一致或都不使用。
      • 作用域隔离:​​ 使用 Get.create 或特定 tag 创建的实例,需要精确匹配查找。
      • ​**Binding 未加载:​**​ 使用路由时,确认 GetPage 绑定了正确的 Binding。在页面构建前,Binding 需要负责 put 控制器。
  5. 混淆 GetBuilderGetXObx:​

    • 问题:​​ 不清楚何时该用哪个,导致性能不佳或代码冗余。
    • 解决方案 - 简洁比较:​
      • ​**GetBuilder:​**​
        • 控制精度:​​ 需要手动通过 update([id]) 或 id 更新特定部分 UI。
        • 依赖:​​ 强绑定一个具体的 GetxController (通过 Get.find 或传入)。
        • 轻量:​​ 不依赖 Rx 类型,只依赖 update() 调用。
        • 适用场景:​​ 需要精细控制刷新范围 (仅更新列表中特定项)、对 Rx 无需求、逻辑更集中于某个具体 Controller。
      • ​**Obx / GetX (基本等价, GetX 可带参数):​**​
        • 响应式:​​ 自动监听内部使用的所有 Rx 变量 (使用 .value 或 ())。当 任一 被监听的 Rx 变量变化时,builder 函数被调用重建整个 Obx 包裹的 Widget。
        • 便捷:​​ 不需要手动 update() 或指定 id
        • 依赖:​​ 隐式依赖任何在 builder 函数内被访问的 Rx 变量的控制器(通过 Get.find 或作用域查找)。
        • 注意范围:​​ builder 函数应尽可能简洁,避免包含与响应变量无关的、耗时或大型组件。
        • 适用场景:​​ 监听来自可能多个 Controller 的少量 Rx 变量的组合,追求代码简洁度,组件子树相对较小。
    • 选择建议:​
      • 对 Rx 变量变化后的 UI 更新:​**优先 Obx**​ (简洁)。
      • 需要精细控制刷新粒度或不想用 Rx:​选择 GetBuilder
      • 需要为部分子 Widget 提供一个单独的 Controller 实例:​**选择 GetX**​ (结合 Get.create)。
      • 避免大范围 Obx:​​ 尽量不要在整页的根部直接 Obx(()) => Scaffold(...)。包裹的范围越大,内部任何 Rx 变量变化都会导致重建整个页面。应根据状态变化的局部性,用多个小的 Obx 或 GetBuilder 更精细地包裹子组件。

场景解析

1. 状态管理相关

真题:在一个复杂的电商应用中,如何使用 GetX 管理商品列表的状态(如加载、刷新、分页等),并确保性能优化?
考察点:对 GetX 状态管理的深入理解和在复杂场景下的应用能力,以及性能优化的意识。
解答思路

  • 创建一个商品列表控制器,使用 Rx 变量管理列表数据和加载状态。
  • 封装加载、刷新和分页的逻辑在控制器中。
  • 使用 Obx 监听列表数据的变化,实现 UI 的响应式更新。
  • 合理使用 GetBuilder 手动控制更新范围,避免不必要的 UI 重绘。
    示例代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class ProductListController extends GetxController {
  var products = <Product>[].obs;
  var isLoading = false.obs;
  var currentPage = 1;

  Future<void> loadProducts() async {
    isLoading.value = true;
    try {
      // 模拟网络请求获取商品数据
      await Future.delayed(Duration(seconds: 1));
      products.addAll([
        Product(name: 'Product 1'),
        Product(name: 'Product 2'),
        // 更多商品...
      ]);
    } finally {
      isLoading.value = false;
    }
  }

  Future<void> refreshProducts() async {
    products.clear();
    currentPage = 1;
    await loadProducts();
  }

  Future<void> loadMoreProducts() async {
    if (isLoading.value) return;
    isLoading.value = true;
    currentPage++;
    try {
      // 模拟加载更多商品数据
      await Future.delayed(Duration(seconds: 1));
      products.addAll([
        Product(name: 'Product ${products.length + 1}'),
        Product(name: 'Product ${products.length + 2}'),
        // 更多商品...
      ]);
    } finally {
      isLoading.value = false;
    }
  }
}

class Product {
  final String name;
  Product({required this.name});
}

class ProductListPage extends StatelessWidget {
  final ProductListController controller = Get.put(ProductListController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Product List')),
      body: Obx(() {
        if (controller.isLoading.value) {
          return Center(child: CircularProgressIndicator());
        }
        return RefreshIndicator(
          onRefresh: controller.refreshProducts,
          child: ListView.builder(
            itemCount: controller.products.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(controller.products[index].name),
              );
            },
            onEndReached: controller.loadMoreProducts,
          ),
        );
      }),
    );
  }
}

讲解

  • ProductListController 负责管理商品列表的状态和逻辑,使用 Rx 变量 products 和 isLoading 实现响应式更新。
  • loadProducts 方法用于首次加载商品数据,refreshProducts 方法用于刷新列表,loadMoreProducts 方法用于分页加载更多商品。
  • ProductListPage 使用 Obx 监听 products 和 isLoading 的变化,根据状态显示不同的 UI。
2. 路由管理相关

真题:如何使用 GetX 实现一个带有底部导航栏的多页面应用,并且支持页面间的传参和返回值?
考察点:对 GetX 路由管理的掌握,包括路由跳转、参数传递和返回值处理,以及底部导航栏的实现。
解答思路

  • 使用 GetMaterialApp 和 GetPage 定义路由表。
  • 创建底部导航栏,通过 Get.toNamed 进行路由跳转。
  • 在跳转时使用 arguments 参数传递数据,使用 Get.back(result: ...) 返回数据。
    示例代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(GetMaterialApp(
    initialRoute: '/home',
    getPages: [
      GetPage(name: '/home', page: () => HomePage()),
      GetPage(name: '/detail', page: () => DetailPage()),
    ],
  ));
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Home Page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                final result = await Get.toNamed('/detail', arguments: {'message': 'Hello from Home'});
                if (result != null) {
                  print('Received result: $result');
                }
              },
              child: Text('Go to Detail Page'),
            ),
          ],
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
          BottomNavigationBarItem(icon: Icon(Icons.details), label: 'Detail'),
        ],
        onTap: (index) {
          switch (index) {
            case 0:
              Get.toNamed('/home');
              break;
            case 1:
              Get.toNamed('/detail');
              break;
          }
        },
      ),
    );
  }
}

class DetailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final args = Get.arguments as Map<String, dynamic>;
    return Scaffold(
      appBar: AppBar(title: Text('Detail Page')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Received message: ${args['message']}'),
            ElevatedButton(
              onPressed: () {
                Get.back(result: 'Response from Detail');
              },
              child: Text('Go back with result'),
            ),
          ],
        ),
      ),
    );
  }
}

讲解

  • GetMaterialApp 定义了路由表,包含 /home 和 /detail 两个页面。
  • HomePage 中的按钮点击时使用 Get.toNamed 跳转到 /detail 页面,并传递参数。
  • DetailPage 中使用 Get.arguments 获取传递的参数,使用 Get.back(result: ...) 返回数据给 HomePage
  • 底部导航栏通过 onTap 回调实现页面切换。
3. 依赖注入相关

真题:在一个 Flutter 应用中,有多个服务类需要管理,如何使用 GetX 进行依赖注入,并且确保服务类的单例性?
考察点:对 GetX 依赖注入的理解,以及单例模式的实现。
解答思路

  • 使用 Get.singleton 方法注册服务类,确保其单例性。
  • 在需要使用服务类的地方,使用 Get.find 获取服务类的实例。
    示例代码
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class UserService {
  String getUserInfo() {
    return 'User information';
  }
}

class OrderService {
  String getOrderInfo() {
    return 'Order information';
  }
}

void main() {
  Get.singleton(UserService());
  Get.singleton(OrderService());
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final userService = Get.find<UserService>();
    final orderService = Get.find<OrderService>();
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Dependency Injection')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(userService.getUserInfo()),
              Text(orderService.getOrderInfo()),
            ],
          ),
        ),
      ),
    );
  }
}

讲解

  • 在 main 函数中使用 Get.singleton 注册 UserService 和 OrderService,确保它们是单例的。
  • 在 MyApp 中使用 Get.find 获取服务类的实例,并调用其方法。

难点解决

状态管理方面

UI 未更新问题

有一次我在项目里使用 Obx 和 GetBuilder 管理状态,状态改变后 UI 却没更新。经过排查,发现是因为 Rx 变量没正确声明为可观察对象,还有 GetBuilder 没调用 update 方法,以及控制器实例未正确初始化或注入。
为了解决这个问题,我仔细检查代码,确保使用 Rx 或 .obs 声明变量。比如声明 var counter = 0.obs;。对于 GetBuilder,我在状态改变后调用 update 方法,像在控制器里写:

class MyController extends GetxController {
  int count = 0;

  void increment() {
    count++;
    update();
  }
}

同时,我也检查了控制器是否通过 Get.put 正确注入,确保在 main 函数里正确初始化:

void main() {
  Get.put(MyController());
  runApp(MyApp());
}
2. 多个控制器状态相互影响

       在一个复杂项目中,不同控制器的状态相互干扰,导致 UI 显示异常。分析后发现是控制器之间存在不合理的依赖关系,状态更新逻辑也比较混乱。
为了克服这个问题,我遵循单一职责原则,保证每个控制器只管理自己的状态。要是需要在控制器之间共享状态,我就使用依赖注入获取其他控制器的实例,并且在合适的时机更新状态。例如:

class ControllerA extends GetxController {
  var valueA = 0.obs;
}

class ControllerB extends GetxController {
  final ControllerA controllerA = Get.find();

  void updateValueA() {
    controllerA.valueA.value++;
  }
}

路由管理方面

  • 路由跳转失败:在使用 Get.to 或 Get.toNamed 进行路由跳转时,页面没切换。经过检查,发现问题出在路由表未正确配置、路由名称拼写错误或者目标页面未正确注册。
    我先检查 GetMaterialApp 中的 getPages 配置是否正确,确保路由表准确无误:
void main() {
  runApp(GetMaterialApp(
    initialRoute: '/',
    getPages: [
      GetPage(name: '/', page: () => HomePage()),
      GetPage(name: '/detail', page: () => DetailPage()),
    ],
  ));
}

同时,我仔细核对路由名称的拼写,使用 Get.toNamed 时传入正确的名称,像 Get.toNamed('/detail');

  • 嵌套路由问题:使用嵌套路由时,页面显示异常或者无法正常切换。这是由于嵌套路由的 navigatorKey 配置错误以及路由逻辑混乱导致的。
    为了解决这个问题,我正确使用 Get.nestedKey 来管理嵌套路由的 Navigator 实例。例如:
class HomePage extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey = Get.nestedKey(1);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Navigator(
        key: navigatorKey,
        initialRoute: '/home/sub1',
        onGenerateRoute: (settings) {
          // 路由生成逻辑
        },
      ),
    );
  }
}

并且,我仔细梳理嵌套路由的逻辑,避免出现循环路由或错误的路由跳转。

依赖注入方面

  • 依赖对象未正确注入:使用 Get.find 获取依赖对象时抛出异常,原因是依赖对象未通过 Get.put 或其他方式注册,或者注入时机不正确。
    为了解决这个问题,我在使用依赖对象之前,确保已经正确注册。例如在 main 函数里:
void main() {
  Get.put(MyService());
  runApp(MyApp());
}

同时,我检查注入时机,保证在需要使用依赖对象之前已经完成注入。

  • 单例模式问题:使用 Get.singleton 注入依赖对象时,未达到单例效果,这是因为多次调用 Get.singleton 并传入不同的实例。
    为了避免这种情况,我确保只调用一次 Get.singleton 来注入单例对象,不在其他地方重复调用。例如:
void main() {
  Get.singleton(MyService());
  runApp(MyApp());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404332.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

|从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面

&#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411;♈前言♈♈调取Deepseek大模型♈♒准备工作♒♒调用API♒ ♈将模型嵌入到ui界面中♈♈…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

产品笔试专业名词梳理

目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的&#xff1a; SWOT分析的优点&#xff1a; SWOT分析的局限与注意事项&…

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…

51单片机基础部分——矩阵按键检测

前言 上一节&#xff0c;我们说到了独立按键的检测以及使用&#xff0c;但是独立按键每一个按键都要对应一个IO口进行检测&#xff0c;在一些需要多按键的情况下&#xff0c;使用过多的独立按键会过多的占用单片机的IO资源&#xff0c;为了解决这个问题的出现&#xff0c;我们…

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…

CICD实战(二)-----gitlab的安装与配置

1、安装gitlab所需要的依赖包与工具 sudo yum install wget net-tools sudo yum install curl policycoreutils openssh-server openssh-clients postfix -y 2、配置清华源 vim /etc/yum.repo.d/gitlab-ce.repo[gitlab-ce] namegitlab-ce baseurlhttp://mirrors.tuna.tsin…

[GitHub] 优秀开源项目

1 工具类 1.1 桌面猫咪互动 BongoCat

Linux中su与sudo命令的区别:权限管理的关键差异解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)

低层协议&#xff08;Low Level Protocol, LLP&#xff09;详细解析 1. 低层协议&#xff08;Low Level Protocol, LLP&#xff09;核心特性 包基础 &#xff1a;基于字节的包协议&#xff0c;支持 短包 &#xff08;32位&#xff09;和 长包 &#xff08;可变长度&#xff0…

第4天:RNN应用(心脏病预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: Pytorch &#xff08;二&#xff09;具体步骤…

GIC700概述

GIC-700是用于处理外设与处理器核之间&#xff0c;以及核与核之间中断的通用中断控制器。GIC-700支持分布式微体系结构&#xff0c;其中包含用于提供灵活GIC实现的几个独立块。 GIC700支持GICv3、GICv3.1、GICv4.1架构。 该微体系结构规模可从单核到互联多chip环境&#xff0…

统信桌面专业版如何使用python开发平台jupyter

哈喽呀&#xff0c;小伙伴们 最近有学员想了解在统信UOS桌面专业版系统上开发python程序&#xff0c;Anaconda作为python开发平台,anaconda提供图形开发平台,提供大量的开发插件和管理各种插件的平台&#xff0c;但是存在版权问题&#xff0c;有没有其他工具可以替代Anaconda呢…

什么是预训练?深入解读大模型AI的“高考集训”

1. 预训练的通俗理解&#xff1a;AI的“高考集训” 我们可以将预训练&#xff08;Pre-training&#xff09; 形象地理解为大模型AI的“高考集训”。就像学霸在高考前需要刷五年高考三年模拟一样&#xff0c;大模型在正式诞生前&#xff0c;也要经历一场声势浩大的“题海战术”…

鸿蒙仓颉语言开发实战教程:购物车页面

大家上午好&#xff0c;仓颉语言商城应用的开发进程已经过半&#xff0c;不知道大家通过这一系列的教程对仓颉开发是否有了进一步的了解。今天要分享的购物车页面&#xff1a; 看到这个页面&#xff0c;我们首先要对它简单的分析一下。这个页面一共分为三部分&#xff0c;分别是…

OPENCV的AT函数

一.AT函数介绍 在 OpenCV 中&#xff0c;at&#xff08;&#xff09; 是一个模板成员函数&#xff0c;用于访问和修改矩阵或图像中特定位置的元素。它提供了一种直接且类型安全的方式来操作单个像素值&#xff0c;但需要注意其性能和类型匹配问题 AT函数是OPENCV中重要的函数…

ISO 17387——解读自动驾驶相关标准法规(LCDAS)

Intelligent transport systems — Lane change decision aid systems (LCDAS) — Performance requirements and test procedures(First edition: 2008-05-01) 原文链接&#xff1a;https://cdn.standards.iteh.ai/samples/43654/701fd49bde7b4d3db165444b7c6f0c53/ISO-17387…

智慧零售管理中的客流统计与属性分析

智慧零售管理中的视觉分析技术应用 一、背景与需求 随着智慧零售的快速发展&#xff0c;传统零售门店面临管理效率低、安全风险高、客户体验差等问题。通过视觉分析技术&#xff0c;智慧零售管理系统可实现对门店内人员行为的实时监控与数据分析&#xff0c;从而提升运营效率…