提到生命周期太过熟悉,无论android、iOS还是flutter开发,都离不开围绕着生命周期转。生命周期顾名思义就是一个活动从开始创建到结束所经历的这个过程。
前言
我们知道Flutter是面向组件开发,一切皆Widget,所以常说Flutter的生命周期主要是指Widget的生命周期,常见的Widget主要分为StatelessWidget(无状态) 和 StatefulWidget(有状态) 两种,StatelessWidget只进行一次创建绘制,生命周期很简单不在谈,StatefulWidget的生命周期方法相对多一些。
本文主要总结两部分:
- StatefulWidget生命周期(针对Widget)
- 监听App生命周期(针对应用)
StatefulWidget生命周期
StatefulWidget 的生命周期比较复杂,依次为:
- creatState
- initState
- didChangeDependencies
- build
- didUpdateWidget
- deactivate
- dispose
其他辅助生命周期:
- addPostFrameCallback
- reassemble
creatState
当要创建新的 StatefulWidget 的时候,会立即执行 createState,也就是StatefulWidget需要绑定一个状态,只执行一次
initState
initState 是 StatefulWidget 创建完后调用的第一个方法,而且只执行一次,类似于 Android 的 onCreate,此时view并没有渲染,但是这时 StatefulWidget 已经被加载到渲染树里了。
initState执行时,可以在这个方法里初始化一些数据,或者异步加载一些数据。
didChangeDependencies
顾名思义:“依赖改变时发生”,Widget所属的父类对该Widget布局约束发生了改变就会调用。
- 当 StatefulWidget 第一次创建的时候,didChangeDependencies 方法会在 initState 方法之后立即调用,之后当 StatefulWidget 刷新的时候,就不会调用了。
- StatefulWidget 依赖的 InheritedWidget 发生变化之后,didChangeDependencies 才会调用。
典型的场景是当系统语言Locale或应用主题改变时,Flutter framework会通知widget调用此回调。
build
build,主要是返回需要渲染的widget,状态改变时都会触发build执行:
- 父类的build执行时
- initState之后
- setState之后
addPostFrameCallback
addPostFrameCallback 是 StatefulWidge 渲染结束的回调,只会被调用一次,之后 StatefulWidget 需要刷新 UI 也不会被调用。
addPostFrameCallback 的使用方法是在 initState 里添加回调:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
reassemble
在 debug 模式下,每次热重载都会调用该函数,因此在 debug 阶段可以在此期间增加一些 debug 代码,来检查代码问题。
didUpdateWidget
在widget重新构建时,Flutter framework会调用Widget.canUpdate来检测Widget树中同一位置的新旧节点,然后决定是否需要更新,如果Widget.canUpdate返回true则会调用此回调。
deactivate
当要将 State 对象从渲染树中移除的时候,就会调用 deactivate 生命周期,这标志着 StatefulWidget 将要销毁,但是有时候 State 不会被销毁,而是重新插入到渲染树种。
dispose
当 View 不需要再显示,从渲染树中移除的时候,State 就会永久的从渲染树中移除,就会调用 dispose 生命周期,这时候就可以在 dispose 里做一些取消监听、动画的操作,和 initState 是相反的。
监听App生命周期
app生命周期主要是一些前台后台动作,可以使用WidgetsBindingObserver来监测,方法如下:
1.在State 的类 mix WidgetsBindingObserver,并重写didChangeAppLifecycleState方法:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.paused) {
// went to Background
}
if (state == AppLifecycleState.resumed) {
// came back to Foreground
}
}
}
2.在 State 的 initState 里添加监听:
@override
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(this);
}
3.在 State 的 dispose 里移除监听:
@override
void dispose() {
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
AppLifecycleState 有以下几种状态:
- resumed:同Android的onResume
- inactive:同Android的onPause
- paused:同Android的onStop
- suspending:应用挂起