@Environment 是视图用于从环境中读取、响应、调用特定值的属性包装器。它允许视图访问由 SwiftUI 或应用环境提供的数据、实例或方法,例如颜色模式、字体设置等。系统会自动提供这些值,并根据需要进行调整。
应用场景
- 当需要访问和响应如界面样式(暗模式/亮模式)、设备方向、字体大小等由系统或上层视图提供的环境值时( 通常对应值类型)。
- 当需要访问和调用 SwiftData 的 ModelContext 时(对应引用类型)。
- 当需要使用系统提供的一些方法时,比如
dismiss
、openURL
( 通过 struct 的callAsFunction
封装的方法 )。
使用示例
下面是一个使用 @Environment 属性包装器的示例代码:我们使用 @Environment(.colorScheme) 将 colorScheme属性声明为从环境中获取当前的颜色方案。根据颜色方案的值,我们设置不同的文本颜色和背景色。你可以尝试切换模拟器的外观(Light 或 Dark),以查看文本颜色和背景色是如何自动根据环境变量的值而更新的。
import SwiftUI
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
if colorScheme == .dark {
Text("Dark Mode")
.foregroundColor(.white)
.background(Color.black)
} else {
Text("Light Mode")
.foregroundColor(.black)
.background(Color.white)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.previewLayout(.sizeThatFits)
}
}