当前位置: 首页 > news >正文

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

StatefulWidget 

/**
 * 需求:
 * 两个按钮,一个计数器
 * 这里要用到 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方法');
  }
  
}

相关文章:

  • 算法——递归
  • Mysql表字段字符集未设置导致乱码问题
  • java excel xlsx 增加数据验证
  • JavaWeb登录认证
  • Linux实操——在服务器上直接从百度网盘下载(/上传)文件
  • 【MySQL】InnoDB中的Buffer Pool
  • CNN:卷积网络中设计1×1夹在主要卷积核如3×3前后的作用
  • 基于专利合作地址匹配的数据构建区域协同矩阵
  • 记录一次解决springboot需要重新启动项目才能在前端界面展示静态资源的问题--------使用热部署解决
  • java23种设计模式-责任链模式
  • Java全流程供应链系统开源方案:前端后端分离
  • 免实名服务器新选择:AWS海外服务器三大核心优势解析——以aliyun国际版为对比
  • 2025系统架构师(一考就过):案例之四:架构复用、架构评估、特定架构(DSSA)、架构开发方法(ABSD)
  • 力扣-动态规划-518 零钱兑换Ⅱ
  • 笔记一:字符函数和字符串函数
  • gitlab初次登录为什么登不上去
  • 迈向更好的动态图学习:新架构和统一库阅读笔记
  • 获取 ubuntu 系统相关信息
  • C++效率掌握之STL库:string函数全解
  • 由 Mybatis 源码畅谈软件设计(三):简单查询 SQL 执行流程
  • 境外服务器/seo优化官网
  • 做的网站怎样打开速度快/代写软文公司
  • 奉贤宜昌网站建设/国内十大软件培训机构
  • 画网站 模板/牛排seo系统
  • wordpress置顶不重复/aso优化是什么意思
  • 网站域名更改了怎么换/湖人今日排名最新