Какова цель .environmentObject () оператор представления против @EnvironmentObject? - PullRequest
1 голос
/ 09 января 2020

Я пытаюсь выползти отсюда из бездны неофитов.

Я начинаю gr asp использовать @EnvironmentObject, пока не увижу оператор представления .environmentObject () в документах.

Вот мой код:

import SwiftUI

struct SecondarySwiftUI: View {
    @EnvironmentObject var settings: Settings

    var body: some View {
        ZStack {
            Color.red
            Text("Chosen One: \(settings.pickerSelection.name)")
        }.environmentObject(settings) //...doesn't appear to be of use.
    }

    func doSomething() {}
}

Я попытался заменить использование @EnvironmentObject оператором .environmentObject () в представлении. Я получил ошибку компиляции из-за отсутствия настроек «def».

Однако код работает нормально без оператора .environmentObject.

Итак, мой вопрос, зачем нужен оператор .environmentObject?

Создает ли .environmentObject () экземпляр environmentObject, а @environmentObject получает доступ к созданному объекту?

1 Ответ

2 голосов
/ 09 января 2020

Вот демонстрационный код для демонстрации вариантов использования EnvironmentObject & .environmentObject (с комментариями в строке):

struct RootView_Previews: PreviewProvider {
    static var previews: some View {
        RootView().environmentObject(Settings()) // environment object injection
    }
}

class Settings: ObservableObject {
    @Published var foo = "Foo"
}

struct RootView: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object

    @State private var showingSheet = false
    var body: some View {
        VStack {
            View1() // environment object injected implicitly as it is subview
            .sheet(isPresented: $showingSheet) {
                View2() // sheet is different view hierarchy, so explicit injection below is a must
                    .environmentObject(self.settings) // !! comment this out and see run-time exception
            }
            Divider()
            Button("Show View2") {
                self.showingSheet.toggle()
            }
        }
    }
}

struct View1: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object
    var body: some View {
        Text("View1: \(settings.foo)")
    }
}

struct View2: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object
    var body: some View {
        Text("View2: \(settings.foo)")
    }
}

Итак, в вашем коде ZStack не объявляет потребности объекта среды, поэтому нет использование модификатора .environmentObject.

...