fix: 修复多图消息无法显示的三个根因
根因 1 — MessageItem.toEntity() id=0 主键碰撞: WS 拉取的每条消息均用 id=0 insertOrReplace,批量消息相互覆盖, DB 中只留最后一条。改为 id=messageId(服务端唯一 ID)。 根因 2 — SendMessageUseCase 乐观写入 id=0 碰撞: 批量图片发送时所有乐观行共享 id=0,逐条覆盖。 改用负微秒时间戳作为临时唯一 id,HTTP 确认后用真实 messageId 替换。 根因 3 — watchByChatId 无 ORDER BY: DB 消息顺序不确定,宫格分组算法依赖时间升序失败。 在 MessageRepositoryImpl.watchByChatId 及 _buildDisplayItems 中 分别按 sendTime ASC + chatIdx ASC 排序。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -42,8 +42,12 @@ class MessageItem {
|
||||
atUsers: json['at_users'] as String?,
|
||||
);
|
||||
|
||||
/// [id] 使用服务端 [messageId](必须 > 0)作为主键,确保多条消息在 DB 中唯一共存。
|
||||
/// 若 messageId 为 0(防御),退化为负时间戳临时 ID。
|
||||
Message toEntity() => Message(
|
||||
id: 0,
|
||||
id: messageId > 0
|
||||
? messageId
|
||||
: -(DateTime.now().microsecondsSinceEpoch),
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
chatIdx: chatIdx,
|
||||
|
||||
@@ -35,7 +35,9 @@ class SendMessageResponse {
|
||||
required int typ,
|
||||
}) =>
|
||||
Message(
|
||||
id: 0,
|
||||
id: messageId > 0
|
||||
? messageId
|
||||
: -(DateTime.now().microsecondsSinceEpoch),
|
||||
messageId: messageId,
|
||||
chatId: chatId,
|
||||
chatIdx: chatIdx,
|
||||
|
||||
@@ -59,7 +59,17 @@ class MessageRepositoryImpl implements MessageRepository {
|
||||
.watchWhere<DriftMessage, $MessagesTable>(
|
||||
(t) => t.chatId.equals(chatId),
|
||||
)
|
||||
.map((rows) => rows.map(_toEntity).toList());
|
||||
.map((rows) {
|
||||
final entities = rows.map(_toEntity).toList();
|
||||
// 按 sendTime ASC 排序,sendTime 相同时按 chatIdx ASC
|
||||
// 确保连续图片消息的宫格分组逻辑正确工作
|
||||
entities.sort((a, b) {
|
||||
final st = (a.sendTime ?? 0).compareTo(b.sendTime ?? 0);
|
||||
if (st != 0) return st;
|
||||
return (a.chatIdx ?? 0).compareTo(b.chatIdx ?? 0);
|
||||
});
|
||||
return entities;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
Reference in New Issue
Block a user