get.put和get.lazyput的区别是什么?

11

我对 Getx 的依赖注入不熟悉,能否有人解释一下 Get.put()Get.lazyPut() 的好处,并告诉我它们之间的区别?

4个回答

23

简短回答

  • Get.put()会立即放置
  • Get.lazyPut()会在需要时才放置

11
据我理解,put方法直接将一个类的实例放入内存中,而lazyPut只是将它的构建器放在内存中。

lazyPut的好处是可以节省内存,直到你真正需要使用这个实例时才去创建它。此外,你还可以在构建器中放置更复杂的代码。另一个lazyPut的好处是你还可以在上面加上fenix: true,这意味着如果该实例被释放掉了,它也可以重新构建。

我认为使用put的唯一好处就是当调用find方法时速度会稍微快一些,因为不需要先调用构建器来获取实例。至于是否还有其他好处,我不清楚。


4

Get.put() :

将注入一个依赖项,并在注入时立即开始执行,我的意思是它的生命周期方法如onInit()onReady()将在您像这样进行注入时执行:

class ControllerOne extends GetxController {
  int a = 1;
  @override
  void onInit() {
    print('ControllerOne onInit');
    super.onInit();
  }

  @override
  void onReady() {
    print('ControllerOne onReady');
    super.onReady();
  }
}


final controller = Get.put(ControllerOne()); // will inject that dependecy, and immediately will call onInit() method  then onReady() method

调试日志:

 ControllerOne onInit
 ControllerOne onReady

Get.lazyPut() :

这个方法也会注入一个依赖,但只有当你真正使用该控制器时,它才会开始执行生命周期方法onInit()onReady()

 class ControllerTwo extends GetxController {
  int b = 2;
  @override
  void onInit() {
    print('ControllerTwo onInit');
    super.onInit();
  }

  @override
  void onReady() {
    print('ControllerTwo onReady');
    super.onReady();
  }
}

final controller = Get.lazyPut(() => ControllerTwo()); // will inject that dependecy, and wait until it's used then it will call onInit() method, then onReady() method

调试日志:

 /* nothing will be printed right now */

但是如果我们使用控制器,举个例子:

controller.b = 10;

然后控制器将开始运行:

调试日志:

 ControllerTwo onInit
 ControllerTwo onReady

希望这能澄清一下!

4
在使用 lazyPut 时,它只会创建一个实例,该实例只有在被使用时才会被实例化。更多细节请查看此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接