前言
上一篇我们讲到网络请求等异步操作最好放在 GetxController
的 onReady
生命周期函数中处理。本篇我们来介绍 GetxController
的生命周期函数。
GetxController 类
我们自定义的Controller
继承关系如下所示。
其中 GetxController
只是有个 update
方法用于通知组件刷新。在 DisposableInterface
中覆盖了onInit 方法,实际多干了一件事:
SchedulerBinding.instance?.addPostFrameCallback((_) => onReady());
其实就是将 onReady
方法作为回调,当 onInit
完成之后的一帧来调用 onInit
。这也就是我们上一篇说的,onReady
会在 onInit
完成后一帧后调用。这里有三个方法:
-
onInit
:组件在内存分配后会被马上调用,可以在这个方法对 controller 做一些初始化工作。 -
onReady
:上一篇我们介绍过,这里是在 onInit 一帧后被调用,适合做一些导航进入的事件,例如对话框提示、SnackBar 或异步网络请求。 -
onClose
:在onDelete
方法前调用、用于销毁controller
使用的资源,例如关闭事件监听,关闭流对象,或者销毁可能造成内存泄露的对象,例如TextEditingController
,AniamtionController
。也适用于将数据进行离线持久化。
再往上是 GetLifeCycle
类,这个类只是在构造函数中配置了生命周期,实际上也是调用到 mixin
的 GetLifeCycleBase
的$configureLifeCycle
方法。实际上所有生命周期的方法都在这个 mixin
的定义。具体的方法如下:
-
onStart
:组件在内存分配的时间点就会被调用,这是一个final
方法,并使用了内部的callable
类型,以避免被子类覆盖。 -
onDelete
:也是一个final
方法,类型和onStart
一样,同样不能被覆盖。在controller
别销毁前调用。
实际上 onStart
和 onDelete
分别绑定了内部的_onStart
和 _onDelete
方法,在这两个方法里调用了 onInit
和 onClose
方法。
/// 在 GetLifeCycle的构造函数中调用
void $configureLifeCycle() {
_checkIfAlreadyConfigured();
onStart._callback = _onStart;
onDelete._callback = _onDelete;
}
bool _initialized = false;
/// Checks whether the controller has already been initialized.
bool get initialized => _initialized;
、
void _onStart() {
if (_initialized) return;
onInit();
_initialized = true;
}
bool _isClosed = false;
/// Checks whether the controller has already been closed.
bool get isClosed => _isClosed;
// Internal callback that starts the cycle of this controller.
void _onDelete() {
if (_isClosed) return;
_isClosed = true;
onClose();
}
也就是前面说的,onStart
是在controller
内存分配的时间点 调用的,完成内存分配后就马上调用了 ``
替代 StatefulWidget
有了 GetxController 的生命周期后,我们就可以完全替换掉 StatefulWidget 了。
- onInit或 onReady替换 initState,例如下面的代码:
@override
void onInit() {
//网络请求或其他初始化
apiService.getData();
super.onInit();
}
- onClose 替换 dispose,比如关闭流:
class Controller extends GetxController {
StreamController<String> name = StreamController<String>();
// ...
@override
void onClose() {
name.close();
super.onClose();
}
}
总结
基于上面的分析,我们得出GetxController 的生命周期及对应说明如下图。
image.png整个生命周期我们能够接入的方法就三个:
- onInit:初始化 Controller,例如一些成员属性的初始化;
- onReady:就绪后的业务处理,如异步操作、导航进入的参数处理等;
- onClose:释放资源,避免内存泄露,同时也可以进行数据持久化。
通过对 GetxController 的生命周期的理解,我们能够知道每个生命周期适合做得事情。
网友评论