从 SwiftUI 中的环境值获取绑定

the*_*een 2 swiftui

我的环境值如下:

@Environment(\.isPresented) var isPresented: Bool
Run Code Online (Sandbox Code Playgroud)

该环境值定义如下:

private struct IsPresented: EnvironmentKey {
    static let defaultValue: Bool = false
}

extension EnvironmentValues {
    var isPresented: Bool {
        get { self[IsPresented.self] }
        set { self[IsPresented.self] = newValue }
    }
}

extension View {
    func isPresented(_ isPresented: Bool) -> some View {
        environment(\.isPresented, isPresented)
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在我的一个视图中读取此环境值,以决定是否将视图显示为全屏。然而,这行代码不起作用:

.fullScreenCover(isPresented: self.$isPresented) {
// It says there's no such member in my view.
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是,由于 .fullScreenCover 需要绑定,因此如何将环境值转换为绑定?

jn_*_*pdx 10

如果你希望它是一个可写值,我认为你的环境值应该是Binding<Bool>而不是仅仅BoolpresentationMode例如,这就是系统的工作原理。

private struct IsPresented: EnvironmentKey {
    static let defaultValue: Binding<Bool> = .constant(false)
}

extension EnvironmentValues {
    var isPresented: Binding<Bool> {
        get { self[IsPresented.self] }
        set { self[IsPresented.self] = newValue }
    }
}

extension View {
    func isPresented(_ isPresented: Binding<Bool>) -> some View {
        environment(\.isPresented, isPresented)
    }
}

struct ContentView : View {
    @State private var isPresented = false
    
    var body: some View {
        ChildView().environment(\.isPresented, $isPresented)
    }
}

struct ChildView : View {
    @Environment(\.isPresented) var isPresented: Binding<Bool>
    
    var body: some View {
        Button("Test") {
            isPresented.wrappedValue = true
        }
        .fullScreenCover(isPresented: isPresented) {
            Text("Sheet")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)