2024-07-10 09:33:48
,某些文章具有时效性,若有错误或已失效,请在下方留言。环境 (environment
) 本质上,它是⼀种内置的依赖注⼊ (dependency injection) 技术。
下⾯这个例⼦中,当我们在 VStack 上设置字体时,它会传播到两个 Text 视图中去,并改变它们的外观:

在视图树中,我们可以看到 .font
修饰器被转换成了⼀个带有 Font?
值的 EnvironmentKeyWritingModifier
。
.environment(_:value:)
API 的第⼀个参数是 EnvironmentValues
中的⼀个键路径 (key path),我们不妨将整个环境想象成某种存储了所有环境值的字典。
环境是 SwiftUI 中⽤来将值沿着视图树向下传递的机制。 在我们的例⼦中,这意味着在 EnvironmentKeyWritingModi!er 之下的所有视图 (也就是 VStack 和两个 Text 视图) 都可以从我们指定的环境中读取到字体值。从 EnvironmentKeyWritingModifier
往上的视图,以及那些视图树中不在这个分⽀的视图,则看不到我们在这⾥设置的⾃定义值。

与 EnvironmentKeyWritingModifier 并列层级的 Text 仍然显示了默认字体,⽽在 VStack 内部的两个 Text 则使⽤了⼤号的标题字体。
我们可以将环境想象为⼀个带有键和值的字典,它从视图树的根部⼀直向下传递到叶⼦节点。在视图树的任意位置上,我们都可以通过写⼊环境的⽅式来改变某个键的对应值 (就像我们使⽤ .font 修饰器时所做的那样)。之后,位于这个环境写⼊修饰器下⽅的⼦树将接受到修改后的环境。
从环境中读取
我们可以使⽤ @Environment
属性包装来从环境中读取⼀个值。这让我们可以访问环境中特定的值,也让我们可以观察这个值的变更。当区域设置发⽣变化的时候,它通过环境进⾏传播,所有读取了当前环境的视图都会被重新渲染。
struct ContentView: View {
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
var body: some View {
HStack {
Text("Hello")
if dynamicTypeSize < .large {
Image(systemName: "hand.wave")
}
}
}
}
每当动态类型尺⼨变化时,ContentView 都会被重新渲染。
暂无评论内容