@EnvironmentObject
是SwiftUI
中的一个属性包装器,用于在整个视图层级中传递和共享一个遵循 ObservableObject
协议的对象。这个对象的任何属性如果使用了 @Published
标注,则当这些属性值发生变化时,所有依赖于该对象的视图都会收到通知并重新渲染。
- 要使用
@EnvironmentObject
,首先需要创建一个遵循ObservableObject
的类,并在其中定义需要响应式更新的属性:
class UserSettings: ObservableObject {
@Published var userName: String = "John Doe"
// 其他可响应变化的属性...
}
然后,在应用启动的地方(如:SceneDelegate
对于 iOS 或者 macOS 应用),将 UserSettings
实例添加到环境对象中:
// 在 SceneDelegate.swift 中(iOS)
let _userSettings = UserSettings()
scene.environmentObject(_userSettings)
接着,在需要访问此环境对象的视图中使用 @EnvironmentObject
注解:
struct ContentView: View {
@EnvironmentObject var userSettings: UserSettings
var body: some View {
VStack {
Text("Hello, \(userSettings.userName)!")
}
}
}
// 如果 ContentView 从其他地方被引用,请确保环境对象已传入:
ContentView().environmentObject(UserSettings())
通过这种方式,你可以在多个视图间轻松共享和管理全局状态,并且随着状态的变化自动更新关联的视图。
- 总结
-
@EnvironmentObject
允许你在整个视图层级中传递和共享一个遵循ObservableObject
协议的对象,而不需要通过视图之间的层层传递。 - 只要对象在视图层次结构的某个顶级位置被设置到环境中,那么任何子视图都可以通过
@EnvironmentObjec
t 访问到该对象,并对其中@Published
属性的变化做出响应。 - 生命周期:环境对象的存在期一般比单个视图更长,可以通过 SceneDelegate 或者 App 结构体中的
.environmentObject(_:)
方法注入到应用的全局环境中。当不再需要环境对象时,应在其所在的场景(如窗口)被销毁前显式地移除它。
网友评论