SwiftUI-Environment

介绍

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

// 编辑模式
@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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容