swiftUI-@Environment的作用
@Environment
是 SwiftUI 中的一个属性包装器,用于从环境中读取共享的数据。环境(Environment)是一个全局的、可以在视图层次结构中传递的值集合。通过使用 @Environment
,你可以在视图中访问这些共享的环境值,而不需要显式地传递它们。
@Environment
的常见用途包括访问系统提供的环境值(如颜色方案、字体、尺寸类别等),以及自定义的环境值。
以下是 @Environment
的一些常见用途和示例:
访问系统提供的环境值
import SwiftUI
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
Text("当前颜色方案是 \(colorScheme == .dark ? "暗色模式" : "亮色模式")")
.padding()
.background(colorScheme == .dark ? Color.black : Color.white)
.foregroundColor(colorScheme == .dark ? Color.white : Color.black)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
在这个示例中,@Environment(\.colorScheme)
用于访问当前的颜色方案(亮色模式或暗色模式),并根据颜色方案动态调整视图的背景色和前景色。
自定义环境值
你还可以创建和使用自定义的环境值。首先,定义一个环境键和默认值:
import SwiftUI
struct CustomEnvironmentKey: EnvironmentKey {
static let defaultValue: String = "默认值"
}
extension EnvironmentValues {
var customValue: String {
get { self[CustomEnvironmentKey.self] }
set { self[CustomEnvironmentKey.self] = newValue }
}
}
然后,在视图中使用 @Environment
访问自定义的环境值:
struct ContentView: View {
@Environment(\.customValue) var customValue
var body: some View {
Text("自定义环境值: \(customValue)")
.padding()
}
}
struct ParentView: View {
var body: some View {
ContentView()
.environment(\.customValue, "新的自定义值")
}
}
struct ParentView_Previews: PreviewProvider {
static var previews: some View {
ParentView()
}
}
在这个示例中,我们定义了一个自定义的环境键 CustomEnvironmentKey
和一个扩展 EnvironmentValues
来添加 customValue
属性。然后,我们在 ParentView
中使用 .environment
修饰符来设置自定义的环境值,并在 ContentView
中通过 @Environment
访问这个值。
通过使用 @Environment
,你可以在视图层次结构中方便地共享和访问全局数据,而不需要显式地传递这些数据。