老孟导读:对于生命周期的文章共有2篇,一篇(此篇)是介绍 Flutter 中Stateful 组件的生命周期。第二篇是 Flutter 中与平台相干的生命周期,
博客地址:http://laomengit.com/blog/20201227/%E7%9B%B8%E5%85%B3%E5%B9%B3%E5%8F%B0%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F.html
博客中还有更多精彩文章,也欢送退出 Flutter 交换群。
此篇文章所说的生命周期与 StatefulWidget 组件的生命周期是不同的,这里平台相干的生命周期指的是特定平台相干操作所产生的生命周期,比方 Android 中 App 退到后盾后的onPause等。
有人下场景,App正在播放视频,此时回到手机桌面或者切换到其余App,那么此时视频应该暂停播放,Flutter 中应用 AppLifecycleState 实现:
class AppLifecycle extends StatefulWidget { @override _AppLifecycleState createState() => _AppLifecycleState();}class _AppLifecycleState extends State<AppLifecycle> with WidgetsBindingObserver { @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { //TODO } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('App 生命周期'), ), body: Center( child: Text(''), ), ); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); }}
重点是重写 didChangeAppLifecycleState 办法,AppLifecycleState 中的状态包含:resumed、inactive、paused、detached。
didChangeAppLifecycleState 办法的回调来源于零碎的告诉(notifications),失常状况下,App是能失常接管到这些告诉,但有的状况下是无奈接管到告诉的,比方用户强制关机、手机没有电自动关机等。
上面对其状态具体阐明:
- resumed:应用程序可见且响应用户输出。
- inactive:应用程序处于非激活状态,无奈响应用户输出。在iOS上,打电话、响应TouchID申请、进入应用程序切换器或控制中心都处于此状态。在Android上,分屏利用,打电话,弹出零碎对话框或其余窗口等。
- pause:应用程序不可见且无奈响应用户输出,运行在后盾。处于此状态时,引擎将不会调用 Window.onBeginFrame 和 Window.onDrawFrame。
- detached:应用程序仍存放在Flutter引擎上,但与平台 View 拆散。处于此状态的机会:引擎首次加载到附加到一个平台 View的过程中,或者因为执行 Navigator pop ,view 被销毁。
上面是对于生命周期常常遇到的问题:
有2个页面A和B,在B页面点击返回键返回到A,didChangeAppLifecycleState 不回调
其实这个问题大部分人是想要实现相似于Android 中 onResume 中的性能,用 didChangeAppLifecycleState 是无奈实现此性能的,didChangeAppLifecycleState 是对应于整个应用程序的,而不是 Flutter 中 不同的路由(页面)。
从A->B,在从B返回A,A从新加载数据应用如下办法:
A页面代码:
class A extends StatelessWidget { @override Widget build(BuildContext context) { return RaisedButton(onPressed: ()async{ var result = await Navigator.of(context).push(MaterialPageRoute(builder: (context){ return B(); })); //从B返回到A时,执行上面的代码 //TODO 加载数据 }); }}
B页面代码:
class B extends StatelessWidget { @override Widget build(BuildContext context) { return RaisedButton(onPressed: (){ Navigator.of(context).pop('返回的参数'); }); }}
交换
老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com
欢送退出Flutter交换群(微信:laomengit)、关注公众号【老孟Flutter】: