fix: 解决消息重复问题

This commit is contained in:
yangshilin
2026-03-16 10:10:51 +08:00
parent 6733abe14f
commit a088f4bf50
2 changed files with 25 additions and 22 deletions

View File

@@ -19,10 +19,11 @@ class MessageRepository(
return messageDao.getMessagesByConversationId(conversationId)
}
/** 从 [conversationApi] 拉取消息并写入本地数据库 */
/** 从 [conversationApi] 拉取消息并写入本地数据库,以服务端为准替换该会话的本地消息,避免与本地临时消息重复显示 */
suspend fun syncMessages(conversationId: String) {
val result = conversationApi.getMessages(conversationId)
result.getOrNull()?.let { messages ->
messageDao.deleteMessagesByConversationId(conversationId)
val dbMessages = messages.map { dto ->
Message(
id = dto.id,

View File

@@ -658,37 +658,39 @@ class CreateMemoryViewModel(
isTyping.value = false
}
conversationId.value?.let { id ->
val messageTimestamp = System.currentTimeMillis()
val aiMessage = Message(
id = "ai_${System.currentTimeMillis()}_$index",
conversationId = id,
content = text,
senderType = "assistant",
timestamp = messageTimestamp,
messageType = "text"
)
viewModelScope.launch {
messageRepository.insertMessage(aiMessage)
updateConversationLatestMessage(
conversationId = id,
messagePreview = text,
timestamp = messageTimestamp,
)
}
}
// 用 [SPLIT] 拼接多条,与后端约定一致,便于 UI 按 [SPLIT] 拆成多个气泡
if (index == 0) {
agentResponse.value = text
} else {
agentResponse.value += "\n\n$text"
agentResponse.value += "[SPLIT]$text"
}
// 仅在完整收到一条 AI 回复时插入一次,避免按 index 多次插入导致同一条显示多遍
if (index >= total - 1) {
isStreaming.value = false
streamingText.value = ""
isTyping.value = false
conversationRealtime.setGenerating(false)
conversationId.value?.let { id ->
val messageTimestamp = System.currentTimeMillis()
val fullContent = agentResponse.value
val aiMessage = Message(
id = "ai_${System.currentTimeMillis()}",
conversationId = id,
content = fullContent,
senderType = "assistant",
timestamp = messageTimestamp,
messageType = "text"
)
viewModelScope.launch {
messageRepository.insertMessage(aiMessage)
updateConversationLatestMessage(
conversationId = id,
messagePreview = fullContent,
timestamp = messageTimestamp,
)
}
}
}
}
MessageType.agent_response_start -> {