firebase - 聊天视图中的重复消息。如何清除视图?
问题描述
- 我有一个带有 chatRow 视图(消息)列表的 chatView
- 每个 chatView 都有一个带有 firebase 的快照监听器,所以如果我向对话中添加新消息,我应该得到实时更新
我遇到的问题是:当我添加一条新消息时,我的 chatView 显示我之前添加的所有消息加上新消息,再次加上相同的列表....如果我添加另一条消息,则列表再次重复
我假设我需要删除/刷新 Foreach 循环中显示的先前视图...如何删除/刷新视图以便它可以接收刷新的非重复数据?
struct ChatView: View {
@EnvironmentObject var chatModel: ChatsViewModel
let chat: Conversation
let user = UserService.shared.user
@State var messagesSnapshot = [Message]()
@State var newMessageInput = ""
var body: some View {
NavigationView {
VStack {
ScrollViewReader { scrollView in
ScrollView {
ForEach(chat.messages, id: \.id) { message in
if user.name == message.createdBy {
ChatRow(message: message, isMe: true)
} else {
ChatRow(message: message, isMe: false)
}
}
.onAppear(perform: {scrollView.scrollTo(chat.messages.count-1)})
}
}
Spacer()
//send a new message
ZStack {
Rectangle()
.foregroundColor(.white)
RoundedRectangle(cornerRadius: 20)
.stroke(Color("LightGrayColor"), lineWidth: 2)
.padding()
HStack {
TextField("New message...", text: $newMessageInput, onCommit: {
print("Send Message")
})
.padding(30)
Button(action: {
chatModel.sendMessageChat(newMessageInput, in: chat, chatid: chat.id ?? "")
print("Send message.")
}) {
Image(systemName: "paperplane")
.imageScale(.large)
.padding(30)
}
}
}
.frame(height: 70)
}
.navigationTitle("Chat")
}
}
}
向对话添加消息的功能
func addMessagesToConv(conversation: Conversation, index: Int) {
var mensajesTotal = [Message]()
let ref = self.db.collection("conversations").document(conversation.id!).collection("messages")
.order(by: "date")
.addSnapshotListener { querySnapshotmsg, error in
if error == nil {
//loop throug the messages/docs
for msgDoc in querySnapshotmsg!.documents {
var m = Message() //emtpy struc message
m.createdBy = msgDoc["created_by"] as? String ?? ""
m.date = msgDoc["date"] as? Timestamp ?? Timestamp()
m.msg = msgDoc["msg"] as? String ?? ""
m.id = msgDoc.documentID //firebase auto id
mensajesTotal.append(m) //append this message to the total of messages
self.chats[index].messages.removeAll()
self.chats[index].messages = mensajesTotal
}
} else {
print("error: \(error!.localizedDescription)")
}
}
}
解决方案
您已在快照侦听器mensajesTotal
之外定义。因此,它每次都会被附加。
要解决此问题,请移动此行:
var mensajesTotal = [Message]()
到addSnapshotListener
封闭内部。
推荐阅读
- html - 网页上托管的目录的url被点击时,默认模板是如何创建的?
- laravel - 动态自定义字段:JSON、Pivot、morphToMany?
- powershell - How to execute .exe tool with argument using Powershell script?
- log4j2 - 更改 log4j2 日志条目的级别
- ios - Play background music for 24 hours (sleep music app)
- sql-server - 如何根据函数中的条件返回值?SQL 服务器
- java - swapping lines between Session.save() . what changes happens in the output . Kindly see the comment in the code. i'm new in java hibernate
- python - How to merge two different dataframe with a slight difference in timestamp
- java - 如何在项目结构的特定位置创建 .project 描述文件
- laravel - Laravel - Advanced Sum Aggregate in Laravel Eloquent