我有一个视图正在从上一个视图接收ID值。我还需要获取该ID值并将其传递给ObservableObject,以便可以对该ID运行Firestore查询。我不知如何为我的ObservableObject获取该ID。
conda 4.7.12
因此,在查询调用中,我需要根据视图顶部定义的值来调用ItemID值进行查询。
答案 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
传递。