Flutter聊天功能:双方无法查看同一会话的问题求助
Flutter 聊天功能接收方无法查看消息的解决方案
问题原因
你当前把消息存在chats/$targetUid/messages路径下:你发消息时,消息会写入对方UID对应的集合;但接收方打开和你的聊天时,会以你的UID作为targetUid去读取chats/你的UID/messages,这个集合里没有任何消息,所以接收方看不到内容。本质是聊天双方没有共用同一个消息存储路径。
解决方案
1. 生成统一的聊天房间ID
把聊天双方的UID按字典序排序后拼接成固定字符串,这样不管是A找B还是B找A,聊天房间ID都是同一个,比如uid1_uid2(uid1字典序小于uid2)。
2. 修改发送消息代码
// 创建消息对象 Message newMessage = Message( profImage: myProfilePic, username: myName, uid: myUid, message: message, createdAt: DateTime.now(), ); // 生成统一的聊天集合路径 List<String> uids = [myUid, targetUid]; uids.sort(); // 排序保证双方生成的ID一致 String chatRoomId = '${uids[0]}_${uids[1]}'; final refMessages = _firestore.collection('chats/$chatRoomId/messages'); await refMessages.add(newMessage.toJson());
3. 调整聊天界面的消息读取逻辑
接收方进入聊天界面时,同样用上述方式生成chatRoomId,再读取对应路径的消息:
// 在ChatScreen中生成统一的聊天房间ID List<String> uids = [currentUserUid, chatPartnerUid]; uids.sort(); String chatRoomId = '${uids[0]}_${uids[1]}'; // 读取消息流 StreamBuilder<QuerySnapshot>( stream: _firestore.collection('chats/$chatRoomId/messages') .orderBy('createdAt', descending: true) .snapshots(), builder: (context, snapshot) { if (!snapshot.hasData) return const Center(child: CircularProgressIndicator()); return ListView.builder( reverse: true, // 最新消息在底部 itemCount: snapshot.data!.docs.length, itemBuilder: (context, index) { var messageData = snapshot.data!.docs[index].data() as Map<String, dynamic>; // 构建消息气泡 return MessageBubble( message: messageData['message'], username: messageData['username'], profImage: messageData['profImage'], isMe: messageData['uid'] == currentUserUid, ); }, ); }, );
聊天列表说明
你提供的聊天列表代码(点击用户进入聊天界面)逻辑没问题,只需确保进入ChatScreen后,用上述统一方式生成chatRoomId读取消息即可。
内容的提问来源于stack exchange,提问作者Jack Duffy
相关产品推荐
相关产品推荐

