SwiftUI-Environment

介紹

Environment 是 SwiftUI 中一個(gè)獨(dú)特而強(qiáng)大的功能,它不僅可以提供系統(tǒng)層面的環(huán)境信息,如colorScheme(顏色模式)、locale(本地化設(shè)置)等,還能獲取與特定視圖相關(guān)的狀態(tài),如presentationMode(控制視圖的顯示與關(guān)閉)。通過合理使用 Environment,可以讓視圖在保持獨(dú)立性的同時(shí)具備對(duì)外部上下文的感知能力,是構(gòu)建可維護(hù) SwiftUI 應(yīng)用的重要工具。

設(shè)置

通過environment修飾符可以設(shè)置 Environment 的值。

// 設(shè)置,第1個(gè)參數(shù)是KeyPath,第2個(gè)參數(shù)是對(duì)應(yīng)的值
ContentView().environment(\.colorScheme, .light)

獲取

通過@Environment屬性包裝可以獲取 Environment 的值。

import SwiftUI

struct ContentView: View { 
    // 獲取,參數(shù)與設(shè)置時(shí)的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 支持自定義,可以創(chuàng)建一個(gè)自定義EnvironmentKey,然后將所需的設(shè)置放到EnvironmentValues中提供給外界使用。步驟如下。

  • 遵守EnvironmentKey協(xié)議,提供默認(rèn)值。
struct ColorKey: EnvironmentKey {
    static var defaultValue: Color = .red
}
  • 擴(kuò)展EnvironmentValues,提供計(jì)算屬性,該屬性就是使用@Environment時(shí)的參數(shù) 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 
    }
}
// 設(shè)置Environment值
ContentView().environment(\.customColor, .blue)

常見Environment

// 編輯模式
@Environment(\.editMode) var editMode
// 顏色模式
@Environment(\.colorScheme) var colorScheme
// 可判斷iPhone與iPad
@Environment(\.horizontalSizeClass) var horizontalSizeClass
// 關(guān)閉Modal
@Environment(\.presentationMode) var presentationMode
// 系統(tǒng)字體大小
@Environment(\.sizeCategory) private var category
// 本地化
@Environment(\.locale) var locale
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容