SwiftUI:将environmentObject传递给工作表会导致更新问题

SwiftUI:将environmentObject传递给工作表会导致更新问题,swiftui,Swiftui,如果要将@EnvironmentObject传递给以工作表形式显示的视图,您会注意到每当更新@EnvironmentObject中的任何@Published属性时,都会重新创建此工作表 演示问题的最低示例: 导入快捷界面 类存储:observeObject{ @已发布的var name=“Kevin” @发布变量年龄=38 } 结构ContentView:View{ @EnvironmentObject私有变量存储:存储 @状态私有变量showProfile=false var body:一些观

如果要将
@EnvironmentObject
传递给以工作表形式显示的视图,您会注意到每当更新
@EnvironmentObject
中的任何
@Published
属性时,都会重新创建此工作表

演示问题的最低示例:

导入快捷界面
类存储:observeObject{
@已发布的var name=“Kevin”
@发布变量年龄=38
}
结构ContentView:View{
@EnvironmentObject私有变量存储:存储
@状态私有变量showProfile=false
var body:一些观点{
VStack{
文本(“你好,\(store.name),你是\(store.age)岁”)
按钮(“编辑配置文件”){
self.showProfile=true
}
}
.表(显示:$showProfile){
ProfileView()
.environmentObject(self.store)
}
}
}
结构概要视图:视图{
@EnvironmentObject私有变量存储:存储
@ObservedObject私有变量viewModel=viewModel()
var body:一些观点{
VStack{
文本(“你好,\(store.name),你是\(store.age)岁”)
按钮(“更改年龄”){
self.store.age+=1
}
}
}
}
类ViewModel:ObservableObject{
init(){
打印(“此处”)
}
}
如果运行此代码,您会注意到每次按下工作表中的按钮时都会记录“HERE”,这意味着重新创建了
ViewModel
。正如您可能想象的那样,这可能是一个巨大的问题,我希望ViewModel不会被重新创建,而是保持其状态。这在我的应用程序中造成了巨大的问题


据我所知,我在代码中所做的是将
@EnvironmentObject
传递到工作表的正常方式。有没有办法防止在
存储
中的内容发生变化时重新创建
配置文件视图

这是因为当状态变量发生变化时会重新创建视图。在视图中,您将viewModel实例化为viewModel()

尝试将观察到的对象作为参数传递,它将不再点击“此处”:

struct ContentView: View {
  @EnvironmentObject private var store: Store
  @State private var showProfile = false
  @ObservedObject private var viewModel = ViewModel()

  var body: some View {
    VStack {
      Text("Hello, \(store.name), you're \(store.age) years old")
      Button("Edit profile") {
        self.showProfile = true
      }
    }
    .sheet(isPresented: $showProfile) {
      ProfileView(viewModel: self.viewModel)
        .environmentObject(self.store)
    }
  }
}

struct ProfileView: View {
  @EnvironmentObject private var store: Store
  @ObservedObject var viewModel: ViewModel

  var body: some View {
    VStack {
      Text("Hello, \(store.name), you're \(store.age) years old")
      Button("Change age") {
        self.store.age += 1
      }
    }
  }
}

这是一篇关于这个问题的非常好的文章。

您写道:
尝试将观察到的对象作为参数传递…
,这是否意味着对于SwiftUI中的
.sheet(..{SubView()}
您不能在工作表的
子视图中使用@EnvironmentObjects??如果您有一个复杂的视图层次结构,并且首先调用
工作表的视图本身具有多个父视图,最终更新EnvironmentObject,该怎么办?我不想在整个视图层次结构中传递绑定参数,因为.sheet不能处理@EnvironmentObjects。或者,您可以举一个复杂视图层次结构的例子,以及您所建议的如何工作?