Environment 是 SwiftUI 中一个独特而强大的功能,它不仅可以提供系统层面的环境信息,如colorScheme
(颜色模式)、locale
(本地化设置)等,还能获取与特定视图相关的状态,如presentationMode
(控制视图的显示与关闭)。通过合理使用 Environment,可以让视图在保持独立性的同时具备对外部上下文的感知能力,是构建可维护 SwiftUI 应用的重要工具。
通过environment
修饰符可以设置 Environment 的值。
// 设置,第1个参数是KeyPath,第2个参数是对应的值
ContentView().environment(\.colorScheme, .light)
通过@Environment
属性包装可以获取 Environment 的值。
import SwiftUI
struct ContentView: View {
// 获取,参数与设置时的KeyPath一致
@Environment(\.colorScheme) var colorScheme
var body: some View {
Group {
if colorScheme == .dark {
VStack {
Text("Hello")
Text("SwiftUI")
}
}
else {
HStack {
Text("Hello")
Text("SwiftUI")
}
}
}
}
}
Environment 支持自定义,可以创建一个自定义EnvironmentKey
,然后将所需的设置放到EnvironmentValues
中提供给外界使用。步骤如下。
EnvironmentKey
协议,提供默认值。struct ColorKey: EnvironmentKey {
static var defaultValue: Color = .red
}
EnvironmentValues
,提供计算属性,该属性就是使用@Environment
时的参数 KeyPath。extension EnvironmentValues {
var customColor: Color {
get{ self[ColorKey.self] }
set{ self[ColorKey.self] = newValue }
}
}
import SwiftUI
struct ContentView: View {
@Environment(\.customColor) var customColor
var body: some View {
HStack {
Text("Hello")
Text("SwiftUI")
}
.foregroundColor(customColor) // 使用customColor
}
}
// 设置Environment值
ContentView().environment(\.customColor, .blue)
// 编辑模式
@Environment(\.editMode) var editMode
// 颜色模式
@Environment(\.colorScheme) var colorScheme
// 可判断iPhone与iPad
@Environment(\.horizontalSizeClass) var horizontalSizeClass
// 关闭Modal
@Environment(\.presentationMode) var presentationMode
// 系统字体大小
@Environment(\.sizeCategory) private var category
// 本地化
@Environment(\.locale) var locale