swiftUI-@Environment的作用

Aliancn發表於2024-08-25

@Environment 是 SwiftUI 中的一個屬性包裝器,用於從環境中讀取共享的資料。環境(Environment)是一個全域性的、可以在檢視層次結構中傳遞的值集合。透過使用 @Environment,你可以在檢視中訪問這些共享的環境值,而不需要顯式地傳遞它們。

@Environment 的常見用途包括訪問系統提供的環境值(如顏色方案、字型、尺寸類別等),以及自定義的環境值。

以下是 @Environment 的一些常見用途和示例:

訪問系統提供的環境值

import SwiftUI

struct ContentView: View {
    @Environment(\.colorScheme) var colorScheme

    var body: some View {
        Text("當前顏色方案是 \(colorScheme == .dark ? "暗色模式" : "亮色模式")")
            .padding()
            .background(colorScheme == .dark ? Color.black : Color.white)
            .foregroundColor(colorScheme == .dark ? Color.white : Color.black)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

在這個示例中,@Environment(\.colorScheme) 用於訪問當前的顏色方案(亮色模式或暗色模式),並根據顏色方案動態調整檢視的背景色和前景色。

自定義環境值

你還可以建立和使用自定義的環境值。首先,定義一個環境鍵和預設值:

import SwiftUI

struct CustomEnvironmentKey: EnvironmentKey {
    static let defaultValue: String = "預設值"
}

extension EnvironmentValues {
    var customValue: String {
        get { self[CustomEnvironmentKey.self] }
        set { self[CustomEnvironmentKey.self] = newValue }
    }
}

然後,在檢視中使用 @Environment 訪問自定義的環境值:

struct ContentView: View {
    @Environment(\.customValue) var customValue

    var body: some View {
        Text("自定義環境值: \(customValue)")
            .padding()
    }
}

struct ParentView: View {
    var body: some View {
        ContentView()
            .environment(\.customValue, "新的自定義值")
    }
}

struct ParentView_Previews: PreviewProvider {
    static var previews: some View {
        ParentView()
    }
}

在這個示例中,我們定義了一個自定義的環境鍵 CustomEnvironmentKey 和一個擴充套件 EnvironmentValues 來新增 customValue 屬性。然後,我們在 ParentView 中使用 .environment 修飾符來設定自定義的環境值,並在 ContentView中透過 @Environment 訪問這個值。

透過使用 @Environment,你可以在檢視層次結構中方便地共享和訪問全域性資料,而不需要顯式地傳遞這些資料。