Flutter的生命周期

2020-09-27  本文已影响0人  苦咖啡Li

Flutter的生命周期

Flutter的生命周期分为两个部分:
  · widget的生命周期
  · App的生命周期
1、widget的生命周期
1.1 StatelessWidget 的生命周期(只有build)
build: 用来创建widget的,但是build在每次界面刷新的时候都会调用,所以最好不要执行业务逻辑
1.2 StatefulWidget 的生命周期

在flutter中,一个 statefulWidget 会对应一个state类,state表示对应的statefulWidget要维护的状态

1.2.1、createDtate: 是 StatefulWidget 中创建state的方法,创建 StatefulWidget 时会立即执行且只执行一次;

        class MyPage extends StatefulWidget {
            @override
            _MyPageState createState() => _MyPageState();
        }
        class _MyPageState extends State<MyPage>{
            @override
            Widget build(BuildContext context){
                return widget;
            }
        }

1.2.2、initState: 是StatefulWidget创建完成后调用的第一个方法,只执行一次。此时View并没有渲染,StatefluWidget已经被加载到渲染数中,此时 mount 的值会变成 true ,直到 dispose 调用的时候才会变为 false

       /// 在@override initState的时候必须调用supper.initState();
       @override
       void initState(){
           supper.initState();
           ...
       }

1.2.3、 didChangeDependencies: 在 StatefulWidget 第一次创建的时候,此方法会在 initState 方法之后立即调用,之后当 statefulWidget 刷新的时候,不会再调用,除非 statefulWidget 依赖的 InherWidget 发生变化之后才会调用,因此 didChangeDependencies可能会被调用多次

       @override
       void didChangeDependencies(){
           supper.didChangeDependencies();
           ...
       }

1.2.4、build: 在StatefulWidget第一次创建的时候,build 会在 didchangeDependencies 方法之后立即调用,或者当UI需要重新渲染的时候(setState触发),build会被调用

1.2.5、addPostFrameCallback: 是 StatefulWidget 渲染结束的回调,只会被调用一次,之后 StatefulWidget需要刷新UI也不会调用,此方法的使用时在 initState 里添加回调

       import 'package:flutter/scheduler.dart';
       @override
       void initState() {
           super.initState();
           SchedulerBinding.instance.addPostFrameCallback(() => {});
       }

1.2.6、didUpdateWidget: 当组件状态改变的时候就会调用 didUpdateWidget,可能会调用多次(setState的时候并不调用,改变代码 hot reload 时候会调用didUpdateWidget并执行build)

实际上flutter框架会创建一个新的Widget,绑定本State,并在这个函数中传递老的widget。这个函数一般用于比较新老widget。

注意:涉及到`controller`的变更,需要在这个函数中移除老的controller的监听,并创建controller的监听。

1.2.7、deactivate(组件移除时):当要将state对象从渲染树中移除的时候,就会调用 deactivate 生命周期,这标志着 StatefulWidget 将要销毁,但是有时候State不会被销毁,而是重新插入到渲染树中;

1.2.8、dispose(组件移除):当view不需要再显示,再渲染树中移除的时候,State就会永久的从渲染树中移除,就会调用该生命周期,此时做一些取消监听、动画的的操作

2、App的生命周期
`AppLifecycleState` 就是App的生命周期, 有:
    · resumed
    · inactive
    · paused
    · suspending

如果想要知道Flutter App的生命周期,例如 Flutter 是再前台还是再后台,就需要用 WidgetBindingObserver,使用方法如下:

2.1、State的类 mix widgetBindingObserver:

        class _MyPageState extends State<MyPage> with WidgetsBindingObserver {

        }

2.2、在State的initState里添加监听:

        @override
        void initState(){
            super.initState();
            WidgetsBinding.instance.addObserver(this);
        }

2.3、在State的dispose里移除监听:

       @override
       void dispose() {
           // TODO: implement dispose
           super.dispose();
           WidgetsBinding.instance.removeObserver(this);
       }

2.4、在State里override didChangeAppLifecycleState:

       @override
       void didChangeAppLifecycleState(AppLifecycleState state) {
           super.didChangeAppLifecycleState(state);
           if (state == AppLifecycleState.paused) {
               // went to Background
           }
           if (state == AppLifecycleState.resumed) {
               // came back to Foreground
           }
       }
上一篇 下一篇

猜你喜欢

热点阅读