Насколько мне известно, я должен иметь возможность использовать EnvironmentObject для наблюдения и доступа к данным модели из любого представления в иерархии. У меня есть представление, как это, где я отображаю список из массива, который находится в LinkListStore. Когда я открываю AddListView и добавляю элемент, он корректно обновляет ListsView с добавленным элементом. Однако, если я использую PresentationButton для представления, я должен сделать AddListView (). EnvironmentObject (listStore), в противном случае произойдет сбой при показе AddListView. Правильно ли мое основное предположение (а это поведение, скорее всего, ошибка) или я неправильно понимаю использование EnvironmentObject?
В основном: @State для привязки переменной к представлению в том же представлении (например, $ text to TextField), @ ObjectBinding / BindableObject для привязки переменных к другим представлениям и EnvironmentObject для выполнения того же действия, что и @ObjectBinding, но без передачи хранить объект каждый раз. При этом я должен иметь возможность добавлять новые элементы в массив из нескольких представлений и при этом корректно обновлять представление списков? В противном случае я не получаю разницы между ObjectBinding и EnvironmentObject.
struct ListsView : View {
@EnvironmentObject var listStore: LinkListStore
var body: some View {
NavigationView {
List {
NavigationButton(destination: AddListView()) {
HStack {
Image(systemName: "plus.circle.fill")
.imageScale(.large)
Text("New list")
}
}
ForEach(listStore.lists) { list in
HStack {
Image(systemName: "heart.circle.fill")
.imageScale(.large)
.foregroundColor(.yellow)
Text(list.title)
Spacer()
Text("\(list.linkCount)")
}
}
}.listStyle(.grouped)
}
}
}
#if DEBUG
struct ListsView_Previews : PreviewProvider {
static var previews: some View {
ListsView()
.environmentObject(LinkListStore())
}
}
#endif