From 3a7a7808466c9d29f222e253dcfe9eac6bc7d6a4 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Thu, 13 Nov 2025 15:11:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(im):=20=E5=AE=9E=E7=8E=B0=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E6=8E=A7=E5=88=B6=E5=99=A8=E6=B3=A8=E5=86=8C=E4=B8=8E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 IMManager 中添加 ChatController 的注册与注销功能- 实现消息接收时自动通知对应 ChatController 更新消息列表 - 为 ChatController 添加接收消息处理逻辑,避免重复消息插入 - 完善消息处理流程,确保新消息能及时刷新会话列表 - 添加日志记录以方便调试和追踪控制器状态变化- 优化消息通知逻辑,只处理接收到的消息并按发送者分发 --- lib/controller/message/chat_controller.dart | 25 ++++++++++ lib/im/im_manager.dart | 52 +++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/lib/controller/message/chat_controller.dart b/lib/controller/message/chat_controller.dart index 76698f1..c98df36 100644 --- a/lib/controller/message/chat_controller.dart +++ b/lib/controller/message/chat_controller.dart @@ -21,11 +21,20 @@ class ChatController extends GetxController { @override void onInit() { super.onInit(); + // 注册到 IMManager,以便接收消息时能通知到此 Controller + IMManager.instance.registerChatController(this); // 初始化时获取用户信息和消息列表 fetchUserInfo(); fetchMessages(); } + @override + void onClose() { + // 注销 ChatController + IMManager.instance.unregisterChatController(userId); + super.onClose(); + } + /// 获取用户信息 Future fetchUserInfo() async { try { @@ -198,6 +207,22 @@ class ChatController extends GetxController { } } + /// 添加接收到的消息 + void addReceivedMessage(EMMessage message) { + // 检查消息是否已存在(避免重复添加) + if (!messages.any((msg) => msg.msgId == message.msgId)) { + // 将新消息添加到列表开头 + messages.insert(0, message); + update(); + // 更新会话列表 + _refreshConversationList(); + + if (Get.isLogEnable) { + Get.log('收到新消息并添加到列表: ${message.msgId}'); + } + } + } + /// 刷新会话列表 void _refreshConversationList() { try { diff --git a/lib/im/im_manager.dart b/lib/im/im_manager.dart index 17edd6b..78ff82c 100644 --- a/lib/im/im_manager.dart +++ b/lib/im/im_manager.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; import '../controller/message/conversation_controller.dart'; +import '../controller/message/chat_controller.dart'; // 完整的IM管理器实现,使用实际的SDK类型和方法 class IMManager { @@ -14,6 +15,9 @@ class IMManager { bool _isInitialized = false; + // 存储活跃的 ChatController 实例,key 为 userId + final Map _activeChatControllers = {}; + IMManager._internal() { print('IMManager instance created'); } @@ -76,6 +80,9 @@ class IMManager { // 收到新消息时,更新会话列表 _refreshConversationList(); + // 通知对应的 ChatController 更新消息列表 + _notifyChatControllers(messages); + for (var msg in messages) { switch (msg.body.type) { case MessageType.TXT: @@ -285,6 +292,51 @@ class IMManager { return data[userId]; } + /// 注册 ChatController + void registerChatController(ChatController controller) { + _activeChatControllers[controller.userId] = controller; + if (Get.isLogEnable) { + Get.log('注册 ChatController: ${controller.userId}'); + } + } + + /// 注销 ChatController + void unregisterChatController(String userId) { + _activeChatControllers.remove(userId); + if (Get.isLogEnable) { + Get.log('注销 ChatController: $userId'); + } + } + + /// 通知 ChatController 更新消息列表 + void _notifyChatControllers(List messages) { + try { + // 遍历所有收到的消息 + for (var message in messages) { + // 只处理接收到的消息(direction == RECEIVE) + if (message.direction == MessageDirection.RECEIVE) { + // 获取消息的发送者ID(from 属性) + final fromId = message.from; + + if (fromId != null && fromId.isNotEmpty) { + // 查找对应的 ChatController + final controller = _activeChatControllers[fromId]; + if (controller != null) { + controller.addReceivedMessage(message); + if (Get.isLogEnable) { + Get.log('通知 ChatController 更新消息: $fromId'); + } + } + } + } + } + } catch (e) { + if (Get.isLogEnable) { + Get.log('通知 ChatController 更新消息列表失败: $e'); + } + } + } + /// 刷新会话列表 void _refreshConversationList() { try {