携手创造,一起成长!这是我参加「日新计划 8 月更文挑战」的第7天,点击检查活动详情

本文首要介绍下Getx中关于值的生命周期和状况管理的生命周期

之前介绍了关于依赖注入的2种办法,可所以直接创立或许懒加载的办法。这里关于控制器同享的状况:

Class a => Class B (has controller X) => Class C (has controller X)

在A类中,控制器还没有进入内存,由于你还没有运用它(Get是懒加载)。在类B中,你运用了控制器,而且它进入了内存。在C类中,你运用了与B类相同的控制器,Get会将控制器B的状况与控制器C同享,同一个控制器还在内存中
假如你封闭C屏和B屏,Get会自动将控制器X从内存中移除,释放资源,由于a类没有运用该控制器。假如你再次导航到B,控制器X再次进入内存,假如你没有去C类,而是再次回到a类,Get将以相同的办法将控制器从内存中移除。 假如类C没有运用控制器,你把类B从内存中移除,就没有类在运用控制器X,相同也会被处理掉。
仅有能让Get乱了阵脚的例外状况,是假如你意外地从路由中删去了B,并试图运用C中的控制器,在这种状况下,B中的控制器的创立者ID被删去了Get被规划为从内存中删去每一个没有创立者ID的控制器。假如你打算这样做,在B类的GetBuilder中添加 "autoRemove: false "标志,并在C类的GetBuilder中运用adopID = true

1. 值的生命周期

之前介绍ObxGetX等中其间Workers是监听值的生命周期,Workers将帮忙你在事情产生时触发特定的回调

///每次`count1`改动时调用。
ever(count1, (_) => print("$_ has been changed"));
///只有在变量$_第一次被改动时才会被调用。
once(count1, (_) => print("$_ was changed once"));
///防DDos - 每当用户中止输入1秒时调用,例如。
debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1));
///疏忽1秒内的一切改动。
interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1));

一切worker都会回来一个Worker实例,你能够用它来取消(经过dispose())worker。

  • ever:每当Rx变量发出一个新的值时,就会被调用。
  • everAll:和 ever 很像,但它需求一个Rx值的 List,每次它的变量被改动时都会被调用。就是这样。
  • onceonce只在变量第一次被改动时被调用。
  • debouncedebounce查找函数中非常有用,你只希望API在用户完结输入时被调用。假如用户输入 “Jonny”,你将在API中进行5次查找,分别是字母J、o、n、n和y。运用Get不会产生这种状况,由于你将有一个 "debounce "Worker,它只会在输入结束时触发
  • intervalinterval 与 debouce不同,debouce假如用户在1秒内对一个变量进行了1000次修正,他将在规则的计时器(默以为800毫秒)后只发送最后一次修正。Interval则会疏忽规则时刻内的一切用户操作。假如你发送事情1分钟,每秒1000个,那么当用户中止DDOS事情时,debounce将只发送最后一个事情。主张这样做是为了防止乱用,在用户能够快速点击某样东西并取得一些好处的功能中(幻想一下,用户点击某样东西能够赚取硬币,假如他在同一分钟内点击300次,他就会有300个硬币,运用距离,你能够设置时刻范围为3秒,无论是点击300次或100万次,1分钟内他最多取得20个硬币)。debounce适用于防DDOS,适用于查找等功能,每次改动onChange都会调用你的api进行查询。Debounce会等候用户中止输入名称,进行恳求。假如在上面提到的投币场景中运用它,用户只会赢得1个硬币,由于只有当用户暂停到既定时刻时,它才会被执行。

留意:Worker应该总是在启动ControllerClass时运用,所以应该总是在onInit(引荐)、Class结构函数或StatefulWidgetinitState(大多数状况下不引荐这种做法,但应该不会有任何副作用)。

class GetXHomeController extends GetxController {
  var count = 0.obs;
  add(){
    count.value++;
  }
  @override
  void onInit() {
    super.onInit();
    ever(count, (callback) => print('ever:${count.value}'));
    once(count, (callback) => print('once${count.value}'));
    debounce(count, (callback) =>  print('debounce${count.value}'),time: const Duration(seconds: 1));
  }
}

用于一些查找处理,或许点击频率处理。

2. contrlller的生命周期

  • GetBuilder代替StatefulWidget

在开发中咱们可能会在Widget初始化的时分做些操作比如恳求数据,假如是StatefulWidget则在initState中进行创立恳求。或许在dispose()中调用某些办法。现在能够在GetBuilder中进行操作

GetBuilder<Controller>(
  initState: (_) => Controller.to.fetchApi(),
  dispose: (_) => Controller.to.closeStreams(),
  builder: (s) => Text('${s.username}'),
),

可是最好还是在控制器中做相对应的操作

@override
void onInit() {
  fetchApi();
  super.onInit();
}
  ///封闭流用onClose办法,而不是dispose
  @override
  void onClose() {
    user.close();
    name.close();
    super.onClose();
  }

onInit类似咱们iOS中的viewDidLoadonClose则类似dealloc办法

控制器的生命周期。

  • onInit()创立控制器的地方。
  • onReady()在创立成功后马上调用
  • onClose(),封闭控制器,为删去办法做准备。
  • deleted: 你不能拜访这个API,由于它实际上是将控制器从内存中删去。它真的被删去了,不留任何痕迹。

3. 小结

针对值的生命周期contrrller的生命周期咱们选择在合适的机遇运用对应的办法,其间假如咱们想要达到页面回来是刷新,或许恳求能够经过 var result = await Get.toNamed()拿到成果进行操作。