【问题标题】:What's the purpose of .environmentObject() view operator vs @EnvironmentObject?.environmentObject() 视图运算符与 @EnvironmentObject 的目的是什么?
【发布时间】:2020-04-26 12:19:11
【问题描述】:

我正试图从这里众所周知的新手深渊中爬出来。

我开始掌握 @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 的使用。
我因缺少“设置”定义而出现编译错误。

但是,如果没有 .environmentObject 运算符,代码可以正常运行。

所以我的问题是,为什么有 .environmentObject 运算符?

.environmentObject() 是实例化一个 environmentObject 而不是 @environmentObject 访问实例化的对象?

【问题讨论】:

  • .environmentObject(settings) 用于视图链中的自定义视图。这里 ZStack 不支持任何 (@EnvironmentObject var) 作为其变量。
  • 那么苹果应该已经从可用的运算符中过滤掉了。

标签: swiftui swiftui-environment


【解决方案1】:

这里是显示EnvironmentObject.environmentObject 用法变体的演示代码(内联cmets):

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 修饰符。

【讨论】:

  • 我收到运行时错误:线程 1:致命错误:未找到设置类型的 ObservableObject。设置的 View.environmentObject(_:) 作为该视图的祖先可能会丢失。 ---这是用 Struct View1 标记的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 2022-08-03
  • 1970-01-01
相关资源
最近更新 更多