SwiftUI - 如何从多个视图访问和更新 @AppStorage var?

问题描述 投票:0回答:1

有没有比通过

@AppStorage
更好的方法来使用
Binding
变量,如下所示?

有没有办法在环境中访问

UserDefaults

struct ContentView: View {
    @AppStorage("darkMode") var darkMode = false

    var body: some View {
            SubView(darkMode: $darkMode)
        }
    }
}

struct SubView: View {
    @Binding var darkMode: Bool
    var body: some View {
        Text("Dark Mode is \(darkMode == true ? "on" : "off")")
    }
}
swiftui property-wrapper appstorage
1个回答
16
投票

通过在不同视图中使用

@AppStorage
,您仍然可以访问相同的
UserDefaults.standard
存储(除非您明确指定
suiteName
)。

这意味着您可以直接在子视图中使用

@AppStorage

struct ContentView: View {
    @AppStorage("darkMode") var darkMode = DefaultSettings.darkMode

    var body: some View {
        VStack {
            Button("Toggle dark mode") {
                self.darkMode.toggle()
            }
            SubView()
        }
        .colorScheme(darkMode ? .dark : .light)
        .preferredColorScheme(darkMode ? .dark : .light)
    }
}

struct SubView: View {
    @AppStorage("darkMode") var darkMode = DefaultSettings.darkMode

    var body: some View {
        Text("Dark Mode is \(darkMode == true ? "on" : "off")")
    }
}

enum DefaultSettings {
    static let darkMode = false
}

注意:默认的

darkMode
值被提取(到
DefaultSettings
枚举),这样您就不会在每个视图中重复
false


或者,您可以将

@AppStorage
直接注入
environment
。参见:

© www.soinside.com 2019 - 2024. All rights reserved.