![](/img/trans.png)
[英]How to share published model between two view models in SwiftUI?
[英]How to share data between models in SwiftUI?
我有一个 EnvironmentObject“用户”,负责登录和获取用户数据。 它在我的应用程序中的所有视图之间共享。 加载用户数据后,应用程序会将视图从“LoginView”更改为“HomeView”。 该用户对象包含数据“userId”。
我有另一个名为“警报”的模型,应该在 HomeView 中初始化。 Alerts 将从服务器获取警报,但它需要来自 User 的 userId 才能实际获取。 如何将这些数据从用户共享到警报?
struct HomeView: View {
@EnvironmentObject var user: User
@ObservedObject var alerts: Alerts
init() {
if let id = user.id {
self.alerts = Alerts(userId: id)
}
}
上面我得到了错误'self' used before all stored properties are initialized
。 我相信这里有一些基本的东西我不了解 SwiftUI 或者我的模型设计有问题(每个模型都能够使用 API 类来调用服务器)。
编辑:我在这里发现了一个类似的问题:
Swiftui - 如何使用环境对象作为参数初始化观察对象?
但是答案(创建嵌套视图)似乎很棘手。 这是 SwiftUI 的意图还是有更合适的模式来实现这一目标?
我找到了两个解决我的问题的方法,并选择了下面列出的第二个。
选项 1:嵌套视图,以便在父视图的主体中初始化“警报”
一个快速的代码片段:
struct HomeView: View {
@EnvironmentObject var user: User
var body: some View {
HomeInternalView(Alerts(userId: user.id))
}
}
struct HomeInternalView: View {
@ObservedObject alerts: Alerts
init(alerts) {
self.alerts = alerts
}
var body: some View {
// ...
}
}
选项 2:使用户成为单身人士
对于我的具体情况,我意识到应用程序中的每个视图以及某些模型(警报)都需要“用户”类。 我现在有一个“UserService”,我可以直接从 Alerts 访问 UserService。
class UserService: ObservableObject {
static let shared:UserService = UserService()
private init() {
// initializations ..
}
}
struct HomeView: View {
@ObservedObject var alerts: Alerts
@ObservedObject private var user = UserService.shared
init() {
self.alerts = Alerts()
}
// ...
}
class Alerts: ObservableObject {
@ObservedObject private var user = UserService.shared
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.