前言
作為一名客戶端開發(fā),無論是Android/IOS,生命周期的概念深入骨髓,那么一個優(yōu)秀的跨平臺方案,F(xiàn)lutter Widget是怎么處理生命周期的呢,接下來就讓我們一起了解一下,以圖鎮(zhèn)樓。

從圖中我們可以看到Flutter Widget的生命周期分為兩部分:一部分是Widget本身的周期,跟隨Widget在layer tree的狀態(tài)而改變,另一部分則是依賴于Native Application的生命周期。
實(shí)踐·驗(yàn)證
接下來我們通過實(shí)踐來驗(yàn)證一下真實(shí)的生命周期是否如圖中所示,以Android為例:
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addObserver(this);
print('initState');
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
switch (state) {
case AppLifecycleState.inactive:
print('AppLifecycleState.inactive');
break;
case AppLifecycleState.paused:
print('AppLifecycleState.paused');
break;
case AppLifecycleState.resumed:
print('AppLifecycleState.resumed');
break;
case AppLifecycleState.detached:
print('AppLifecycleState.detached');
break;
}
super.didChangeAppLifecycleState(state);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
print('didChangeDependencies');
}
@override
void didUpdateWidget(MyHomePage oldWidget) {
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() {
super.reassemble();
print('reassemble');
}
@override
void deactivate() {
super.deactivate();
print('deactivate');
}
@override
void dispose() {
super.dispose();
WidgetsBinding.instance.addObserver(this);
print('dispose');
}
}
1、創(chuàng)建一個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、跳轉(zhuǎn)到其他頁面執(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
initState:widget創(chuàng)建執(zhí)行的第一個方法,可以再里面初始化一些數(shù)據(jù),以及綁定控制器;
didChangeDependencies:當(dāng)State對象的依賴發(fā)生變化時會被調(diào)用;例如:在之前build() 中包含了一個InheritedWidget,然后在之后的build() 中InheritedWidget發(fā)生了變化,那么此時InheritedWidget的子widget的didChangeDependencies()回調(diào)都會被調(diào)用。InheritedWidget這個widget可以由父控件向子控件共享數(shù)據(jù),案例可以參考 scoped_model開源庫。
build :它主要是用于構(gòu)建Widget子樹的。
reassemble:此回調(diào)是專門為了開發(fā)調(diào)試而提供的,在熱重載(hot reload)時會被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用。
didUpdateWidget:當(dāng)樹rebuid的時候會調(diào)用該方法。
deactivate:當(dāng)State對象從樹中被移除時,會調(diào)用此回調(diào)。
dispose():當(dāng)State對象從樹中被永久移除時調(diào)用;通常在此回調(diào)中釋放資源。
代碼中的didChangeAppLifecycleState方法需要復(fù)寫WidgetsBindingObserver這個抽象類