环境(一) – 从环境中读取

温馨提示:本文最后更新于2024-07-10 09:33:48,某些文章具有时效性,若有错误或已失效,请在下方留言

环境 (environment) 本质上,它是⼀种内置的依赖注⼊ (dependency injection) 技术。

下⾯这个例⼦中,当我们在 VStack 上设置字体时,它会传播到两个 Text 视图中去,并改变它们的外观:

Font 修饰符示例
Font 修饰符示例

在视图树中,我们可以看到 .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 都会被重新渲染。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容