如何将值从 EnvironmentObject 传递到 SwiftUI 中的类实例?

Lor*_*o R 8 swift swiftui swift5.1

我正在尝试将来自 EnvironmentObject 的值分配给名为userSettings的类实例categoryData,尝试将值分配给此处的类时出现错误ObserverCategory(userID: self.userSettings.id)

错误说: Cannot use instance member 'userSettings' within property initializer; property initializers run before 'self' is available

这是我的代码:

这是我的环境对象类:

//user settings
final class UserSettings: ObservableObject {
    @Published var name : String = String()
    @Published var id : String = "12345"
}
Run Code Online (Sandbox Code Playgroud)

接下来是我试图分配其值的代码:

//user settings
@EnvironmentObject var userSettings: UserSettings

//instance of observer object
@ObservedObject var categoryData = ObserverCategory(userID: userSettings.id)

class ObserverCategory : ObservableObject {

    let userID : String

    init(userID: String) {

        let db = Firestore.firestore().collection("users/\(userID)/categories") //

        db.addSnapshotListener { (snap, err) in
            if err != nil {
                print((err?.localizedDescription)!)
                return
            }

            for doc in snap!.documentChanges {

                //code 

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以指导我解决这个错误吗?

谢谢

Moj*_*ini 8

因为@EnvironmentObject@ObservedObject正在同时初始化。因此,您不能将其中一个用作另一个的论据。

你可以做得ObservedObject更懒惰。所以你可以EnvironmentObject在它可用时将它关联起来。例如:

struct CategoryView: View {

    //instance of observer object
    @ObservedObject var categoryData: ObserverCategory

    var body: some View { ,,, }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样传递它:

struct ContentView: View {

    //user settings
    @EnvironmentObject var userSettings: UserSettings

    var body: some View {
        CategoryView(categoryData: ObserverCategory(userID: userSettings.id))
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨@Mojtaba Hosseini,谢谢您的回答,它完全有意义并且工作完美。我正在学习,这对我帮助很大,感谢您的帮助! (4认同)