写点什么

Flutter 中与平台相关的生命周期

用户头像
老孟Flutter
关注
发布于: 2021 年 03 月 23 日

此篇文章所说的生命周期与 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.onBeginFrameWindow.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('返回的参数');    });  }}
复制代码


### 交流


博客中领取 《330 个控件大全》和 《Flutter 实战》PDF。地址:[http://laomengit.com](http://laomengit.com)


发布于: 2021 年 03 月 23 日阅读数: 12
用户头像

老孟Flutter

关注

公众号老孟Flutter 《Flutter 实战入门》。 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Flutter 中与平台相关的生命周期