携手创造,一起成长!这是我参加「日新计划 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. 值的生命周期
之前介绍Obx
和GetX
等中其间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
,每次它的变量被改动
时都会被调用
。就是这样。 -
once
:once
只在变量第一次被改动时被调用。 -
debounce
:debounce
在查找函数
中非常有用,你只希望API在用户完结输入时被调用。假如用户输入 “Jonny”,你将在API中进行5次查找,分别是字母J、o、n、n和y。运用Get不会产生这种状况,由于你将有一个"debounce "Worker
,它只会在输入结束时触发
。 -
interval
:interval 与 debouce
不同,debouce
假如用户在1秒内对一个变量进行了1000次
修正,他将在规则的计时器(默以为800毫秒)后只发送最后一次修正
。Interval则会疏忽
规则时刻内的一切用户操作
。假如你发送事情1分钟,每秒1000个,那么当用户中止DDOS事情
时,debounce
将只发送最后一个事情
。主张这样做是为了防止乱用,在用户能够快速点击某样东西并取得一些好处的功能中(幻想一下,用户点击某样东西能够赚取硬币,假如他在同一分钟内点击300次,他就会有300个硬币,运用距离,你能够设置时刻范围为3秒,无论是点击300次或100万次,1分钟内他最多取得20个硬币)。debounce
适用于防DDOS,适用于查找等功能
,每次改动onChange都会调用你的api进行查询。Debounce会等候用户中止输入名称,进行恳求。假如在上面提到的投币场景中运用它,用户只会赢得1个硬币,由于只有当用户暂停
到既定时刻时,它才会被执行。
留意:Worker应该总是在启动Controller
或Class
时运用,所以应该总是在onInit
(引荐)、Class结构函数或StatefulWidget
的initState(
大多数状况下不引荐这种做法,但应该不会有任何副作用)。
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中的viewDidLoad
,onClose
则类似dealloc
办法
控制器的生命周期。
-
onInit()
是创立
控制器的地方。 -
onReady()
在创立成功后
马上调用 -
onClose()
,封闭控制器,为删去办法
做准备。 -
deleted
: 你不能拜访
这个API,由于它实际上是将控制器从内存中删去。它真的被删去了,不留任何痕迹。
3. 小结
针对值的生命周期
和contrrller
的生命周期咱们选择在合适的机遇
运用对应的办法
,其间假如咱们想要达到页面回来是刷新
,或许恳求能够经过 var result = await Get.toNamed()
拿到成果进行操作。