在ObserveObject数组(swift)上使用scrollview时出现重复键错误
我正在使用以下代码显示firestore数据库中的消息:在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
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)
}
}
你能出示你的
信息声明吗
?我刚刚编辑了这篇文章