首先來張圖

代碼打印這些方法在何時(shí)執(zhí)行
class _LifeDemoState extends State<LifeDemo>
with WidgetsBindingObserver {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addObserver(this);
print('initState');
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state.toString());
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
print('didChangeDependencies');
}
@override
void didUpdateWidget(LifeDemo oldWidget) {
// TODO: implement didUpdateWidget
super.didUpdateWidget(oldWidget);
print('didUpdateWidget');
}
@override
Widget build(BuildContext context) {
print('build');
// TODO: implement build
return MaterialApp(
home: Center(
child: GestureDetector(
child: new Text('lifeCycle'),
onTap: () {
Navigator.of(context)
.push(new MaterialPageRoute(builder: (BuildContext c) {
return new Text('sdfs');
}));
},
)),
);
}
@override
void reassemble() {
// TODO: implement reassemble
super.reassemble();
print('reassemble');
}
@override
void deactivate() {
// TODO: implement deactivate
super.deactivate();
print('deactivate');
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.addObserver(this);
print('dispose');
}
}
1、創(chuàng)建一個(gè)wedget到顯示 打印結(jié)果如下
01-15 14:06:44.751 19005-19025/com.example.flutterapp I/flutter: initState
01-15 14:06:44.751 19005-19025/com.example.flutterapp I/flutter: didChangeDependencies
01-15 14:06:44.752 19005-19025/com.example.flutterapp I/flutter: build
2、退出這個(gè)頁面執(zhí)行
01-15 14:08:40.956 19005-19561/com.example.flutterapp I/flutter: deactivate
01-15 14:08:40.970 19005-19561/com.example.flutterapp I/flutter: dispose
3、點(diǎn)擊熱重載按鈕
01-15 14:09:55.467 19005-19561/com.example.flutterapp I/flutter: reassemble
01-15 14:09:55.476 19005-19561/com.example.flutterapp I/flutter: didUpdateWidget
01-15 14:09:55.476 19005-19561/com.example.flutterapp I/flutter: build
4、app由顯示切換到后臺(home狀態(tài))
01-15 14:11:10.062 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.inactive
01-15 14:11:10.524 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.paused
5、app由后臺切回前臺
01-15 14:11:54.836 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.inactive
01-15 14:11:54.837 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.resumed
各個(gè)方法的解釋:
initState:widget創(chuàng)建執(zhí)行的第一個(gè)方法,可以再里面初始化一些數(shù)據(jù),以及綁定控制器 如下代碼所示
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addObserver(this);
_scrollController=new ScrollController();
print('initState');
}
didChangeDependencies:當(dāng)State對象的依賴發(fā)生變化時(shí)會被調(diào)用;例如:在之前build() 中包含了一個(gè)InheritedWidget,然后在之后的build() 中InheritedWidget發(fā)生了變化,那么此時(shí)InheritedWidget的子widget的didChangeDependencies()回調(diào)都會被調(diào)用。InheritedWidget這個(gè)widget可以由父控件向子控件共享數(shù)據(jù),案例可以參考 scoped_model開源庫。
build :它主要是用于構(gòu)建Widget子樹的。
reassemble:此回調(diào)是專門為了開發(fā)調(diào)試而提供的,在熱重載(hot reload)時(shí)會被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用。
didUpdateWidget:當(dāng)樹rebuid的時(shí)候會調(diào)用該方法。
deactivate:當(dāng)State對象從樹中被移除時(shí),會調(diào)用此回調(diào)。
dispose():當(dāng)State對象從樹中被永久移除時(shí)調(diào)用;通常在此回調(diào)中釋放資源。
注:
代碼中的didChangeAppLifecycleState方法復(fù)寫需要State with WidgetsBindingObserver這個(gè)抽象類