1

我有这样的代码:

struct MenuView : View {

    @Environment(\.verticalSizeClass) var sizeClass
    @EnvironmentObject var model : MenuModel

    @ObservedObject var items = MenuItems()

    var body: some View { 

    }

}

而且我考虑了为什么 ObservableObject 不保持它的状态(这个对象没有一个实例),而是在每个视图重绘时重新创建它(调用 init() 方法),而其他一些状态发生变化。我认为每个对象一次。

但是点击按钮会导致 View 被重新创建,并且这个 ObservedObject 也被重新创建。我是否应该不通过属性初始化而是在父级中创建它并将其传递给构造函数?

如何正确地将@ObservedObject 传递给子视图?我考虑将它传递给 @Bindable 属性,但它不起作用。

我正在通过Button model.isMenuOpen @Published 属性进行更改

4

1 回答 1

2

SwiftUI 在恢复视图的状态(无论是它@State还是@ObservedObject)方面有一些“魔力”。这些状态由 SwiftUI 管理,并在body调用之前恢复。

您的子视图可以进行初始化,但请注意它必须是这样的:

init(foo: Foo) {
    self._foo = ObservedObject(initialValue: foo)
}

您可能还希望您的视图扩展Equatable,以帮助进行差异化。

我在这里写了更多关于状态的奇怪事情https ://samwize.com/2020/04/30/a-few-things-about-state/

于 2020-05-03T01:57:10.090 回答