You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:05:19