Flutter Widget 生命周期

这篇博客详细介绍了Flutter中StatefulWidget的生命周期,包括初始化、更新和销毁三个阶段的关键方法:createState、initState、didChangeDependencies、build、didUpdateWidget、deactivate和dispose。在每个方法中,作者阐述了其调用时机和主要用途,如initState用于初始化工作,build用于构建页面内容,而dispose则用于释放资源。此外,还提供了一个示例代码来展示这些生命周期方法的调用顺序。

Flutter  Widget什么周期主要讲解 StatefulWidget 的生命周期:应为无状态就两种;

  • StatelessWidget  两个生命周期
    @override
    StatelessElement createElement() => StatelessElement(this);
    
    @protected
    Widget build(BuildContext context);
 

StatefulWidget

StatefulWidget 生命周期按照 不同时期可以分为三组
 1.初始化:
         createState, initState
 2.更新时期
         didChangeDependencie,  build, didUpdateWidget
 3.销毁期
         deactivate, dispose

  1. createState  构造函数之前调用
  2. initState
    ◉ 创建 Widget 时 除了构造函数以外 第一个被调用的方法
    ◉ 类似 android: onCreate()  ios: viewDidLoad()
    ◉ 在这个方法中 一般会做一些初始化工作, 比如: channel的初始化; 监听器的初始化
  3. didChangeDependencies
    ◉ 当依赖的 State对象发生改变的时候  调用
     a. 在第一次构建 Widget时, 在initState() 之后会立即调用 此方法
     b. 如果StatefulWidget 依赖 InheritedWidget, 那么当前 State 所依赖的 
    ◉ InheritedWidget 中的变量改变时会再次调用 该方法
    ◉ 拓展:InheritedWidget 可以高效的将数据在 Widget 树中向下传递,共享 ;https://book.flutterchina.club/chapter7/inherited_widget.html
  4. build
    ◉ 这是一个必须实现的方法:在这里实现你要呈现的页面内容
    ◉ 它会在 didChangeDependencies() 之后体积调用
    ◉ 另外当调用 setState() 后也会再次调用 该方法
  5. didUpdateWidget
    ◉ 这是一个不常用的生命周期方法; 当父组件需要重新绘制的时候才会调用
    ◉ 该方法会携带一个 oldWidget, 可以将其与当前的 widget进行对比 以便更新一些额外的逻辑
    ◉ if( oldWidget.xx != widget.xxx) ...
  6. deactivate
    ◉ 很少使用,在组件被移除调用; 在 dispose 之前调用
  7. dispose
    ◉ 常用 在组件被销毁时 调用
    ◉ 通过在该方法中执行 一些资源释放工作 比如: 监听器的卸载, channel 的销毁
I/flutter (21669): ------------>createState
I/flutter (21669): ------------>initState
I/flutter (21669): ------------>didChangeDependencies
I/flutter (21669): ------------>build 第一次自己调用
I/flutter (21669): ------------>build setState 引起的调用
I/flutter (21669): ------------>build setState 引起的调用
I/flutter (21669): ------------>deactivate
I/flutter (21669): ------------>dispose

import 'package:flutter/material.dart';

class FlutterLife extends StatefulWidget {
  //createState 立即调用;必须重写
  @override
  State<StatefulWidget> createState() {
    print("------------>createState");
    return _FlutterLifeState();
  }
}

class _FlutterLifeState extends State<FlutterLife> {
  int clickCount = 0;

  ///创建 Widget 时 除了构造函数以外 第一个被调用的方法
  ///类似 android: onCreate()  ios: viewDidLoad()
  ///在这个方法中 一般会做一些初始化工作, 比如: channel的初始化; 监听器的初始化
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("------------>initState");
  }

  ///当依赖的 State对象发生改变的时候  调用
  /// a. 在第一次构建 Widget时, 在initState() 之后会立即调用 此方法
  /// b. 如果StatefulWidget 依赖 InheritedWidget, 那么当前 State 所依赖的 InheritedWidget 中的变量改变时会再次调用 该方法
  /// 拓展:InheritedWidget 可以高效的将数据在 Widget 树中向下传递,共享 ;https://book.flutterchina.club/chapter7/inherited_widget.html
  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    print("------------>didChangeDependencies");
  }

  /// 这是一个必须实现的方法:在这里实现你要呈现的页面内容
  /// 它会在 didChangeDependencies() 之后体积调用
  /// 另外当调用 setState() 后也会再次调用 该方法
  @override
  Widget build(BuildContext context) {
    print("------------>build");
    String title = (ModalRoute.of(context)!.settings.arguments as Map)['desc'];
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Container(
        alignment: Alignment.center,
        child: Column(
          children: [
            Padding(
              padding: EdgeInsets.only(top: 28),
              child: Text('点击了:$clickCount'),
            ),
            Divider(
              height: 20,
            ),
            FlatButton(
              onPressed: () {
                setState(() {
                  ++clickCount;
                });
              },
              child: Container(
                decoration: BoxDecoration(
                  color: Colors.red,
                  borderRadius: BorderRadius.circular(25),
                ),
                width: double.infinity,
                height: 50,
                child: Center(
                  child: Text(
                    '点击累计更新',
                    style: TextStyle(
                      color: Colors.white,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }

  /// 这是一个不常用的生命周期方法; 当父组件需要重新绘制的时候才会调用
  /// 该方法会携带一个 oldWidget, 可以将其与当前的 widget进行对比 以便更新一些额外的逻辑
  /// if( oldWidget.xx != widget.xxx) ...
  @override
  void didUpdateWidget(covariant FlutterLife oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
    print("------------>didUpdateWidget");
  }

  /// 很少使用,在组件被移除调用; 在 dispose 之前调用
  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
    print("------------>deactivate");
  }

  /// 常用 在组件被销毁时 调用
  /// 通过在该方法中执行 一些资源释放工作 比如: 监听器的卸载, channel 的销毁
  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    print("------------>dispose");
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nicepainkiller

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值