【问题标题】:SwiftUI get EnvironmentValues of some View given only a reference to the viewSwiftUI 获取某些视图的 EnvironmentValues,仅给出对视图的引用
【发布时间】:2020-03-30 05:27:15
【问题描述】:

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

@Environment(\.isEnabled) var isEnabled

这将使您能够访问EnvironmentValues.isEnabled 字段。

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

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

【问题讨论】:

  • 不太明白你想在哪里使用环境值。 Environment 的定义是“从视图的环境中读取值的动态视图属性。”。我相信它必须在 View 内部,因为它是动态的并且取决于 View 的呈现方式。通过将它们与@Environment(\.KeyPath) 绑定,我们可以将它们用作常规变量。你想存储一个特定的值并传递它吗?
  • @VictorSanchez 了解这方面的背景,请参阅我的另一个问题:stackoverflow.com/questions/59169436

标签: swiftui swiftui-environment


【解决方案1】:

我假设考虑到 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()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2020-08-03
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多