Flutter 生命周期 3 个阶段:创建、更新和销毁
在编写 Flutter 时,我发现 Flutter 生命周期的各个阶段很模糊。现在我想写一些关于Flutter生命周期的东西并深入其中。
Widget生命周期
我是一名Android开发者,Android生命周期指的是Activity生命周期。所以Flutter的生命周期实际上指的是Widget的生命周期,通过状态来体现。 Flutter设计的主要思想是一切都是Widget。
App 是一种特殊的 widget,因为它除了处理显示界面的生命周期外,还需要处理从 App 启动到后台再到 App 退出的状态。
无论是widget还是app,Flutter框架都提供了相应的回调方法。以下是两种不同类型的小部件和应用程序生命周期。
Widget(状态)生命周期
从图中可以看出,状态生命周期可以分为3个阶段:创建、更新和销毁。
Create
State 在创建和初始化构造函数、initState、didChangeDependency 和程序集时按顺序完成,然后完成页面渲染。
1.构造方法是状态生命周期的起点。 Flutter 通过调用 () 创建状态。通过构造函数方法,可以获取父widget传递过来的初始UI配置数据,从而确定widget的初始渲染效果。
2. initState 当 State 对象插入视图树时被调用。它在状态的生命周期中仅被调用一次。一般这里会做一些初始化工作,比如给状态变量设置默认值。
3.didChangeDependency 专门用于处理 State 对象依赖关系的变化,将在 initState 调用完成后执行。
4. 构建查看状态。在汇编中,我们创建一个widget并根据父widget传递的初始配置数据和state的当前状态返回它。
Update
State状态更新主要通过三种方式触发:setState、didChangeDependencies、didUpdateWidget。? Flutter 将回调该方法并开始构建组件。例如,当系统语言或应用主题发生变化时,系统通知state执行回调方法。
3. didUpdateWidget:当部件的配置发生变化时,例如父部件的状态发生变化时,系统会在快速重新加载期间调用此函数。
调用这三个方法后,Flutter 会运行销毁旧的 widget,并调用 build 方法重建 widget。
销毁
在销毁阶段,Flutter会调用disable和dispose方法来移除或销毁组件。
1.deactivate:当组件的可见状态发生变化时调用此函数。当页面切换时,因为State在视图树中的相对位置发生了变化,需要暂时移除然后重新添加,以重新开始组件的构建,所以也会调用这个函数。这意味着当你进入下一个页面时,当前页面将调用disable和build。当当前页面关闭时,当前页面也会调用disable和build。
2. dispose:当状态从视图树中永久删除时调用此函数。一般在该函数中进行释放资源、解除监控、清理环境等操作。
应用生命周期
当应用启动、进入后台、退出时,Flutter 也提供了相应的方法回调。为了满足这个要求,你需要混入 WidgetsBindingObserver 类。看看这个类有哪些回调函数。
abstract class WidgetsBindingObserver {
// 页面 pop
Future<bool> didPopRoute() => Future<bool>.value(false);
// 页面 push
Future<bool> didPushRoute(String route) => Future<bool>.value(false);
// 系统窗口相关改变回调,如旋转
void didChangeMetrics() { }
// 文本缩放系数变化
void didChangeTextScaleFactor() { }
// 系统亮度变化
void didChangePlatformBrightness() { }
// 本地化语言变化
void didChangeLocales(List<Locale> locale) { }
//App 生命周期变化
void didChangeAppLifecycleState(AppLifecycleState state) { }
// 内存警告回调
void didHaveMemoryPressure() { }
//Accessibility 相关特性回调
void didChangeAccessibilityFeatures() {}
}
通过在单个 WidgetsBinding 对象上设置监听器,您可以监听这些回调方法。现在我们主要关注应用程序生命周期中的回调。
didChangeAppLifecycleState 回调函数中是一个参数类型为AppLifecycleState的枚举类。该类是Flutter对应用程序生命周期状态的封装。常用的状态有“恢复”、“非活动”和“暂停”。
1.刷新:可见并响应用户输入。
2.非活动:处于非活动状态,无法处理用户响应。
3.暂停:不可见且无法响应用户输入,但仍在后台活动。
下面写个例子
class _LifecycleDemoState extends State<MyHomePage> with WidgetsBindingObserver{
@override
void initState() {
();
(this);// 注册监听器
}
@override
void dispose(){
();
(this);// 移除监听器
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) async {
print("$state");
if (state == ) {
//do sth
}else if(state == ) {
}
}
}
总结
以上是我对状态和应用程序生命周期的理解。我想如果我能深入的学习和理解生命周期的话,这样写出来的程序会更加流畅和清晰,所以我理解Flutter的生命周期还是有必要的。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。