State 生命周期

image.png

image.png

App 生命周期

  1. abstract class WidgetsBindingObserver {
  2. //页面pop
  3. Future<bool> didPopRoute() => Future<bool>.value(false);
  4. //页面push
  5. Future<bool> didPushRoute(String route) => Future<bool>.value(false);
  6. //系统窗口相关改变回调,如旋转
  7. void didChangeMetrics() { }
  8. //文本缩放系数变化
  9. void didChangeTextScaleFactor() { }
  10. //系统亮度变化
  11. void didChangePlatformBrightness() { }
  12. //本地化语言变化
  13. void didChangeLocales(List<Locale> locale) { }
  14. //App生命周期变化
  15. void didChangeAppLifecycleState(AppLifecycleState state) { }
  16. //内存警告回调
  17. void didHaveMemoryPressure() { }
  18. //Accessibility相关特性回调
  19. void didChangeAccessibilityFeatures() {}
  20. }

didChangeAppLifecycleState 回调函数中,有一个参数类型为 AppLifecycleState 的枚举类,这个枚举类是 Flutter 对 App 生命周期状态的封装。它的常用状态包括 resumed、inactive、paused 这三个。

  • resumed:可见的,并能响应用户的输入。
  • inactive:处在不活动状态,无法处理用户响应。
  • paused:不可见并不能响应用户的输入,但是在后台继续活动中。
  1. class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver{//这里你可以再回顾下,第7篇文章“函数、类与运算符:Dart是如何处理信息的?”中关于Mixin的内容
  2. ...
  3. @override
  4. @mustCallSuper
  5. void initState() {
  6. super.initState();
  7. WidgetsBinding.instance.addObserver(this);//注册监听器
  8. }
  9. @override
  10. @mustCallSuper
  11. void dispose(){
  12. super.dispose();
  13. WidgetsBinding.instance.removeObserver(this);//移除监听器
  14. }
  15. @override
  16. void didChangeAppLifecycleState(AppLifecycleState state) async {
  17. print("$state");
  18. if (state == AppLifecycleState.resumed) {
  19. //do sth
  20. }
  21. }
  22. }
  • 从后台切入前台,控制台打印的 App 生命周期变化如下: AppLifecycleState.paused->AppLifecycleState.inactive->AppLifecycleState.resumed;
  • 从前台退回后台,控制台打印的 App 生命周期变化则变成了:AppLifecycleState.resumed->AppLifecycleState.inactive->AppLifecycleState.paused。

image.png

帧绘制回调

  1. WidgetsBinding.instance.addPostFrameCallback((_){
  2. print("单次Frame绘制回调");//只回调一次
  3. });
  4. WidgetsBinding.instance.addPersistentFrameCallback((_){
  5. print("实时Frame绘制回调");//每帧都回调
  6. });