Flutter - StatefulWidget (有状态的 Widget) 和 生命周期

StatefulWidget

Dart 复制代码
/**
 * 需求:
 * 两个按钮,一个计数器
 * 这里要用到 StatefulWidget,因为 StatelessWidget 通常用来展示固定不变的数据
 */
main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomeContent(),
    );
  }
}

/**
 * Widget 中的数据都是不可变的,为何必须定义为 final ?
 * 因为 Widget 中展示的数据发生变化时辉重新构建整个 Widget
 * Widget 源码中有 @immutable 注解,(被@immutable注解标明的类或者子类都必须是不可变的)
 *
 * Flutter 将 StatefulWidget 设计成了两个类,创建 StatefulWidget 时必须创建两个类:
 * 1 一个类继承自 StatefulWidget,作为 Widget树的一部分
 * 2 一个类继承自 State,用于记录 StatefulWidget 会变化的状态,并且根据状态的变化,构建出新的 Widget
 */
class MyHomeContent extends StatefulWidget {

  @override
  State<MyHomeContent> createState() => _MyHomeContentState();
}

class _MyHomeContentState extends State<MyHomeContent> {

  var num = 0;

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(
            '计数:$num',
            style: TextStyle(fontSize: 28,color: Colors.blue,decoration: TextDecoration.none)
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(onPressed: (){
                setState(() {
                  num++;
                });
              }, child: Icon(Icons.add)),
              ElevatedButton(onPressed: (){
                setState(() {
                  num--;
                });
              }, child: Icon(Icons.remove))
            ],
          )
        ],
      ),
    );
  }
}

生命周期

复制代码
main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyStatefulWidget(),
    );
  }
}

class MyStatefulWidget extends StatefulWidget {

  MyHomeContent(){
    print('生命周期 ---- MyStatefulWidget的构造方法');
  }

  /**
   * 当 Flutter 构建一个 StatefulWidget 时,会立即调用 createState() 方法。
   * 这个方法返回一个 State 对象,该对象将管理这个 Widget 的状态。
   */
  @override
  State<MyStatefulWidget> createState() => _MyNumState();
}

class _MyNumState extends State<MyStatefulWidget> {

  _MyNumState(){
    print('生命周期 ---- _MyNumState的构造方法');
  }

  /**
   * initState() 是 State 对象的初始化方法,只会被调用一次。
   * 通常在这里进行一些初始化操作,比如订阅流、初始化数据等。
   */
  @override
  void initState() {
    super.initState();
    print('生命周期 ---- _MyNumState的 init方法');
  }

  /**
   * didChangeDependencies() 在 initState() 之后立即调用,
   * 并且在依赖的 InheritedWidget 发生变化时也会调用。
   * 通常在这里执行一些依赖于 BuildContext 或 InheritedWidget 的操作。
   */
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print('生命周期 ---- _MyNumState的 didChangeDependencies方法');
  }

  /**
   * build() 方法是构建 Widget 树的核心方法,每次 UI 需要更新时都会调用。
   * 这个方法必须返回一个 Widget,通常是组合其他 Widget 来构建界面。
   */
  @override
  Widget build(BuildContext context) {
    print('生命周期 ---- _MyNumState的 build方法');
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Row(
            children: [
              ElevatedButton(onPressed: (){
                /**
                 * setState() 用于通知 Flutter 框架状态已经改变,需要重新构建 UI。
                 * 调用 setState() 会触发 build() 方法。
                 */
                setState(() {
                  
                });
              }, child: Icon(Icons.remove))
            ],
          )
        ],
      ),
    );
  }

  /**
   * 当父 Widget 重建并传入新的 Widget 配置时,didUpdateWidget() 会被调用。
   * 通常在这里比较新旧 Widget 的配置,并根据需要更新状态。
   */
  @override
  void didUpdateWidget(covariant MyStatefulWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    print('生命周期 ---- _MyNumState的 didUpdateWidget方法');
  }

  /**
   * 当 State 对象从 Widget 树中移除时,deactivate() 会被调用。
   * 通常在这里做一些清理工作,但 State 对象仍然可能被重新插入到树中。
   */
  @override
  void deactivate() {
    super.deactivate();
    print('生命周期 ---- _MyNumState的 deactivate方法');
  }

  /**
   * 当 State 对象从 Widget 树中永久移除时,dispose() 会被调用。
   * 通常在这里释放资源,比如取消订阅、关闭流等。
   */
  @override
  void dispose() {
    super.dispose();
    print('生命周期 ---- _MyNumState的 dispose方法');
  }
  
}
相关推荐
●VON5 小时前
Flutter 鸿蒙插件适配实战:用 clipboard_watcher 0.3.0 监听剪贴板变化
flutter·华为·harmonyos
天空之城--8 小时前
Flutter Drift 完全指南:从原理到实战
jvm·flutter·oracle
yume_sibai12 小时前
02-Flutter进阶开发
前端·flutter
●VON14 小时前
Flutter 鸿蒙插件适配实战:用 is_lock_screen 2.0.0 判断真实锁屏状态
flutter·华为·harmonyos
●VON15 小时前
Flutter 鸿蒙插件适配实战:用 flutter_timezone_observer 1.2.0 监听系统时区变化
flutter·华为·harmonyos
●VON16 小时前
Flutter 鸿蒙 app_install_date 0.1.5 使用实战:读取应用安装时间
flutter·华为·harmonyos
●VON17 小时前
Flutter 鸿蒙插件适配实战:flutter_screenshot_detect 0.1.7 截图事件监听
flutter·华为·harmonyos·鸿蒙
西西学代码1 天前
尾灯-应用层通信协议(BLE)
flutter
恋猫de小郭2 天前
iPhone Duo 适配详解,需要改变的不止是布局模型
前端·flutter·ios