import 'package:get_storage/get_storage.dart'; import 'package:im_flutter_sdk/im_flutter_sdk.dart'; // 完整的IM管理器实现,使用实际的SDK类型和方法 class IMManager { // 单例模式 static final IMManager _instance = IMManager._internal(); factory IMManager() => _instance; final storage = GetStorage(); // 静态getter用于instance访问 static IMManager get instance => _instance; bool _isInitialized = false; IMManager._internal() { print('IMManager instance created'); } /// 初始化IM SDK Future initialize(String appKey) async { try { if (_isInitialized) { print('IM SDK already initialized'); return true; } // 创建EMOptions实例 final options = EMOptions( appKey: appKey, autoLogin: false, acceptInvitationAlways: false, ); // 初始化SDK await EMClient.getInstance.init(options); _isInitialized = true; print('IM SDK initialized successfully'); return true; } catch (e) { print('Failed to initialize IM SDK: $e'); return false; } } // 注册监听器 void _registerListeners() { try { // 消息监听器 // 连接监听器 EMClient.getInstance.addConnectionEventHandler( '', EMConnectionEventHandler( onConnected: () { print('Connected to IM server'); }, onDisconnected: () { print('Disconnected from IM server:'); }, onTokenDidExpire: () { print('IM token about to expire'); }, onUserKickedByOtherDevice: () { print('User kicked out of IM server'); }, ), ); EMClient.getInstance.chatManager.addEventHandler( // EMChatEventHandler 对应的 key。 "", EMChatEventHandler( onMessagesReceived: (messages) { for (var msg in messages) { switch (msg.body.type) { case MessageType.TXT: {} break; case MessageType.IMAGE: {} break; case MessageType.VIDEO: {} break; case MessageType.LOCATION: {} break; case MessageType.VOICE: {} break; case MessageType.FILE: {} break; case MessageType.CUSTOM: {} break; case MessageType.COMBINE: {} break; case MessageType.CMD: { // 当前回调中不会有 CMD 类型消息,CMD 类型消息通过 `EMChatEventHandler#onCmdMessagesReceived` 回调接收 } break; } } }, ), ); } catch (e) { print('Failed to register listeners: $e'); } } /// 登录IM服务 Future login(String token) async { try { if (!_isInitialized) { print('IM SDK not initialized'); return false; } var userId = storage.read('userId'); await EMClient.getInstance.logout(); await EMClient.getInstance.loginWithToken(userId, token); // 注册监听器 _registerListeners(); print('IM login successful'); return true; } catch (e) { print('IM login failed: $e'); return false; } } /// 登出IM服务 Future logout() async { try { await EMClient.getInstance.logout(); print('IM logout successful'); return true; } catch (e) { print('IM logout failed: $e'); return false; } } /// 发送文本消息 Future sendTextMessage( String content, String toChatUsername, ) async { print('Text message sent'); try { // 创建文本消息 final message = EMMessage.createTxtSendMessage( targetId: toChatUsername, content: content, ); print('Text message sent successfully'); return await EMClient.getInstance.chatManager.sendMessage(message); } catch (e) { print('Failed to send text message: $e'); return null; } } /// 发送图片消息 Future sendImageMessage( String imagePath, String toChatUsername, ) async { try { // 创建图片消息 final message = EMMessage.createImageSendMessage( targetId: toChatUsername, filePath: imagePath, sendOriginalImage: false, ); // 发送消息 await EMClient.getInstance.chatManager.sendMessage(message); print('Image message sent successfully'); return message; } catch (e) { print('Failed to send image message: $e'); return null; } } /// 获取会话列表 Future> getConversations() async { return EMClient.getInstance.chatManager.loadAllConversations(); } /// 获取好有列表 Future> getContacts(String userId) async { return await EMClient.getInstance.userInfoManager.fetchUserInfoById([ userId, ]); } /// 获取指定会话的消息记录 Future> getMessages( String conversationId, { int pageSize = 20, String? startMsgId, }) async { EMConversationType convType = EMConversationType.Chat; EMCursorResult cursor = await EMClient.getInstance.chatManager .fetchHistoryMessagesByOption( conversationId, convType, pageSize: pageSize, ); return cursor.data; } /// 获取用户信息 Future getUserInfo(String userId) async { var data = await EMClient.getInstance.userInfoManager.fetchUserInfoById([ userId, ]); return data[userId]; } /// 清理资源 void dispose() { try { EMClient.getInstance.removeConnectionEventHandler(""); } catch (e) { print('Failed to dispose resources: $e'); } } } // 导出单例实例 final IMManager imManager = IMManager();