Flutter的生命周期
Flutter的生命周期
Flutter的生命周期分为两个部分:
· widget的生命周期
· App的生命周期
1、widget的生命周期
1.1 StatelessWidget
的生命周期(只有build)
build: 用来创建widget的,但是build在每次界面刷新的时候都会调用,所以最好不要执行业务逻辑
1.2 StatefulWidget
的生命周期
在flutter中,一个 statefulWidget 会对应一个state类,state表示对应的statefulWidget要维护的状态
1.2.1、createDtate
: 是 StatefulWidget 中创建state的方法,创建 StatefulWidget 时会立即执行且只执行一次;
class MyPage extends StatefulWidget {
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage>{
@override
Widget build(BuildContext context){
return widget;
}
}
1.2.2、initState
: 是StatefulWidget创建完成后调用的第一个方法,只执行一次。此时View并没有渲染,StatefluWidget已经被加载到渲染数中,此时 mount
的值会变成 true
,直到 dispose
调用的时候才会变为 false
/// 在@override initState的时候必须调用supper.initState();
@override
void initState(){
supper.initState();
...
}
1.2.3、 didChangeDependencies
: 在 StatefulWidget 第一次创建的时候,此方法会在 initState 方法之后立即调用,之后当 statefulWidget 刷新的时候,不会再调用,除非 statefulWidget
依赖的 InherWidget
发生变化之后才会调用,因此 didChangeDependencies
可能会被调用多次
@override
void didChangeDependencies(){
supper.didChangeDependencies();
...
}
1.2.4、build
: 在StatefulWidget第一次创建的时候,build
会在 didchangeDependencies
方法之后立即调用,或者当UI需要重新渲染的时候(setState触发),build会被调用
1.2.5、addPostFrameCallback
: 是 StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget需要刷新UI也不会调用,此方法的使用时在 initState 里添加回调
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback(() => {});
}
1.2.6、didUpdateWidget
: 当组件状态改变的时候就会调用 didUpdateWidget
,可能会调用多次(setState的时候并不调用,改变代码 hot reload
时候会调用didUpdateWidget
并执行build)
实际上flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的widget。这个函数一般用于比较新老widget。
注意:涉及到`controller`的变更,需要在这个函数中移除老的controller的监听,并创建controller的监听。
1.2.7、deactivate(组件移除时)
:当要将state对象从渲染树中移除的时候,就会调用 deactivate
生命周期,这标志着 StatefulWidget
将要销毁,但是有时候State不会被销毁,而是重新插入到渲染树中;
1.2.8、dispose(组件移除)
:当view不需要再显示,再渲染树中移除的时候,State就会永久的从渲染树中移除,就会调用该生命周期,此时做一些取消监听、动画的的操作
2、App的生命周期
`AppLifecycleState` 就是App的生命周期, 有:
· resumed
· inactive
· paused
· suspending
如果想要知道Flutter App的生命周期,例如 Flutter 是再前台还是再后台,就需要用 WidgetBindingObserver
,使用方法如下:
2.1、State的类 mix widgetBindingObserver
:
class _MyPageState extends State<MyPage> with WidgetsBindingObserver {
}
2.2、在State的initState里添加监听:
@override
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(this);
}
2.3、在State的dispose里移除监听:
@override
void dispose() {
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
2.4、在State里override didChangeAppLifecycleState
:
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.paused) {
// went to Background
}
if (state == AppLifecycleState.resumed) {
// came back to Foreground
}
}