Browse Source

feat(message): 支持通话消息的新格式自定义消息

- 实现自定义消息格式的通话消息解析和发送
- 在CallItem组件中支持新旧两种格式的通话消息识别
- 修改CallManager使用IMManager发送自定义通话消息
- 更新ChatController中通话消息的创建和发送逻辑
- 添加对Map<String, String>参数格式的支持
- 移除过时的JSON字符串解析方式
- 保持向后兼容旧格式文本消息的处理
master
Jolie 3 months ago
parent
commit
1e1b67aa57
4 changed files with 79 additions and 43 deletions
  1. 38
      lib/controller/message/call_manager.dart
  2. 54
      lib/controller/message/chat_controller.dart
  3. 18
      lib/widget/message/call_item.dart
  4. 12
      lib/widget/message/message_item.dart

38
lib/controller/message/call_manager.dart

@ -4,6 +4,7 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
import '../../im/im_manager.dart';
import 'chat_controller.dart';
///
@ -282,24 +283,22 @@ class CallManager extends GetxController {
);
}
// IMManager
final callInfoMap = <String, dynamic>{
// IMManager
final callParams = <String, String>{
'callType': callType,
'callStatus': callStatus,
};
if (callDuration != null) {
callInfoMap['callDuration'] = callDuration;
callParams['callDuration'] = callDuration.toString();
}
final callInfoJson = jsonEncode(callInfoMap);
final content = '[CALL:]$callInfoJson';
final message = EMMessage.createTxtSendMessage(
targetId: targetUserId,
content: content,
final message = await IMManager.instance.sendCustomMessage(
targetUserId,
'call',
callParams,
);
await EMClient.getInstance.chatManager.sendMessage(message);
return true;
return message != null;
} catch (e) {
print('❌ [CallManager] 发送通话消息失败: $e');
return false;
@ -337,9 +336,24 @@ class CallManager extends GetxController {
}
}
///
///
Map<String, dynamic>? _parseCallInfo(EMMessage message) {
try {
//
if (message.body.type == MessageType.CUSTOM) {
final customBody = message.body as EMCustomMessageBody;
if (customBody.event == 'call' && customBody.params != null) {
final params = customBody.params!;
return {
'callType': params['callType'] ?? 'voice',
'callStatus': params['callStatus'] ?? 'missed',
'callDuration': params['callDuration'] != null
? int.tryParse(params['callDuration']!)
: null,
};
}
}
//
if (message.body.type == MessageType.TXT) {
final textBody = message.body as EMTextMessageBody;
final content = textBody.content;

54
lib/controller/message/chat_controller.dart

@ -1,6 +1,5 @@
import 'package:get/get.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'dart:convert';
import '../../im/im_manager.dart';
import '../../im/chat_presence_manager.dart';
@ -1057,47 +1056,48 @@ class ChatController extends GetxController {
int? callDuration, //
}) async {
try {
//
final callInfoMap = <String, dynamic>{
// Map<String, String>
final callParams = <String, String>{
'callType': callType,
'callStatus': callStatus,
};
if (callDuration != null) {
callInfoMap['callDuration'] = callDuration;
callParams['callDuration'] = callDuration.toString();
}
final callInfoJson = jsonEncode(callInfoMap);
// [CALL:] + JSON
final content = '[CALL:]$callInfoJson';
// 使
final tempMessage = EMMessage.createTxtSendMessage(
// 使
final tempMessage = EMMessage.createCustomSendMessage(
targetId: userId,
content: content,
event: 'call',
params: callParams,
);
//
messages.add(tempMessage);
update();
//
final messageToSend = EMMessage.createTxtSendMessage(
targetId: userId,
content: content,
);
//
//
try {
final sentMessage = await EMClient.getInstance.chatManager.sendMessage(messageToSend);
//
final index = messages.indexWhere((msg) => msg.msgId == tempMessage.msgId);
if (index != -1) {
messages[index] = sentMessage;
final message = await IMManager.instance.sendCustomMessage(userId, 'call', callParams);
if (message != null) {
//
final index = messages.indexWhere((msg) => msg.msgId == tempMessage.msgId);
if (index != -1) {
messages[index] = message;
}
update();
//
_refreshConversationList();
return true;
} else {
// FAIL
update();
if (Get.isLogEnable) {
Get.log('发送通话消息失败: message为null');
}
SmartDialog.showToast('通话消息发送失败');
return false;
}
update();
//
_refreshConversationList();
return true;
} catch (e) {
// FAIL
update();

18
lib/widget/message/call_item.dart

@ -39,9 +39,25 @@ class CallItem extends StatelessWidget {
super.key,
});
/// 使JSON格式
///
Map<String, dynamic>? _parseCallInfo() {
try {
//
if (message.body.type == MessageType.CUSTOM) {
final customBody = message.body as EMCustomMessageBody;
if (customBody.event == 'call' && customBody.params != null) {
// Map<String, String> Map<String, dynamic>
final params = customBody.params!;
return {
'callType': params['callType'] ?? 'voice',
'callStatus': params['callStatus'] ?? 'missed',
'callDuration': params['callDuration'] != null
? int.tryParse(params['callDuration']!)
: null,
};
}
}
// [CALL:]
if (message.body.type == MessageType.TXT) {
final textBody = message.body as EMTextMessageBody;
final content = textBody.content;

12
lib/widget/message/message_item.dart

@ -26,9 +26,15 @@ class MessageItem extends StatelessWidget {
super.key,
});
//
//
bool _isCallMessage() {
try {
//
if (message.body.type == MessageType.CUSTOM) {
final customBody = message.body as EMCustomMessageBody;
return customBody.event == 'call';
}
// [CALL:]
if (message.body.type == MessageType.TXT) {
final textBody = message.body as EMTextMessageBody;
final content = textBody.content;
@ -77,8 +83,8 @@ class MessageItem extends StatelessWidget {
Widget build(BuildContext context) {
print('📨 [MessageItem] 渲染消息,类型: ${message.body.type}');
//
if (message.body.type == MessageType.TXT && _isCallMessage()) {
//
if (_isCallMessage()) {
return CallItem(
message: message,
isSentByMe: isSentByMe,

Loading…
Cancel
Save