每次我进入 Chatscreen swiftUI 时,列表中来自 firebase rtdb 的消息都会重复

问题描述 投票:0回答:1

每次我输入 ChatScreen() 消息都会与日志重复

ForEach<Array<Message>, String, MessageView>: the ID //messageID occurs multiple times within the collection, this will give undefined results!

struct ChatScreen: View {
    @State private var message = ""
    var groupId: String
    var userId: String
    var userName: String
    @ObservedObject private var chatViewModel = ChatViewModel()
    
    
    init(groupId: String, userId: String, userName: String) {
        self.groupId = groupId
        self.userId = userId
        self.userName = userName
    }
    
    var body: some View {
        VStack {
            ScrollView{
                VStack(alignment: .leading, spacing: 10) {
                    ForEach(chatViewModel.messages, id: \.messageId) { message in
                        MessageView(message: message)
                    }
                }
                .padding()
            }
            .onAppear {
                chatViewModel.observeMessages(groupId: groupId)
            }
            HStack {
                TextField("Type your message here", text: $message)
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                
                Button("Send") {
                    chatViewModel.sendMessage(messageText: message, userId: userId, groupId: groupId, userName: userName)
                    message = ""
                }
            }
            .padding()
        }
    }
}

这是我的消息观察器函数:

func observeMessages(groupId: String) {
    let messagesRef = databaseRef.child("groups/\(groupId)/messages")
    messagesRef.observe(.childAdded) { snapshot, error in
        let message = Message(snapshot: snapshot)
        self.messages.append(message)
    }
}

消息仅在设备中重复(不在数据库中),重新启动应用程序后,重复的消息就会消失,但每次我回到组列表屏幕,然后回到聊天屏幕时,消息都会重复

firebase-realtime-database swiftui swiftui-list
1个回答
0
投票

每次收到新一批消息时都需要清除

self.messages

所以类似:

func observeMessages(groupId: String) {
    let messagesRef = databaseRef.child("groups/\(groupId)/messages")
    messagesRef.observe(.childAdded) { snapshot, error in
        let message = Message(snapshot: snapshot)
        self.messages.append(message)
    }
    messagesRef.observe(.value) { snapshot, error in
        self.messages.clearAll()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.