目录
- StatelessWidget
- StatefulWidget
-
- 方法(按执行顺序)
- [1.初始化阶段(仅执行 1 次,奠定基础)](#1.初始化阶段(仅执行 1 次,奠定基础))
- [2.关键提醒:此阶段无 UI 渲染,initState() 中不能直接用 context 跳转 / 弹框。](#2.关键提醒:此阶段无 UI 渲染,initState() 中不能直接用 context 跳转 / 弹框。)
- [3.更新重建阶段(多次执行,动态刷新 UI)](#3.更新重建阶段(多次执行,动态刷新 UI))
- [4.销毁阶段(仅执行 1 次,释放资源)](#4.销毁阶段(仅执行 1 次,释放资源))
- [StatefulWidget 生命周期 4 大阶段 总结](#StatefulWidget 生命周期 4 大阶段 总结)
- 核心区别总结

StatelessWidget
StatelessWidget 没有独立的生命周期方法,核心只有「创建 → 构建 → 销毁」三个阶段,且全程无状态变化
| 方法 | 执行时机 | 核心作用 | 新手注意 |
|---|---|---|---|
| 构造函数 | 组件创建时 | 接收父组件传递的参数(必须 final 修饰) | 不可在内部修改参数,否则编译报错 |
| build(BuildContext context) | 首次渲染 / 父组件刷新 / 参数变化时 | 返回 Widget 树,是唯一的核心方法 | 不要写耗时操作(会阻塞 UI 渲染) |
StatefulWidget
StatefulWidget 的生命周期实际是其 State 类的生命周期,包含「创建 → 初始化 → 构建 → 更新 → 销毁」完整流程,
StatefulWidget 生命周期 4 大阶段
方法(按执行顺序)
| 方法 | 执行时机 | 核心作用 | 新手注意 |
|---|---|---|---|
| createState() | StatefulWidget 初始化时 | 创建对应的 State 实例(必须实现) | 组件和 State 一对一绑定 |
| initState() | State 创建后,首次 build 前 | 初始化操作(仅执行 1 次) | ①可做:初始化数据、监听事件、启动定时器、网络请求(注意异步);②不能直接用 context 跳转 / 弹框(需用 WidgetsBinding.instance.addPostFrameCallback 延迟);③不能调用 setState()(首次 build 前无 UI,无需刷新) |
| didChangeDependencies() | initState 后 / 依赖(如 InheritedWidget)变化时 | 处理依赖变化 | 很少用(仅在依赖全局状态(如主题、语言)时使用),新手暂时忽略 |
| build() | 首次渲染 / 每次 setState () / 依赖变化 / 父组件刷新 | 构建 UI 树 | 核心方法,不做耗时操作(会阻塞 UI) |
| didUpdateWidget() | 父组件重建,且传递的参数变化时 | 处理参数更新 | 对比新旧参数(oldWidget),必须调用 super.didUpdateWidget(oldWidget),做数据同步 |
| setState(VoidCallback fn) | 手动调用 | 标记状态变化,触发 build () 刷新 | ①必须在回调内修改状态(setState(() { _count++; }));②不要嵌套调用 |
| dispose() | 组件被移除 / 页面退出时 | 资源释放(仅执行 1 次) | 必做:①必须调用 super.dispose()(放在方法第一行);②取消定时器、取消网络请求、移除监听器(避免内存泄漏) |
1.初始化阶段(仅执行 1 次,奠定基础)
核心方法:createState() → initState()
执行逻辑:
- createState():先创建 State 实例(组件与 State 绑定的第一步,必须重写);
- initState():State 初始化(仅 1 次),做变量赋值、定时器 / 网络请求初始化,是「唯一能执行一次性初始化逻辑的阶段」。
关键提醒:此阶段无 UI 渲染,initState() 中不能直接用 context 跳转 / 弹框。
2.关键提醒:此阶段无 UI 渲染,initState() 中不能直接用 context 跳转 / 弹框。
核心方法 :didChangeDependencies() → build()
执行逻辑:
- didChangeDependencies():监听依赖变化(如主题 / Locale/InheritedWidget),首次执行在 initState() 后、build() 前(仅新手极少用);
- build():核心!返回 Widget 树,生成初始 UI 并渲染到屏幕。
关键提醒:此阶段是「首次 UI 渲染」,build() 仅写 UI 逻辑,避免耗时操作。
3.更新重建阶段(多次执行,动态刷新 UI)
触发条件:3 种场景都会触发 build() 重建 UI
- 调用 setState()(自身状态变化,最常用);
- didChangeDependencies()(依赖变化,如全局主题切换);
- didUpdateWidget()(父组件重建且参数变化,调用后必触发 build());
补充:Debug 模式下的 reassemble()(热重载)也会触发 build(),但 Release 模式无效。
关键提醒:此阶段是「动态 UI 的核心」,build() 可多次执行,仅更新状态相关的 UI。
4.销毁阶段(仅执行 1 次,释放资源)
核心方法 :deactivate() → dispose()(非必然连续执行)
执行逻辑:
- deactivate():组件「临时移除」(如列表滑动回收、页面切换离树),可能复用(复用则不走 dispose());
- dispose():组件「永久销毁」(如页面退出、条件渲染移除),仅执行 1 次,必须释放定时器 / 监听器等资源(避免内存泄漏)。
关键提醒:dispose() 是生命周期最后一步,资源释放仅在此方法中做,deactivate() 不处理资源释放。
StatefulWidget 生命周期 4 大阶段 总结
- 初始化阶段:createState()+initState(),仅 1 次,做一次性初始化;
- 首次构建阶段:didChangeDependencies()+build(),仅 1 次,生成初始 UI;
- 更新重建阶段:setState()/didChangeDependencies()/didUpdateWidget() 触发 build(),多次执行;
- 销毁阶段:deactivate()(临时移除)→ dispose()(永久销毁),仅 1 次,释放资源。
速记口诀
「一次初始化,一次首构建,多次更重建,一次终销毁」(核心记住:initState() 和 dispose() 仅执行 1 次,build() 可多次执行,资源释放只在 dispose())
核心区别总结
| 维度 | StatelessWidget | StatefulWidget |
|---|---|---|
| 状态管理 | 无状态(参数 final 不可变) | 有 State 类管理可变状态 |
| 生命周期方法 | 仅 build () | initState、build、dispose 等完整方法 |
| 刷新触发 | 只能靠父组件 setState | 自身可调用 setState 刷新,也可靠父组件 |
| 资源管理 | 无销毁方法,自动释放 | 需在 dispose () 手动释放资源(定时器 / 监听器) |
| 使用场景 | 静态 UI(文本、图标、固定布局) | 动态 UI(计数器、表单、列表刷新、网络请求结果展示) |
| 执行次数 | build() 可多次执行(父组件触发) | initState()/dispose() 仅 1 次,build() 可多次 |