- 我有一個帶有 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)")
}
}
}
uj5u.com熱心網友回復:
您已mensajesTotal 在快照偵聽器之外定義。所以,它每次都被附加到。
要解決此問題,請移動此行:
var mensajesTotal = [Message]()
到addSnapshotListener閉包里面。
uj5u.com熱心網友回復:
您有兩個選擇:
mensajesTotal每次從資料庫獲得更新時清除,如@jnpdx 的回答所示。處理更精細的更新
querySnapshotmsg.documentChanges以在您的 UI 中執行增量更新,如有關檢測快照之間更改的檔案中所示。
這些方法之間在客戶端和服務器之間傳輸的資料沒有區別,因此使用最簡單的(通常是 #1)或 UI 上最有效的(通常是 #2)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311251.html
標籤:火力基地 谷歌云firestore 迅捷 swiftui 列表
