SwiftUI中EnvironmentObject实例疑似被重复创建的问题
问题分析与解决
核心原因
- ViewModel实例被重复创建:你观察到
_seed值变化,说明RecipeViewModel实例被替换了。大概率是父视图中rvm的创建位置错误——如果在父视图的body里直接初始化RecipeViewModel(),每次父视图刷新都会生成新的ViewModel实例,导致传递给AddRecipe的是全新实例(其中newRecipe为nil)。 newRecipe未被监听:即使ViewModel实例没被替换,newRecipe没有用@Published修饰,它的变化也不会触发视图刷新,不过你的情况主要是实例被重建导致的。
解决步骤
1. 确保ViewModel实例唯一
在父视图中用@StateObject(iOS 14+)持有ViewModel,保证整个视图生命周期内只有一个实例:
struct ParentView: View { // 用@StateObject初始化,确保实例不被重复创建 @StateObject private var rvm = RecipeViewModel() var body: some View { NavigationLink(destination: AddRecipe().environmentObject(rvm)) { Text("进入添加食谱页面") } } }
如果是iOS 13及以下,需用@ObservedObject并在父视图的初始化方法中创建ViewModel实例,避免在body里初始化。
2. 让newRecipe的变化触发视图刷新
给newRecipe添加@Published修饰符,这样当它的值改变时,关联的视图会自动更新:
class RecipeViewModel: ObservableObject { @Published var active: Bool = false @Published var newRecipe: Recipe? // 添加@Published }
3. 修正NavigationLink的完整写法
确保NavigationLink语法完整,补充label部分避免意外行为:
NavigationLink(destination: AddRecipe().environmentObject(rvm)) { Text("打开添加食谱") }
内容的提问来源于stack exchange,提问作者Reveclair
相关产品推荐
相关产品推荐

