使用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
相关产品推荐
相关产品推荐

