Browse Source

feat(im): 实现聊天控制器注册与消息通知机制

- 在 IMManager 中添加 ChatController 的注册与注销功能- 实现消息接收时自动通知对应 ChatController 更新消息列表
- 为 ChatController 添加接收消息处理逻辑,避免重复消息插入
- 完善消息处理流程,确保新消息能及时刷新会话列表
- 添加日志记录以方便调试和追踪控制器状态变化- 优化消息通知逻辑,只处理接收到的消息并按发送者分发
ios
Jolie 4 months ago
parent
commit
3a7a780846
2 changed files with 77 additions and 0 deletions
  1. 25
      lib/controller/message/chat_controller.dart
  2. 52
      lib/im/im_manager.dart

25
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<void> 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 {

52
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<String, ChatController> _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<EMMessage> messages) {
try {
//
for (var message in messages) {
// direction == RECEIVE
if (message.direction == MessageDirection.RECEIVE) {
// IDfrom
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 {

Loading…
Cancel
Save