繁体   English   中英

如何在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM