美文网首页
Flutter的生命周期

Flutter的生命周期

作者: 苦咖啡Li | 来源:发表于2020-09-27 14:00 被阅读0次

    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
               }
           }
    

    相关文章

      网友评论

          本文标题:Flutter的生命周期

          本文链接:https://www.haomeiwen.com/subject/ptkzjktx.html