Flutter 生命周期详解:Stateless 与 Stateful 完全对比

目录

  • 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 大阶段 总结

  1. 初始化阶段:createState()+initState(),仅 1 次,做一次性初始化;
  2. 首次构建阶段:didChangeDependencies()+build(),仅 1 次,生成初始 UI;
  3. 更新重建阶段:setState()/didChangeDependencies()/didUpdateWidget() 触发 build(),多次执行;
  4. 销毁阶段: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() 可多次
相关推荐
tangweiguo030519872 小时前
Flutter 页面生命周期超全总结(附 addPostFrameCallback 详解)
flutter
国医中兴3 小时前
Flutter 三方库 dson 的鸿蒙化适配指南 - 极简的序列化魔法、在鸿蒙端实现反射式 JSON 映射实战
flutter·harmonyos·鸿蒙·openharmony
Lesile4 小时前
Flutter回顾#1:动画:
flutter
yuanlaile4 小时前
2026年全新版Flutter教程_Dart Flutter入门实战系列视频教程
flutter·flutter教程·dart教程·flutter必备基础
国医中兴6 小时前
Flutter 三方库 cloudflare_r2_uploader 的鸿蒙化适配指南 - 云端存储的疾速通道、在鸿蒙端实现 R2 分段上传实战
flutter·harmonyos·鸿蒙·openharmony·cloudflare_r2_uploader
恋猫de小郭6 小时前
Flutter Beta 版本引入 ScrollCacheExtent ,并修复长久存在的 shrinkWrap NaN 问题
android·前端·flutter
国医中兴6 小时前
Flutter 三方库 weaver 的鸿蒙化适配指南 - 玩转轻量级服务发现、在鸿蒙端实现模块化治理与解构实战
flutter·harmonyos·鸿蒙·openharmony
国医中兴6 小时前
Flutter 三方库 tapper 的鸿蒙化适配指南 - 单元测试的“闪电侠”、在鸿蒙端实现极简函数式测试实战
flutter·harmonyos·鸿蒙·openharmony
国医中兴19 小时前
Flutter 三方库 stack_blur 鸿蒙适配指南 - 实现工业级高性能模糊滤镜、在 OpenHarmony 上打造极致视觉质感实战
flutter·华为·harmonyos