SwiftUI ObservableObject и @ObservedObject не сохраняют состояние
У меня такой код:
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
1 ответ
В 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/