阅读 665

Flutter 入门与实战(七十四):GetxController 的生命周期详解

前言

上一篇我们讲到网络请求等异步操作最好放在 GetxControlleronReady 生命周期函数中处理。本篇我们来介绍 GetxController 的生命周期函数。

GetxController 类

我们自定义的Controller继承关系如下所示。

image.png

其中 GetxController只是有个 update 方法用于通知组件刷新。在 DisposableInterface 中覆盖了onInit 方法,实际多干了一件事:

SchedulerBinding.instance?.addPostFrameCallback((_) => onReady());
复制代码

其实就是将 onReady 方法作为回调,当 onInit 完成之后的一帧来调用 onInit。这也就是我们上一篇说的,onReady 会在 onInit 完成后一帧后调用。这里有三个方法:

  • onInit:组件在内存分配后会被马上调用,可以在这个方法对 controller 做一些初始化工作。
  • onReady:上一篇我们介绍过,这里是在 onInit 一帧后被调用,适合做一些导航进入的事件,例如对话框提示、SnackBar 或异步网络请求。
  • onClose:在 onDelete 方法前调用、用于销毁 controller 使用的资源,例如关闭事件监听,关闭流对象,或者销毁可能造成内存泄露的对象,例如 TextEditingControllerAniamtionController。也适用于将数据进行离线持久化。

再往上是 GetLifeCycle 类,这个类只是在构造函数中配置了生命周期,实际上也是调用到 mixinGetLifeCycleBase$configureLifeCycle方法。实际上所有生命周期的方法都在这个 mixin 的定义。具体的方法如下:

  • onStart:组件在内存分配的时间点就会被调用,这是一个 final 方法,并使用了内部的 callable 类型,以避免被子类覆盖。
  • onDelete:也是一个 final 方法,类型和 onStart 一样,同样不能被覆盖。在 controller别销毁前调用。

实际上 onStartonDelete 分别绑定了内部的_onStart_onDelete 方法,在这两个方法里调用了 onInitonClose 方法。

/// 在 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 的生命周期的理解,我们能够知道每个生命周期适合做得事情。


我是岛上码农,微信公众号同名,这是Flutter 入门与实战的专栏文章,提供体系化的 Flutter 学习文章。对应源码请看这里:Flutter 入门与实战专栏源码。如有问题可以加本人微信交流,微信号:island-coder

👍🏻:觉得有收获请点个赞鼓励一下!

🌟:收藏文章,方便回看哦!

💬:评论交流,互相进步!

文章分类
iOS
文章标签