EnvironmentObject в SwiftUI - PullRequest
       33

EnvironmentObject в SwiftUI

1 голос
/ 08 июня 2019

Насколько мне известно, я должен иметь возможность использовать 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

1 Ответ

1 голос
/ 08 июня 2019

Из документов Apple EnvironmentObject :

EnvironmentObject Свойство динамического представления, в котором используется привязываемый объект, предоставленный представлением предка, для аннулирования текущего представления при каждом изменении связываемого объекта.

Это означает, что привязка влияет на текущую иерархию представлений.Я предполагаю, что когда вы представляете новое представление через PresentationButton, вы создаете новую иерархию, которая не имеет корня в вашем представлении - той, которой вы предоставили объект.Я предполагаю, что обходной путь здесь - добавить объект в «глобальную» среду путем реализации структуры, которая подтверждает протокол EnvironmentKey.

...