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方法');
  }
  
}
相关推荐
傅里叶7 小时前
Flutter项目使用 buf.build
flutter
恋猫de小郭9 小时前
iOS 26 开始强制 UIScene ,你的 Flutter 插件准备好迁移支持了吗?
android·前端·flutter
yuanlaile10 小时前
Flutter开发HarmonyOS鸿蒙App商业项目实战已出炉
flutter·华为·harmonyos
CodeCaptain10 小时前
可直接落地的「Flutter 桥接鸿蒙 WebSocket」端到端实施方案
websocket·flutter·harmonyos
stringwu11 小时前
Flutter 中的 MVVM 架构实现指南
前端·flutter
消失的旧时光-19431 天前
Flutter 异步体系终章:FutureBuilder 与 StreamBuilder 架构优化指南
flutter·架构
消失的旧时光-19431 天前
Flutter 异步 + 状态管理融合实践:Riverpod 与 Bloc 双方案解析
flutter
程序员老刘1 天前
Flutter版本选择指南:避坑3.27,3.35基本稳定 | 2025年10月
flutter·客户端
—Qeyser1 天前
Flutter网络请求Dio封装实战
网络·flutter·php·xcode·android-studio