StatefulWidget 生命周期

310 阅读1分钟
class StatefulWidgetExample extends StatelessWidget {
  static String title = "StatefulWidget Example";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(StatefulWidgetExample.title),
      ),
      body: MyCounterWidget(),
    );
  }
}

class MyCounterWidget extends StatefulWidget {
  //【1】定义到 Widget 中的数据都是不可变的,必须定义为 final
  final String abc = "aaa";

  @override
  _MyCounterWidgetState createState() => _MyCounterWidgetState();
}

class _MyCounterWidgetState extends State<MyCounterWidget> {
  //【2】不过可以在 State 里面使用变量
  int counter = 0;

  // 生命周期 - 1:创建State对象
  _MyCounterWidgetState() {
    print("执行 State 的 构造 方法");
  }

  // 生命周期 - 2:数据初始化
  @override
  void initState() {
    super.initState();
    print("执行 State 的 init 方法");
  }

  // 生命周期 - 3
  // 触发情况一:调用initState会调用
  // 触发情况二:从其他对象中依赖一些数据发生改变时,比如InheritedWidget
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("执行 State 的 didChangeDependencies 方法");
  }

  // 生命周期 - 4:渲染Widget
  @override
  Widget build(BuildContext context) {
    print("执行 State 的 build 方法");

    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          RaisedButton(
            color: Colors.redAccent,
            child: Text(
              "+1",
              style: TextStyle(fontSize: 18, color: Colors.white),
            ),
            onPressed: () {
              // 调用 setState 方法,会根据最新的状态(数据)来重新调用 build 方法,构建对应的 Widgets
              setState(() {
                print("点了+1");
                counter += 1;
              });
            },
          ),
        ],
      ),
    );
  }

  // 当父Widget触发重建(rebuild)时,系统会调用该方法
  @override
  void didUpdateWidget(covariant MyCounterWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    print("执行 State 的 didUpdateWidget 方法");
  }

  // 生命周期 - 5:销毁
  @override
  void dispose() {
    super.dispose();
    print("执行 State 的 dispose 方法");
  }
}

打印:

flutter: 执行 State 的 构造 方法
flutter: 执行 State 的 init 方法
flutter: 执行 State 的 didChangeDependencies 方法
flutter: 执行 State 的 build 方法
flutter: 点了+1
flutter: 执行 State 的 build 方法
// 退出后
flutter: 执行 State 的 dispose 方法