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

Widget 生命周期

Flutter 的生命周期主要体现在 Widget 上,具体可分为两类:StatelessWidget 和 StatefulWidget。

1. StatelessWidget的生命周期

StatelessWidget 相对简单,主要包含构造方法和 build 方法:

class MyStatelessWidget extends StatelessWidget {final String title;MyStatelessWidget({this.title}) {print('构造函数被调用了!');}@overrideWidget build(BuildContext context) {print('build方法被调用了!');return Container();}
}

2. StatefulWidget的生命周期

StatefulWidget 的生命周期较为复杂,包含 Widget 和 State 两部分,可分为三个阶段:

初始化阶段(插入渲染树)
  1. Widget 的构造方法

  2. Widget 的 createState 方法

  3. State 的构造方法

  4. State 的 initState 方法

状态改变阶段(在渲染树中存在)
  1. didChangeDependencies 方法

  2. State 的 build 方法

  3. didUpdateWidget 方法

销毁阶段(从渲染树中移除)
  1. deactivate 方法

  2. dispose 方法

(1)初始化阶段

createState()

  • StatefulWidget 创建 State 的方法,只会执行一次

initState()

  • StatefulWidget 创建完成后调用的第一个方法,只会执行一次

class HomePage extends StatefulWidget {HomePage() {print('Widget的构造方法');}@override_HomePageState createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {_HomePageState() {print('State的构造方法');}@overridevoid initState() {print('State的init来了!');super.initState();}@overrideWidget build(BuildContext context) {return Container();}
}

(2)状态改变阶段

didChangeDependencies

  • 首次创建时在 initState 之后立即调用
  • 依赖的 InheritedWidget 发生变化时会再次调用

didChangeDependencies更多细节参考:didChangeDependencies与InheritedWidget的关系

@override
void didChangeDependencies() {print('didChangeDependencies');super.didChangeDependencies();
}

build 方法

  • 首次创建时在 didChangeDependencies 之后立即调用

  • 每当 UI 需要重新渲染时都会被调用

didUpdateWidget

  • 父 widget 调用 setState 时,子 widget 的 didUpdateWidget 一定会被调用

@override
void didUpdateWidget(covariant StfulItem oldWidget) {print('子widget要didUpdateWidget');super.didUpdateWidget(oldWidget);
}

(3)销毁阶段

deactivate()

  • State 对象从渲染树中移出时调用

dispose()

  • Widget 销毁时调用

@override
void deactivate() {super.deactivate();
}@override
void dispose() {print('State的dispose');super.dispose();
}

http://www.xdnf.cn/news/19997.html

相关文章:

  • 【Python基础】 13 Rust 与 Python 注释对比笔记
  • 零基础两个月通关2025下半年软考!保姆级冲刺规划(附每日学习表)
  • 随时学英语5 逛生活超市
  • 25高教社杯数模国赛【C题顶流思路+问题解析】第三弹
  • 处理PostgreSQL中的磁盘I/O瓶颈
  • 从BERT到T5:为什么说T5是NLP的“大一统者”?
  • 一键成文,标准随行——文思助手智能写作助力政务提效
  • 常见的相机模型针孔/鱼眼(Pinhole,Mei,K
  • 从零构建一款开源在线客服系统:我的Go语言实战之旅
  • 对话A5图王:20年互联网老兵,从Web1.0到Web3.0,牛友会里藏着最真的创业情
  • 后端Long类型数据传给前端造成精度丢失
  • ReAct模式解读
  • Linux 编译 Android 版 QGroundControl 软件并运行到手机上
  • 东土正创AI交通服务器再获北京市批量应用订单
  • Agent Prompt工程:如何让智能体更“听话”?(实践指南)
  • 20250904 10:45_排查10.1.3.35新QMS系统RMAN备份失败问题(优化脚本里的环境配置,增加了check_oracle_env 函数)
  • openai-python v1.104.2版本发布:修复Web搜索工具类型别名问题
  • uni-app iOS 上架常见问题与解决方案,实战经验全解析
  • 2025数学建模国赛高教社杯C题思路代码文章助攻
  • Java对接Kafka的三国演义:三大主流客户端全景评测
  • 25高教社杯数模国赛【C题国一学长思路+问题分析】第二弹
  • 以数据与自动化驱动实验室变革:智能化管理整体规划
  • 救命!Shell用了100次还不懂底层?爆肝300行代码从0造“壳”,fork/exec/重定向全扒光,Linux系统编程直接开挂!
  • 【面试题】Prompt是如何生成的,优化目标是什么,任务是什么?
  • 服务器监控不用盯屏幕:Ward+Cpolar让异常告警主动找到你
  • Cursor 辅助开发:快速搭建 Flask + Vue 全栈 Demo 的实战记录
  • C4.5决策树(信息增益率)、CART决策树(基尼指数)、CART回归树、决策树剪枝
  • 《ConfigMap热更新失效的深度解剖与重构实践》
  • 题解 洛谷P13778 「o.OI R2」=+#-
  • STM32 - Embedded IDE - GCC - 如何将编译得到的.bin固件添加CRC32校验码