美文网首页SwiftUI
SwiftUI中@EnvironmentObject的使用

SwiftUI中@EnvironmentObject的使用

作者: 喔牛慢慢爬 | 来源:发表于2024-02-05 10:13 被阅读0次

    @EnvironmentObjectSwiftUI中的一个属性包装器,用于在整个视图层级中传递和共享一个遵循 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())
    通过这种方式,你可以在多个视图间轻松共享和管理全局状态,并且随着状态的变化自动更新关联的视图。
    
    • 总结
    1. @EnvironmentObject 允许你在整个视图层级中传递和共享一个遵循 ObservableObject 协议的对象,而不需要通过视图之间的层层传递。
    2. 只要对象在视图层次结构的某个顶级位置被设置到环境中,那么任何子视图都可以通过 @EnvironmentObject 访问到该对象,并对其中@Published 属性的变化做出响应。
    3. 生命周期:环境对象的存在期一般比单个视图更长,可以通过 SceneDelegate 或者 App 结构体中的 .environmentObject(_:) 方法注入到应用的全局环境中。当不再需要环境对象时,应在其所在的场景(如窗口)被销毁前显式地移除它。

    相关文章

      网友评论

        本文标题:SwiftUI中@EnvironmentObject的使用

        本文链接:https://www.haomeiwen.com/subject/cbdqadtx.html