Stateful Widget 生命周期
研究Stateful Widget的生命周期是如何维护的
StatelessWidget很简单,只有一个build
StatefulWidget 生命周期相关函数有
createState
Widget创建的第一步,立刻调用
可以被调用多次
调用后,buildContext已经生成
状态并未创建
initState
只会被调用一次,此时view没有渲染,所以buildContext还不能使用
必须调用super.initState
didChangeDependencies
- 在initState之后立即调用,view已经渲染完成,statefulwidget刷新时不会调用
build
- 不能返回null
- 在didChangeDependencies之后调用
- 每次刷新,build都会重新调用
- 不要再build里添加其他非必要逻辑
didUpdateWidget
- widget key发生变化时会调用,一般不会用
deactivate
- widget将被remove时调用,也有可能重新放入render tree中
dispose
- 当widget确实被销毁后调用
mounted
- mounted是个变量,当buildContext可用渲染结束时为true,dispose后变为false
监听App生命周期
- 在statefulwidget 的state类添加
混入
WidgetsBindingObserver
1 | class _MyScreenState extends State<MyScreen> with WidgetsBindingObserver |
在initState里添加监听
1
WidgetsBinding.instance.addObserver(this);
在dispose删除监听
1
WidgetsBinding.instance.removeObserver(this);
在state类里重写
didChangeAppLifecycleState(AppLifecycleState state)
1
2
3
4
5
6
7
8
9
10
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.paused) {
// went to Background
}
if (state == AppLifecycleState.resumed) {
// came back to Foreground
}
}
生命周期状态有4种
- resumed
- inactive
- paused
- suspending
转自https://medium.com/flutter-community/flutter-lifecycle-for-android-and-ios-developers-8f532307e0c7