Flutter聊天发送消息时所有旧消息时间戳更新问题如何解决
问题原因
- 核心错误出现在StreamBuilder构建消息气泡的逻辑中:你每次构建所有历史消息的
MessageBubble组件时,都强制用DateTime.now().millisecondsSinceEpoch传入时间参数,等于每次页面刷新(包括新消息触发的流更新)都会给所有消息赋值当前时间,自然就覆盖了原有时间戳。 - 补充问题:
readTimestamp方法中时间差计算逻辑错误,使用date.difference(now)会得到负的时间差,导致「XX天前」的判断永远无法触发。
修复步骤
第一步:确保发消息时已存储时间戳到Firestore
你在提交新消息到messages集合时,要额外存入timestamp字段:
// 发送消息的逻辑里补充时间戳字段 _firestore.collection('messages').add({ 'text': messageText, 'sender': loggedInUser.email, 'timestamp': DateTime.now().millisecondsSinceEpoch, // 新增此行存储时间戳 });
第二步:修改消息拉取逻辑,读取存储的时间戳
找到StreamBuilder中构建MessageBubble的代码,替换时间赋值逻辑:
原错误代码:
final messageBubble = MessageBubble( sender: 'The Bar Gym', text: messageText, isMe: currentUser == messageSender, daterTimer: DateTime.now().millisecondsSinceEpoch, // 此处为错误根源 );
修改为:
final messageBubble = MessageBubble( sender: 'The Bar Gym', text: messageText, isMe: currentUser == messageSender, daterTimer: message['timestamp'] as int, // 从Firestore文档读取已存储的时间戳 );
第三步(可选):修复时间差计算逻辑
修改readTimestamp方法中的时间差计算,简化冗余判断:
String readTimestamp(int timestamp) { var now = DateTime.now(); var format = DateFormat('M/d K:m a'); var date = DateTime.fromMillisecondsSinceEpoch(timestamp); var diff = now.difference(date); // 替换原有的date.difference(now) var time = ''; if (diff.inDays == 0) { time = format.format(date); } else if (diff.inDays == 1) { time = '${diff.inDays} DAY AGO'; } else { time = '${diff.inDays} DAYS AGO'; } return time; }
内容的提问来源于stack exchange,提问作者flutterloop
相关产品推荐
相关产品推荐

