Flutter Widgets生命周期(导航):导航变更对无/有状态组件的影响
导航变更对Flutter Widget生命周期的影响
一、Stateless Widget的行为
Stateless Widget本身没有可维护的独立状态,它的生命周期完全依附于所在页面在导航栈中的存在状态:
- push新页面时:当前页面的Stateless Widget不会被销毁,只是随页面退到后台处于不可见状态——因为页面仍在导航栈内,Flutter不会回收它的资源。
- 页面被移出导航栈时:比如执行
Navigator.pop返回上一页,或用pushReplacement替换当前页,此时页面从栈中消失,对应的Stateless Widget会被立即销毁,占用的资源被回收。 - 重建触发条件:Stateless Widget不会因单纯的导航push/pop操作自动重建,只有当父Widget重建、依赖的InheritedWidget数据变化,或是页面从后台回到前台时(父Widget触发重建的前提下),才会重新执行
build方法。
二、Stateful Widget的行为
Stateful Widget的核心是State对象,导航操作会直接触发State生命周期方法的执行,不同导航操作对应不同的流程:
1. Navigator.push打开新页面
- 当前页面的State会执行
deactivate()(标记为非活动状态),但不会触发dispose(),State对象依然保存在内存中。 - 新页面的State按顺序执行:
createState()→initState()→didChangeDependencies()→build(),完成页面初始化。
2. Navigator.pop返回上一页
- 被弹出的新页面的State依次执行
deactivate()→dispose(),State对象被销毁,所有持有的资源(如定时器、监听器)都会被清理。 - 返回的上一页的State会执行
activate()(重新标记为活动状态),随后触发build()方法重建页面UI。
3. Navigator.pushReplacement替换当前页面
- 当前页面的State执行
deactivate()→dispose(),页面从导航栈中移除,对应的Widget和State都被销毁。 - 新页面的State按正常初始化流程执行,完成页面加载。
4. 清理导航栈的操作(如popAndPushNamed/pushNamedAndRemoveUntil)
- 所有被从栈中移除的页面,它们的State都会执行
deactivate()→dispose(),对应的Widget全部被销毁。 - 新推入的页面的State按正常流程完成初始化。
特殊场景:页面被系统后台回收
如果App处于后台时,系统因资源不足回收了页面,当用户回到App时:
- 被回收的页面会重新创建,State会执行
createState()→initState(),如果之前通过didSaveInstanceState()保存了状态,会先恢复状态再执行build()。
内容的提问来源于stack exchange,提问作者FRANCISCO BERNAD
相关产品推荐
相关产品推荐

