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

SwiftUI中EnvironmentObject实例疑似被重复创建的问题

问题分析与解决

核心原因

  1. ViewModel实例被重复创建:你观察到_seed值变化,说明RecipeViewModel实例被替换了。大概率是父视图中rvm的创建位置错误——如果在父视图的body里直接初始化RecipeViewModel(),每次父视图刷新都会生成新的ViewModel实例,导致传递给AddRecipe的是全新实例(其中newRecipe为nil)。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:54:59