SwiftUI 如何使用 @EnvironmentObject 在视图之间共享数据? 代码演示

17 min read

下面是一个简单的演示代码:

首先,我们需要创建一个 ObservableObject 类,使用 @Published 特性来发布数据变化:

class UserData: ObservableObject {
    @Published var name = "John"
    @Published var age = 25
}

然后,在需要共享数据的视图上,使用 @EnvironmentObject 来获取 UserData 实例:

struct ContentView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        VStack {
            Text(userData.name)
            Text("\(userData.age) years old")
        }
    }
}

SceneDelegate 中,我们需要将 UserData 实例添加到环境中:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    var window: UIWindow?
    let userData = UserData()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        let contentView = ContentView().environmentObject(userData)

        // ... 省略其他代码
    }
}

这样,我们就可以在视图之间共享数据了。在另一个视图中也可以使用 @EnvironmentObject 来获取 UserData 实例并显示数据。数据的改变会自动更新到所有订阅这个实例的视图。