Get.lazyPut 的时机是什么时候,是在页面中使用了controller属性,并且加载了对应页面,才会注入控制器吗?

是的,Get.lazyPut<T> 是一种延迟注入的机制,它确保控制器实例只在第一次被实际需要时创建。具体来说,Get.lazyPut<T> 注册一个提供者函数,当你第一次通过 Get.find<T>() 查询或在一个 GetView<T> 页面中访问 controller 属性时,这个提供者函数会被调用来创建控制器实例。

这就意味着控制器并不会在 Get.lazyPut<T> 被调用时立即创建实例,而是在后续某个时间点------当控制器实际上需要时。这有助于减少应用启动时的资源消耗,并可以提高性能,因为不会预装载所有的控制器。

下面是一个 Get.lazyPut 的用法示例,演示了在绑定 (Bindings) 类中使用:

Dart 复制代码
class HomeBinding extends Bindings {
  @override
  void dependencies() {
    // HomeController 只有在第一次尝试访问时才会被创建
    Get.lazyPut<HomeController>(() => HomeController());
  }
}

HomeBinding 被用在 GetPage 的配置中并且页面被访问时,如下面的路由设置:

Dart 复制代码
GetPage(
  name: '/home',
  page: () => HomeView(),
  binding: HomeBinding(),
)

这个时候,一旦页面中的代码尝试访问 HomeController,比如一个 GetView<HomeController> 的子类访问它的 controller 属性,或者在页面中的某个地方调用了 Get.find<HomeController>()Get.lazyPut 提供的提供者函数就会被触发,HomeController 的实例将会被创建并注入到 GetX 的依赖注入系统中。

在这之后,你可以安全地通过 Get.find<T>() 或在 GetView<T> 中访问controller属性来获取控制器实例。以 GetView<T> 为例,在页面中,你通常会通过 controller 直接引用控制器,如下所示:

Dart 复制代码
class HomeView extends GetView<HomeController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        // 通过 controller 属性访问 HomeController 实例
        // 如果 HomeController 尚未创建,将会触发 Get.lazyPut 的执行
        child: Text('Welcome ${controller.username}'),
      ),
    );
  }
}

在上面的代码中,假设 HomeController 中有一个 username 属性,那么当 HomeView Widget 构建并且尝试访问 controller.username 时,Get.lazyPut 将会被触发,此时 HomeController 的实例将被创建并可用。

如果是通过 Get.find<T>() 手动获取控制器实例的情况下,同样的规则适用:

Dart 复制代码
final homeController = Get.find<HomeController>();
// 如果 HomeController 尚未创建,将会触发 Get.lazyPut 的执行

在这个例子中,如果之前没有访问过 HomeController 而触发过 Get.lazyPut 的执行,那么调用 Get.find<HomeController>() 将会实例化控制器。

总结来说,Get.lazyPut 允许你使用延迟加载的方式注册控制器,只有当控制器实际被需要时,GetX 才会创建控制器实例。这样做既优化了性能,也保证了资源的有效使用,因为你不需要一开始就加载所有的控制器实例,尤其是对于那些可能不会被立即使用的控制器。

相关推荐
江上清风山间明月1 天前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
Zsnoin能2 天前
flutter国际化、主题配置、视频播放器UI、扫码功能、水波纹问题
flutter
早起的年轻人2 天前
Flutter CupertinoNavigationBar iOS 风格导航栏的组件
flutter·ios
HappyAcmen2 天前
关于Flutter前端面试题及其答案解析
前端·flutter
coooliang2 天前
Flutter 中的单例模式
javascript·flutter·单例模式
coooliang2 天前
Flutter项目中设置安卓启动页
android·flutter
JIngles1232 天前
flutter将utf-8编码的字节序列转换为中英文字符串
java·javascript·flutter
B.-2 天前
在 Flutter 中实现文件读写
开发语言·学习·flutter·android studio·xcode
freflying11193 天前
使用jenkins构建Android+Flutter项目依赖自动升级带来兼容性问题及Jenkins构建速度慢问题解决
android·flutter·jenkins
机器瓦力3 天前
Flutter应用开发:对象存储管理图片
flutter