1.Flutter中生命周期:
flutter也有自己的生命周期,不像Android中Application、Activity、Fragment生命周期分得这么明细,flutter中只在StatefulWidget维护的State中维护了5个生命周期函数(可用于App中的页面跳转,相当于Android中View的生命周期)。而Activity中的生命周期可以通过实现WidgetsBindingObserver 接口,在didChangeAppLifecycleState()中获取状态回调。
1.1StatefulWidget:
initState()-->didChangeDependencies()-->deactivate()-->dispose() didUpdateWidge()
initState(): 表示当前 State 将和一个 BuildContext 产生关联,但是此时BuildContext
没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下。didChangeDependencies(): 在 initState() 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。
deactivate(): 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。页面路由切换的时候push()、pop()都会回调这个函数。
dispose(): Widget 销毁了,在调用这个方法之前,总会先调用 deactivate()。
didUpdateWidget(): 当 widget 状态发生变化时,会调用。
1.2常见业务场景:
1.Widget A打开Widget B: 调用 Navigator.push(B)
- B构造函数--->B initState()--->B didChangeDependencies()--->B build()--->A deactivate()--->A didChangeDependencies().
2.Widget B从Widget A退出: 调用Navigator.pop()
- A deactivate()--->A didChangeDependencies()--->A build()--->B deactivate()--->B dispose()
可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。
1.3Activity生命周期和Flutter的对应关系(主要依赖WidgetsBindingObserver 接口):
Flutter提供了WidgetsBindingObserver来监听AppLifecycleState, 而AppLifecycleState有4种状态:
1、 resumed 界面可见, 同安卓的onResume。
2、inactive界面退到后台或弹出对话框情况下, 即失去了焦点但仍可以执行drawframe回调;同安卓的onPause;
3、paused应用挂起,比如退到后台,失去了焦点且不会收到 drawframe 回调;同安卓的onStop;
4、suspending, iOS中没用,安卓里就是挂起,不会再执行 drawframe 回调;
5、关于drawframe回调:Vsync信号到来之后,Engin会按顺序回调window
的两个回调函数:onBeginFrame()
和onDrawFrame()
。这两个回调是SchedulerBinding
初始化的时候设置给window
的。对应的是SchedulerBinding.handleBeginFrame()
和SchedulerBinding.handleDrawFrame()
。
应用场景:
1、初次打开widget时,不执行AppLifecycleState的回调;
2、按home键或Power键, AppLifecycleState inactive---->AppLifecycleState pause
3、从后台到前台:AppLifecycleState inactive--->ApplifecycleState resumed
4、back键退出应用: AppLifecycleState inactive--->AppLifecycleState paused
class _TabBarState extends State<TabBarPage> with TickerProviderStateMixin ,WidgetsBindingObserver{
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// state对应生命周期回调
print('AsyncSnapshotLifeCycle:' + state.toString());
super.didChangeAppLifecycleState(state);
}
}