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

使用NavigationStack、NavigationDestination与NavigationPath正确传值问题

问题根源分析

核心矛盾:@StateObject生命周期与NavigationStack视图作用域不匹配

  • 你之前把@StateObject var dataStore = DataStore()放在ContentView内部,这会让DataStore的生命周期完全绑定在ContentView的实例上。
  • 使用NavigationStack+NavigationPath导航时,SwiftUI的视图栈管理逻辑可能会在跳转、返回过程中(比如内存优化触发的视图销毁重建),销毁原ContentView实例并创建新的。这会导致原来的DataStore被释放,新实例的DataStore是初始空状态。
  • 跳转至NextView时,虽然能通过环境拿到DataStore,但原ContentView的实例可能已被标记为待销毁,状态无法被正确保留;返回时,新创建的ContentView的DataStore是空的,和NextView之前引用的不是同一个实例,直接引发环境对象失效、程序崩溃。

为什么移到App/MainView就正常?

  • 当把@StateObject var dataStore = DataStore()放在App结构体或封装的MainView中时,DataStore的生命周期绑定在App或MainView的实例上——App实例是应用的根节点,MainView作为导航栈的上层容器,不会随内部视图的导航跳转被销毁重建。
  • 整个导航栈内的所有视图(包括ContentView、NextView)共享同一个DataStore实例,状态能被正确传递、保留,不会出现实例失效或空状态的问题。

关键原则:环境对象的注入位置要求

环境对象的提供者(持有@StateObject的视图)必须位于所有需要使用该对象的视图的上层,且其生命周期要覆盖所有子视图的生命周期。如果提供者的生命周期短于子视图,就会出现子视图引用已释放对象的崩溃问题。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:00:02