简体   繁体   English

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

[英]How to pass a value from an EnvironmentObject to a class instance in SwiftUI?

I'm trying to assign the value from an EnvironmentObject called userSettings to a class instance called categoryData , I get an error when trying to assign the value to the class here ObserverCategory(userID: self.userSettings.id)我试图分配值从EnvironmentObject叫userSettings到名为类的实例categoryData ,试图将值赋给类这里的时候,我得到一个错误ObserverCategory(userID: self.userSettings.id)

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

Here's my code:这是我的代码:

This is my class for the environment object:这是我的环境对象类:

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

And next is the code where I'm trying to assign its values:接下来是我试图分配其值的代码:

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

            }
        }
    }
}

Can somebody guide me to solve this error?有人可以指导我解决这个错误吗?

Thanks谢谢

Because the @EnvironmentObject and @ObservedObject are initializing at the same time.因为@EnvironmentObject@ObservedObject同时初始化。 So you cant use one of them as an argument for another one.因此,您不能将其中一个用作另一个的论据。

You can make the ObservedObject more lazy.你可以让ObservedObject更懒惰。 So you can associate it the EnvironmentObject when it's available.因此,您可以在它可用时将其与EnvironmentObject相关联。 for example:例如:

struct CategoryView: View {

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

    var body: some View { ,,, }
}

Then pass it like:然后像这样传递它:

struct ContentView: View {

    //user settings
    @EnvironmentObject var userSettings: UserSettings

    var body: some View {
        CategoryView(categoryData: ObserverCategory(userID: userSettings.id))
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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