我一直在阅读有关SwiftUI中属性包装器的内容,我发现它们非常棒,但是有一件事情我真的没有搞懂,那就是@EnvironmentObject和@ObservedObject之间的区别。
根据我目前所学,我知道@EnvironmentObject用于在我们的应用程序中需要使用对象的多个位置,但我们不需要将其通过所有位置传递。例如,如果我们有层次结构A -> B -> C -> D,并且该对象在A中创建,则它保存在环境中,以便我们可以将其直接从A传递到D(如果D需要它)。
如果我们使用 @ObservedObject ,该对象在A中创建并且需要传递给D,则我们还需要经过B和C。
但我仍然不知道如何决定使用哪一个。
这里有两个我做的示例项目:
struct ContentView2: View {
var order = Order2()
var body: some View {
VStack {
EditView2()
DisplayView2()
}
.environmentObject(order)
}
}
struct EditView2: View {
@EnvironmentObject var user: Order2
var body: some View {
HStack{
TextField("Fruit", text: $user.item)
}
}
}
struct DisplayView2: View {
@EnvironmentObject var user: Order2
var body: some View {
VStack{
Text(user.item)
}
}
}
class Order2: ObservableObject {
@Published var item = "Orange"
}
和
struct ContentView: View {
var order = Order()
var body: some View {
VStack {
EditView(order: order)
DisplayView(order: order)
}
}
}
struct EditView: View {
@ObservedObject var order: Order
var body: some View {
HStack{
TextField("Fruit", text: $order.item)
}
}
}
struct DisplayView: View {
@ObservedObject var order: Order
var body: some View {
VStack{
Text(order.item)
}
}
}
class Order: ObservableObject {
@Published var item = "Apple"
}
这两个代码都执行相同的视图更新。此外,这两个ContentView都传递了一个Order对象。区别在于Environment通过.environmentObject(order)进行传递,而Observed则直接传递EditView(order: order)。对我来说,它们都完成了相同的工作,只是声明方式不同,因此我希望能得到一些解释或更好的示例。