SwiftUI 中的 @EnvironmentObject 和 @Environment 都用于在视图层次结构中传递数据和状态。但它们之间还是有一些区别的。
@EnvironmentObject:
- 使用 @EnvironmentObject 可以将一个类实例作为全局环境对象,在整个 SwiftUI 视图层次结构中传递该对象。这个对象可以在视图层次结构中的任何地方使用。
- 通常情况下,使用 @EnvironmentObject 时,需要先在该环境中创建一个对象,并将其注入到 SwiftUI 应用程序的根视图(如 SceneDelegate)中。
- 在使用 @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:
- 使用 @Environment 只能获取一些特定的环境值,例如 ColorScheme、Locale、LayoutDirection 等。这些环境值是在 SwiftUI 应用程序的根视图中设置的。
- 在使用 @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 只能传递特定的环境值。