如何在SwiftUI中共享模型之间的数据



我有一个EnvironmentObject"用户";负责登录和获取用户数据。它在我的应用程序中的所有视图之间共享。一旦加载了用户数据;登录视图";至";主页视图"这个用户对象包含数据";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-如何使用environmentobject作为参数初始化observedObject?

但答案(创建嵌套视图(似乎很难。这是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:将用户设为单例

对于我的具体案例,我意识到;用户";应用程序中的每个视图以及某些模型(警报(都需要模型。因此,我现在不再将环境对象传递给每个视图,而是使用";用户服务";我可以直接从Alerts访问UserService。

根据这个Stack Overflow问题,如果应用程序中的每个视图都需要一个模型,那么使用singleton是可以接受的。

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
// ...
}

最新更新