Flutter 中的 Widget 生命周期

139 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

生命周期函数的作用

  • 初始化数据
  • 请求网络
  • 监听响应事件
  • 管理内存(初始化及释放内存)

Widget 生命周期

StatelessWidget 生命周期

StatelessWidget 可以由父 Widget 直接传入值,调用 build 方法来构建,整个过程非常简单

class HomeContent extends StatelessWidget {

  final String message;
    
  //构造函数,接收父组件传来的值
  const HomeContent(this.message, {Key? key}) : super(key: key);

  // 重新构建 Widget 树
  @override
  Widget build(BuildContext context) {
    return Text(message);
  }
}

StatefulWidget 生命周期

StatefulWidget 需要通过 State 来管理其数据,并且还要监控状态的改变决定是否重新 build 整个 Widget

对于无状态组件生命周期只有一次 build 这个过程,也只会渲染一次。有状态组件的生命周期如下图:

  • 生命周期图示

    截屏2022-06-27 下午10.37.59.png

    • createState

      StatefulWidget 的构造函数中,通过执行 createState 方法来创建一个维护 StatefulWidgetState 对象

    • initState

      当 Widget 第一次插入到 Widget 树时会被调用,通常会在这个方法中执行一些变量的初始赋值,或者与服务器交互获取服务端数据后调用 setState 来设置 State

    • didChangeDependencies

      这个方法在两种情况下会调用

      • 调用 initState 会调用

      • 当 State 对象的依赖发生变化时会被调用。典型的场景是当系统语言 Locale 或应用主题改变时,Flutter framework 会通知 widget 调用此回调

    • build

      这个方法主要是返回需要渲染的 Widget。调用此方法有以下几个不同的场景

      • 调用 initState 之后
      • 调用 didUpdateWidget 之后
      • 调用 setState 之后
      • 调用 didChangeDependencies 之后
      • 调用了 deactivate 后,然后将 State 对象重新插入树中的另一个位置
    • setState

      手动调用 setState 方法,会根据最新的数据来重新调用 build 方法,构建对应的 Widgets

    • didUpdateWidget

      执行这个方法是在当父 Widget 触发重建(rebuild)时,系统会调用 didUpdateWidget 方法

    • deactivate

      当 Widget 从树中被移除时,会调用此回调。在一些场景下,Flutter framework会将 Widget 重新插到树中,如包含这个 Widget 的子树在树的一个位置移动到另一个位置时(可以通过 GlobalKey 来实现)。如果移除后没有重新插入到树中,则紧接着会调用dispose 方法

    • dispose

      当前的 Widget 不再使用时,会调用 dispose 进行销毁,释放组件资源

  • 代码示例

    class HomeContent extends StatefulWidget {
        
        HomeContent({Key? key}) : super(key: key) {
            print("1、组件 构造方法");
        }
    
        @override
        State<StatefulWidget> createState() {
            print("2、createState 方法");
            return _HomeContentState();
        }
    }
    
    class _HomeContentState extends State<HomeContent> {
    
        _HomeContentState() {
            print("3、状态 构造方法");
        }
    
        @override
        initState() {
            print("4、initState 方法");
            super.initState();
        }
        
        @override
        Widget build(BuildContext context) {
            print("5、build方法");
            return Container();
        }
    
        @override
        void dispose() {
            print("6、dispose");
            super.dispose();
        }
    }
    
  • log输出

    截屏2022-07-12 下午10.33.24.png