在ObserveObject数组(swift)上使用scrollview时出现重复键错误

在ObserveObject数组(swift)上使用scrollview时出现重复键错误,swift,xcode,swiftui,Swift,Xcode,Swiftui,我正在使用以下代码显示firestore数据库中的消息: struct ChatView: View { @ObservedObject var chatModel = ChatsViewModel() var body: some View { VStack { ScrollView { ScrollViewReader {sp in

我正在使用以下代码显示firestore数据库中的消息:

struct ChatView: View {
            
    @ObservedObject var chatModel = ChatsViewModel()
           
    var body: some View {
        VStack {
            ScrollView {
                ScrollViewReader {sp in
                    VStack{
                        ForEach(self.chatModel.messages, id: \.self) { message in
                            MessageView(message: message).id(message)
                        }
                    }
                    .onChange(of: chatModel.messages.count) { newValue in
                        guard !chatModel.messages.isEmpty else {return}
                        withAnimation{
                            sp.scrollTo(self.chatModel.messages.last)
                        }
                    }
                }
            }
            TextField("Message", text: $message)
            Button(action: {
                self.chatModel.addMessage(message: Message(userId: user1, text: message, time: self.chatModel.generateCurrentTimeStamp()))
                message = ""
                print("button messageId \(messageId)")
            }) {
                Text("Send")
            }
        }
        .onAppear {
            chatModel.getChats(user1: user1, user2: user2)
        }
    }
}
当我不使用scrollview时,代码可以工作。我可以运行两个模拟器,它们相互“交谈”。但是,当我包含scrollview代码时,我得到
线程1:致命错误:在字典中发现了重复的'Message'类型的键。
为什么会发生此错误,我可以做些什么来修复它

相关viewModel代码如下所示:

@published var messages = [Message]()

    func getChats(user1: String, user2: String) {
            let group = DispatchGroup()
            
            group.enter()
            self.getDocId(user1: user1, user2: user2, group: group)
                
            group.notify(queue: DispatchQueue.main, execute: {
                self.fetchChats()
            })
        }

    func addMessage(message: Message) {
        do{
            let _ = try db.collection("Chats").document(self.docId).collection("messages").addDocument(from: message)
            print("message sent")
        } catch {
            print(error)
        }
    }
    
    func fetchChats() {
        let ref = db.collection("Chats").document(self.docId)
        ref.collection("messages").order(by: "time").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else {
                print("No documents")
                return
            }
            
            self.messages = documents.compactMap { (queryDocumentSnapshot) -> Message? in
                
                return try? queryDocumentSnapshot.data(as: Message.self)
            }
        }
    }
这是一条信息:

struct Message: Codable, Identifiable, Hashable {
    var id: String? = UUID().uuidString
    @DocumentID var documentId: String?
    var userId: String
    var text: String
    var time: String
    
    init(documentId: String = "",
         userId: String = "",
         text: String = "",
         time: String = "") {
        self.documentId = documentId
        self.userId = userId
        self.text = text
        self.time = time
    }
        
    enum CodingKeys: String, CodingKey {
        case documentId
        case userId
        case text
        case time
    }
}

您的邮件是可识别的,因此请尝试在需要的地方使用其
id
,如下所示

VStack{
    ForEach(self.chatModel.messages) { message in
        MessageView(message: message).id(message.id)
    }
}

你能出示你的
信息声明吗
?我刚刚编辑了这篇文章