老孟导读:关于生命周期的文章共有2篇,一篇(此篇)是介绍 Flutter 中Stateful 组件的生命周期。第二篇是 Flutter 中与平台相关的生命周期,html
博客中还有更多精彩文章,也欢迎加入 Flutter 交流群。微信
此篇文章所说的生命周期与 StatefulWidget 组件的生命周期是不一样的,这里平台相关的生命周期指的是特定平台相关操做所产生的生命周期,好比 Android 中 App 退到后台后的onPause等。app
有人下场景,App正在播放视频,此时回到手机桌面或者切换到其余App,那么此时视频应该暂停播放,Flutter 中使用 AppLifecycleState 实现:less
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。async
didChangeAppLifecycleState 方法的回调来源于系统的通知(notifications),正常状况下,App是能正常接收到这些通知,但有的状况下是没法接收到通知的,好比用户强制关机、手机没有电自动关机等。ide
下面对其状态详细说明:ui
下面是关于生命周期常常遇到的问题:this
其实这个问题大部分人是想要实现相似于Android 中 onResume 中的功能,用 didChangeAppLifecycleState 是没法实现此功能的,didChangeAppLifecycleState 是对应于整个应用程序的,而不是 Flutter 中 不一样的路由(页面)。spa
从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】:
![]() |
![]() |