【发布时间】:2022-10-23 16:39:24
【问题描述】:
牛你给我一些关于我对@ObservedObject 和@EnvironmentObject 的理解的确认?
在我看来,当我们在排序的视图之间“排队”发送数据时,使用 @ObservedObject 很有用,就像 UIKit 中的“准备”一样,而使用 @EnvironmentObject 更像是 UIKit 中的“单例”。我的问题是,我的代码是否正确使用了这两个特性?这是在实际开发中应用的方式吗?
我的模型用作功能的大脑(IE urls 会话,其他数据操作)
class ModelClass_ViaObservedObject: ObservableObject {
@Published var isOn: Bool = true
}
class ModelClass_ViaEnvironment: ObservableObject {
@Published var message: String = "default"
}
我的主要观点
struct ContentView: View {
//way to send data in views step by step
@StateObject var modelClass_ViaObservedObject = ModelClass_ViaObservedObject()
//way to share data more or less like a singleton
@StateObject var modelClass_ViaEnvironment = ModelClass_ViaEnvironment()
var myBackgroundColorView: Color {
if modelClass_ViaObservedObject.isOn {
return Color.green
} else {
return Color.red
}
}
var body: some View {
NavigationView {
ZStack {
myBackgroundColorView
VStack {
NavigationLink(destination:
SecondView(modelClass_viaObservedObject: modelClass_ViaObservedObject)
) {
Text("Go to secondary view")
.padding()
.overlay(
RoundedRectangle(cornerRadius: 16)
.stroke(.black, lineWidth: 1)
)
}
Text("text received from second view: \(modelClass_ViaEnvironment.message)")
}
}
.navigationTitle("Titolo")
.navigationBarTitleDisplayMode(.inline)
}
.environmentObject(modelClass_ViaEnvironment)
}
}
我的第二个观点
struct SecondView: View {
@Environment(\.dismiss) var dismiss
@ObservedObject var modelClass_viaObservedObject: ModelClass_ViaObservedObject
//global data in environment, not sent step by step view by view
@EnvironmentObject var modelClass_ViaEnvironment: ModelClass_ViaEnvironment
var body: some View {
VStack(spacing: 5) {
Text("Second View")
Button("change bool for everyone") {
modelClass_viaObservedObject.isOn.toggle()
dismiss()
}
TextField("send back", text: $modelClass_ViaEnvironment.message)
Text(modelClass_ViaEnvironment.message)
}
}
}
【问题讨论】:
-
代表
@ObservedObject和@EnvironmentObject的初始类在技术上是相同的。两者都是单一(吨)的事实来源。正如您正确陈述的那样,将其移交给后代视图的方式是不同的。 -
嗨,瓦迪安,一如既往的犀利!所以你确认我这是处理这个机制的正确方法。谢谢!
标签: swiftui observedobject environmentobject