SwiftUI-将变量传递给可观察对象

时间:2020-03-26 13:25:49

标签: firebase google-cloud-firestore swiftui

我有一个视图正在从上一个视图接收ID值。我还需要获取该ID值并将其传递给ObservableObject,以便可以对该ID运行Firestore查询。我不知如何为我的ObservableObject获取该ID。

conda 4.7.12

因此,在查询调用中,我需要根据视图顶部定义的值来调用ItemID值进行查询。

2 个答案:

答案 0 :(得分:3)

我认为您的getItemsData类应该继承自ObservableObject

class GetItemsData: ObservableObject {...}

要将itemId放入GetItemsData实例中,可以将参数添加到init()

class GetItemsData: ObservableObject {
    init(itemId: String) {
        ...
    }
}

}

要将它们捆绑在一起,您有两种选择。您可以将init添加到您的ItemView中,例如:

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData
    init(itemName: String, itemID: String) {
        self.itemName = itemName
        itemModel = GetItemsData(itemId: itemID)
    }
}

我宁愿将可观察对象传递到视图中,所以它更像是MVVM中的视图模型

struct ItemView: View {
    let itemName: String
    let itemModel: GetItemsData

答案 1 :(得分:0)

如果您的ObservableObject具有任何状态或不在顶级视图中,则@tomcully方式将在每次父视图更新时实例化它。

此外,如果您在init()中调用api,则会进行许多不必要的api调用。

您可以这样做:

struct ItemView: View {
   var itemName: String
   var itemID: String
   @ObservedObject var items = getItemsData()
   var body: some View {
     ...
    .onAppear {
      items.setID(itemID)
    }
  }
}
class getItemsData: ObservedObject {
    let db = Firestore.firestore()
    @Published var data = [items]()
    var itemID: String = ""
    
    func setID(_ id: String) {
        if itemID != id {
            itemID = id
            db.collection("items").whereField("itemID", isEqualTo: itemID),addSnapshotListner {(snap, err) in ...
            }
        }
    }
}

注意:,但即使采用上述方法,也无法避免在每次父视图更新时实例化ObservableObject,因此,如果不想这样做,可以使用@StateObject(仅ios 14或更高版本),或者您可以在其他视图中实例化ObservableObject并将其作为@environmentObject传递。