2

根据我的理解,如果你自己定义一个视图(作为一个实现的结构View),那么你可以将一些 var 声明为环境变量,如下所示:

@Environment(\.isEnabled) var isEnabled

这将使您可以访问该EnvironmentValues.isEnabled字段。

但是,这似乎只能在视图定义本身内实现。

给定一些视图v,是否有可能获取该视图的环境对象?或获得特定的环境值?

4

1 回答 1

2

我假设考虑到 SwiftUI 是反应式状态管理框架,那么是的,您不能直接要求内部视图环境值,实际上是因为您无法确定何时为该特定视图设置了该环境。但是,您可以要求该视图告诉您它的内部状态,当视图肯定知道它时......通过绑定。

示例代码(有点奇怪,但仅用于演示)如何做到这一点见下文。

struct SampleView: View {
    @Environment(\.isEnabled) private var isEnabled

    var myState: Binding<Bool>?

    var body: some View {
        VStack {
            Button(action: {}) { Text("I'm \(isEnabled ? "Enabled" : "Disabled")") }
            report()
        }
    }

    func report() -> some View {
        DispatchQueue.main.async {
            self.myState?.wrappedValue = self.isEnabled
        }
        return EmptyView()
    }
}

struct TestEnvironmentVar: View {

    @State private var isDisabled = false
    @State private var sampleState = true

    var body: some View {
        VStack {
            Button(action: {
                self.isDisabled.toggle()
            }) {
                Text("Toggle")
            }
            Divider()
            sampleView()
                .disabled(isDisabled)
        }
    }

    private func sampleView() -> some View {
        VStack {
            SampleView(myState: $sampleState)
            Text("Sample is \(sampleState ? "Enabled" : "Disabled")")
        }
    }
}


struct TestEnvironmentVar_Previews: PreviewProvider {
    static var previews: some View {
        TestEnvironmentVar()
    }
}
于 2019-12-05T13:18:27.447 回答