老孟导读 :对于生命周期的文章共有 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】: