Flutter Widget生命周期分為3個階段:
1.創建:
- 構造方法:Flutter通過StatefulWidget.createState()創建State。可以通過此方法接收父Widget傳遞的初始UI配置數據,決定初始呈現效果。
- initState:對象被插入視圖樹的時候調用,只會調用一次,可以作初始化工作。
- didChangeDependencies:專門處理State對象依賴關系,initState方法后被Flutter調用, 對象以來發生改變也會調用(此方法會多次被調用)。
- buid:構建視圖,返回一個Widget。
2.更新:
- setState:數據狀態發生改變,調用此方法。
- didChangeDependencies:對象依賴關系變了,會調用此方法
- didUpdateWidget:Widget配置發生變化的時候,調用此方法。比如父widget觸發重新構建的時候。
3.銷毀:
- deactivate:在組件樹中移除會調動這個方法。
- dispose:組件釋放調用。該方法類似于iOS的dealloc方法,移除監聽,資源釋放 。
Flutter 狀態監聽WidgetsBinding
1.遵守WidgetsBindingObserver
協議
2.initState添加觀察者:WidgetsBinding.instance.addObserver(this);
3.dispose 移除觀察者:WidgetsBinding.instance.removeObserver(this);
4.重寫didChangeAppLifecycleState
class _LifeCycleObserverState extends State<LifeCycleObserver>
with WidgetsBindingObserver {
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
print("app進入前臺");
} else if (state == AppLifecycleState.inactive) {
print("app在前臺但不響應事件,比如電話,touch id等");
} else if (state == AppLifecycleState.paused) {
print("app進入后臺");
} else if (state == AppLifecycleState.detached) {
print("沒有宿主視圖但是flutter引擎仍然有效");
}
}
@override
Widget build(BuildContext context) {
return Container();
}
}