From 51077a5c7f81a019150e2fa8e48f555972d38e07 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Sat, 27 Dec 2025 11:52:06 +0800 Subject: [PATCH] =?UTF-8?q?refactor(message):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B3=BB=E7=BB=9F=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=B6=88=E6=81=AF=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将礼物消息从文本消息改为自定义消息格式,使用 event 和 params 参数 - 更新聊天控制器中的消息发送逻辑,使用 sendCustomMessage 替代 sendTextMessage - 修改礼物消息解析逻辑,同时支持新格式自定义消息和旧格式文本消息 - 更新直播间邀请消息为自定义消息格式,移除不必要的 type 字段 - 添加对旧格式特殊消息的过滤,避免显示 JSON 内容 - 优化消息类型判断逻辑,统一处理新旧格式的消息识别 --- lib/controller/message/chat_controller.dart | 25 ++++++++--------- .../live/live_room_guest_list_dialog.dart | 7 +++-- lib/widget/message/gift_item.dart | 27 ++++++++++++++++--- lib/widget/message/message_item.dart | 16 ++++++----- lib/widget/message/text_item.dart | 15 +++++++++++ 5 files changed, 62 insertions(+), 28 deletions(-) diff --git a/lib/controller/message/chat_controller.dart b/lib/controller/message/chat_controller.dart index 0373cbc..2a882f2 100644 --- a/lib/controller/message/chat_controller.dart +++ b/lib/controller/message/chat_controller.dart @@ -1749,31 +1749,28 @@ class ChatController extends GetxController { return false; } - // 发送成功,创建礼物消息 - final giftMessageContent = jsonEncode({ - 'type': 'gift', + // 发送成功,创建礼物消息参数(需要转换为 Map) + final giftParams = { 'giftProductId': gift.productId, 'giftProductTitle': gift.productTitle, 'giftMainPic': gift.mainPic, - 'giftPrice': gift.unitSellingPrice, - 'quantity': quantity, - }); - - // 创建文本消息,内容为礼物信息JSON - final content = '[GIFT:]$giftMessageContent'; + 'giftPrice': gift.unitSellingPrice.toString(), + 'quantity': quantity.toString(), + }; - // 先创建消息对象(即使发送失败也要显示在列表中) - final tempMessage = EMMessage.createTxtSendMessage( + // 先创建自定义消息对象(即使发送失败也要显示在列表中) + final tempMessage = EMMessage.createCustomSendMessage( targetId: userId, - content: content, + event: 'gift', + params: giftParams, ); // 将消息添加到列表末尾(显示发送中状态) messages.add(tempMessage); update(); - // 发送消息 - final message = await IMManager.instance.sendTextMessage(content, userId); + // 发送自定义消息 + final message = await IMManager.instance.sendCustomMessage(userId, 'gift', giftParams); if (message != null) { // 发送成功,替换临时消息 final index = messages.indexWhere((msg) => msg.msgId == tempMessage.msgId); diff --git a/lib/widget/live/live_room_guest_list_dialog.dart b/lib/widget/live/live_room_guest_list_dialog.dart index 4bd220f..8682d31 100644 --- a/lib/widget/live/live_room_guest_list_dialog.dart +++ b/lib/widget/live/live_room_guest_list_dialog.dart @@ -632,9 +632,8 @@ class _LiveRoomGuestListDialogState extends State { final cleanedAvatar = anchorAvatar.trim().replaceAll('`', ''); final cleanedCover = cleanedAvatar; // 封面使用主持人头像 - // 构建消息体,包含房间信息 - final messageData = { - 'type': 'live_room_invite', + // 构建消息参数,包含房间信息(不需要 type 字段,因为 event 已经是 'live_room_invite') + final messageParams = { 'channelId': channelId, 'anchorAvatar': cleanedAvatar, 'anchorName': anchorName, @@ -647,7 +646,7 @@ class _LiveRoomGuestListDialogState extends State { final result = await IMManager.instance.sendCustomMessage( targetUserId, 'live_room_invite', - messageData, + messageParams, ); if (result != null) { diff --git a/lib/widget/message/gift_item.dart b/lib/widget/message/gift_item.dart index 9a43b50..7a17382 100644 --- a/lib/widget/message/gift_item.dart +++ b/lib/widget/message/gift_item.dart @@ -25,14 +25,28 @@ class GiftItem extends StatelessWidget { super.key, }); - /// 从消息内容中解析礼物信息(使用特殊的JSON格式) + /// 从自定义消息的 params 或旧格式的文本消息中解析礼物信息 Map? _parseGiftInfo() { try { + // 新格式:自定义消息 + if (message.body.type == MessageType.CUSTOM) { + final customBody = message.body as EMCustomMessageBody; + if (customBody.event == 'gift' && customBody.params != null) { + // 将 Map 转换为 Map + final params = customBody.params!; + return { + 'giftProductId': params['giftProductId'] ?? '', + 'giftProductTitle': params['giftProductTitle'] ?? '', + 'giftMainPic': params['giftMainPic'] ?? '', + 'giftPrice': params['giftPrice'] ?? '0', + 'quantity': int.tryParse(params['quantity'] ?? '1') ?? 1, + }; + } + } + // 旧格式:文本消息,内容以 [GIFT:] 开头 if (message.body.type == MessageType.TXT) { final textBody = message.body as EMTextMessageBody; final content = textBody.content; - - // 检查是否是礼物消息(以 [GIFT:] 开头) if (content.startsWith('[GIFT:]')) { final jsonStr = content.substring(7); // 移除 '[GIFT:]' 前缀 return jsonDecode(jsonStr) as Map; @@ -66,7 +80,12 @@ class GiftItem extends StatelessWidget { int _getGiftQuantity() { final giftInfo = _parseGiftInfo(); if (giftInfo != null) { - return giftInfo['quantity'] as int? ?? 1; + final quantity = giftInfo['quantity']; + if (quantity is int) { + return quantity; + } else if (quantity is String) { + return int.tryParse(quantity) ?? 1; + } } return 1; } diff --git a/lib/widget/message/message_item.dart b/lib/widget/message/message_item.dart index add9483..340d4fc 100644 --- a/lib/widget/message/message_item.dart +++ b/lib/widget/message/message_item.dart @@ -41,14 +41,18 @@ class MessageItem extends StatelessWidget { return false; } - // 检查是否是礼物消息(通过消息内容识别) + // 检查是否是礼物消息(支持新格式的自定义消息和旧格式的文本消息) bool _isGiftMessage() { try { + // 新格式:自定义消息 + if (message.body.type == MessageType.CUSTOM) { + final customBody = message.body as EMCustomMessageBody; + return customBody.event == 'gift'; + } + // 旧格式:文本消息,内容以 [GIFT:] 开头 if (message.body.type == MessageType.TXT) { final textBody = message.body as EMTextMessageBody; - final content = textBody.content; - // 检查是否是礼物消息(以 [GIFT:] 开头) - return content.startsWith('[GIFT:]'); + return textBody.content.startsWith('[GIFT:]'); } } catch (e) { // 解析失败,不是礼物消息 @@ -92,8 +96,8 @@ class MessageItem extends StatelessWidget { ); } - // 处理礼物消息(通过文本消息的扩展属性识别) - if (message.body.type == MessageType.TXT && _isGiftMessage()) { + // 处理礼物消息(支持新格式的自定义消息和旧格式的文本消息) + if (_isGiftMessage()) { return GiftItem( message: message, isSentByMe: isSentByMe, diff --git a/lib/widget/message/text_item.dart b/lib/widget/message/text_item.dart index 78f0ad7..de1b402 100644 --- a/lib/widget/message/text_item.dart +++ b/lib/widget/message/text_item.dart @@ -27,8 +27,23 @@ class TextItem extends StatelessWidget { super.key, }); + /// 检查是否是旧格式的特殊消息(礼物、直播间邀请等) + bool _isLegacySpecialMessage() { + final content = textBody.content; + // 检查是否是旧格式的礼物消息或直播间邀请消息 + return content.startsWith('[GIFT:]') || + content.startsWith('[ROOM:]') || + content.startsWith('[CALL:]'); + } + @override Widget build(BuildContext context) { + // 如果是旧格式的特殊消息,不显示 JSON 内容 + if (_isLegacySpecialMessage()) { + // 返回空组件,不显示这些旧格式的消息 + return SizedBox.shrink(); + } + // 检查是否有金币信息(只对接收的消息显示) final revenueInfo = _getRevenueInfo();