我正在从Firestore读取数据并将其解析为自定义模型Thought

对于我的Firestore集合中的每个文档,我将一个新的Thought对象附加到@Published var thoughts

struct Thought: Identifiable {

    public var id: String?
    public var name: String
    public var thought: String
    public var color: String
}

class Observer: ObservableObject {

    @Published var thoughts = [Thought]()

    init(){
        let db = Firestore.firestore()

        db.collection("thoughts")
        .addSnapshotListener { querySnapshot, error in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }

            for document in documents {

                var thoughtModel = Thought(id: "", name: "", thought: "", color: "")

                thoughtModel.name = document.data()["name"] as! String
                thoughtModel.thought = document.data()["thought"] as! String
                thoughtModel.color = document.data()["color"] as! String

                self.thoughts.append(thoughtModel)
            }
            print(self.thoughts) //PRINTS 4 DIFFERENT THOUGHT OBJECTS
        }
    }
}

struct ThoughtsView: View {

    @ObservedObject var observer = Observer()

    var body: some View {
        VStack {
            List {
                ForEach(self.observer.thoughts) { thought in

                    ThoughtCard(color: thought.color,
                                thought: thought.thought,
                                name: thought.name)
                    //HERE I GET THE SAME CARD 4 TIMES INSTEAD OF 4 DIFFERENT CARDS
                }
            }
        }
    }
}


当我打印thoughts时,我会看到Firestore数据库中当前包含的所有4个文档。但是,当我尝试遍历列表中的thoughts时,相同的Thought对象仅4次,而不是4个不同的Thought对象。

我认为问题出在List以及我如何遍历self.observer.thoughts,但是我不确定自己在做什么错。如何用self.observer.thoughts中的4个对象填充列表?

最佳答案

我的清单确实存在问题。一旦添加了id:参数,看起来List就能够识别每个Thought对象并相应地显示它们。

struct ThoughtsView: View {

    @ObservedObject var observer = Observer()

    var body: some View {
        VStack {
            List {
                ForEach(self.observer.thoughts, id: \.name) { thought in

                    ThoughtCard(color: thought.color,
                                thought: thought.thought,
                                name: thought.name)
                }
            }
        }
    }
}

10-05 19:07