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方法');
  }
  
}
相关推荐
i-阿松!2 小时前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭2 小时前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神14 小时前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态14 小时前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏14 小时前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony
左手厨刀右手茼蒿14 小时前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http
雷帝木木14 小时前
Flutter 三方库 hrk_logging 的鸿蒙化适配指南 - 实现标准化分层日志记录、支持多目的地输出与日志分级过滤
flutter·harmonyos·鸿蒙·openharmony·hrk_logging
左手厨刀右手茼蒿14 小时前
Flutter 三方库 dio_compatibility_layer 的鸿蒙化适配指南 - 实现 Dio 跨主版本的平滑迁移、支持遗留拦截器兼容与网络请求架构稳定升级
flutter·harmonyos·鸿蒙·openharmony·dio_compatibility_layer
雷帝木木14 小时前
Flutter 三方库 hashids2 基于鸿蒙安全内核的深度隐匿映射适配:数字指纹泄露防御层、生成短小精悍唯一不可逆加盐哈希,护航全链路请求 URL 隐私-适配鸿蒙 HarmonyOS ohos
安全·flutter·harmonyos
王码码203517 小时前
Flutter 组件 inappwebview_cookie_manager 适配 鸿蒙Harmony 实战 - 驾驭核心大 Web 容器缓存隧道、构建金融级政企应用绝对防串号跨域大隔离基座
flutter·harmonyos·鸿蒙·openharmony·inappwebview_cookie_manager