gpt4 book ai didi

swiftui - @EnvironmentObject 和 @ObservedObject 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 11:24:40 30 4
gpt4 key购买 nike

我一直在阅读有关 SwiftUI 中的属性包装器的信息,我发现它们做得很好,但我真正不明白的一件事是 之间的区别。 @EnvironmentObject @ObservedObject .
从我到目前为止所学到的,我看到 @EnvironmentObject 当我们在应用程序的各个地方都需要一个对象但我们不需要将它传递给所有对象时使用。例如,如果我们有层次结构 A -> B -> C -> D 并且对象是在 A 处创建的,那么它会保存在环境中,以便我们可以将它直接从 A 传递到 D,如果 D 需要的话。
如果我们使用 @ObservedObject 它是在 A 处创建的,需要传递给 D,然后我们还需要通过 B 和 C。
但我仍然不知道如何决定使用哪一个。
以下是我制作的 2 个示例项目:

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"
}
两个代码都对 View 进行相同的更新。也是两个 ContentViews,通过 订购 目的。不同的是Environment通过 .environmentObject(order) 并且 Observed 直接通过 EditView(order: order) .对我来说,两者都做同样的工作,只是他们的声明不同,因此我希望得到一些解释或更好的例子。

最佳答案

正如您所注意到的 @ObservedObject需要在 View 之间传递。当您没有太多 View 时,对于简单的 View 层次结构可能会更好。

假设您有以下层次结构:

ViewA -> ViewB -> ViewC -> ViewD
现在如果你想要你的 @ObservedObject来自 ViewAViewB直接传入 init没有问题.
但是如果你想要它在 ViewD 中怎么办?还有?如果您在 ViewB 中不需要它怎么办和 ViewC ?
@ObservedObject您需要从 ViewA 手动传递它到 ViewB然后到 ViewC ,然后到 ViewD .而且您需要在每个 subview 中声明它。
@EnvironmentObject这很简单 - 只需将其传递给顶级 View :
ViewA().environmentObject(someObservableObject)
然后你只在使用它的 View 中声明它 - 这可能会使你的代码更具可读性。

备注
环境中的每个对象( View 层次结构)都可以访问注入(inject)的 @EnvironmentObject .如果您不想要这个(隐私很重要),您可能需要将其作为 @ObservedObject 传递。反而。

关于swiftui - @EnvironmentObject 和 @ObservedObject 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63343819/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com