SwiftUI @EnvironmentObject @Environment 的区别

8 min read

SwiftUI 中的 @EnvironmentObject 和 @Environment 都用于在视图层次结构中传递数据和状态。但它们之间还是有一些区别的。

@EnvironmentObject:

  1. 使用 @EnvironmentObject 可以将一个类实例作为全局环境对象,在整个 SwiftUI 视图层次结构中传递该对象。这个对象可以在视图层次结构中的任何地方使用。
  2. 通常情况下,使用 @EnvironmentObject 时,需要先在该环境中创建一个对象,并将其注入到 SwiftUI 应用程序的根视图(如 SceneDelegate)中。
  3. 在使用 @EnvironmentObject 时,必须在视图层次结构中通过 @EnvironmentObject 修饰符来声明需要使用该对象的视图。

示例:

class UserSettings: ObservableObject {
    @Published var score = 0
}

struct ContentView: View {
    @EnvironmentObject var settings: UserSettings
    
    var body: some View {
        Text("Score: \(settings.score)")
    }
}

// 在 SceneDelegate 中注入 UserSettings 对象
let contentView = ContentView().environmentObject(UserSettings())

@Environment:

  1. 使用 @Environment 只能获取一些特定的环境值,例如 ColorScheme、Locale、LayoutDirection 等。这些环境值是在 SwiftUI 应用程序的根视图中设置的。
  2. 在使用 @Environment 时,必须在视图层次结构中通过 @Environment 修饰符来声明需要使用的环境值。

示例:

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

    var body: some View {
        if colorScheme == .dark {
            Text("Dark mode")
        } else {
            Text("Light mode")
        }
    }
}

// 在 SceneDelegate 中设置环境值
let contentView = ContentView().environment(\.colorScheme, .dark)

总之,@EnvironmentObject 可以传递任意类型的数据或状态,而 @Environment 只能传递特定的环境值。