Flutter 中与平台相关的生命周期
此篇文章所说的生命周期与 StatefulWidget 组件的生命周期是不同的,这里平台相关的生命周期指的是特定平台相关操作所产生的生命周期,比如 Android 中 App 退到后台后的 onPause 等。
有人下场景,App 正在播放视频,此时回到手机桌面或者切换到其他 App,那么此时视频应该暂停播放,Flutter 中使用 AppLifecycleState 实现:
重点是重写 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 页面代码:
B 页面代码:
### 交流
博客中领取 《330 个控件大全》和 《Flutter 实战》PDF。地址:[http://laomengit.com](http://laomengit.com)
版权声明: 本文为 InfoQ 作者【老孟Flutter】的原创文章。
原文链接:【http://xie.infoq.cn/article/c4e22c3a5894ebbe6cd99ea4d】。文章转载请联系作者。
评论