From 0ca289ee226e87c763038a09b4e16e6aa0b3e592 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Fri, 28 Nov 2025 17:02:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(im):=20=E6=B7=BB=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=B9=B6=E5=AE=8C=E5=96=84=E7=9B=B4=E6=92=AD=E4=BA=92?= =?UTF-8?q?=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 IMManager 中新增 sendCustomMessage 方法用于发送自定义消息 - 实现直播间嘉宾邀请功能,通过自定义消息传递房间信息 - 完善礼物赠送后的公屏消息展示逻辑 - 优化直播间关闭后 overlay controller 的显示时机 - 增强消息处理逻辑以兼容不同的数据类型和异常情况 --- lib/controller/discover/room_controller.dart | 89 ++++++++++++++++++- lib/im/im_manager.dart | 13 +++ lib/pages/discover/live_room_page.dart | 4 +- .../live/live_room_guest_list_dialog.dart | 66 +++++++++++++- 4 files changed, 163 insertions(+), 9 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 8e7bb99..8916bf3 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -429,6 +429,43 @@ class RoomController extends GetxController with WidgetsBindingObserver { message: json.encode(messageData), ); print('✅ 礼物消息已发送: ${gift.productTitle}'); + + // 在公屏显示赠送礼物消息 + final senderNickName = GlobalData().userData?.nickName ?? '用户'; + String targetNickName = '用户'; + final targetUserIdStr = targetUserId.toString(); + + // 从频道详情中查找目标用户昵称 + final channelDetail = rtcChannelDetail.value; + if (channelDetail != null) { + // 检查是否是主持人 + if (channelDetail.anchorInfo?.userId == targetUserIdStr || + channelDetail.anchorInfo?.miId == targetUserIdStr) { + targetNickName = channelDetail.anchorInfo?.nickName ?? '用户'; + } + // 检查是否是男嘉宾 + else if (channelDetail.maleInfo?.userId == targetUserIdStr || + channelDetail.maleInfo?.miId == targetUserIdStr) { + targetNickName = channelDetail.maleInfo?.nickName ?? '用户'; + } + // 检查是否是女嘉宾 + else if (channelDetail.femaleInfo?.userId == targetUserIdStr || + channelDetail.femaleInfo?.miId == targetUserIdStr) { + targetNickName = channelDetail.femaleInfo?.nickName ?? '用户'; + } + } + + // 创建公屏消息 + final giftMessage = LiveChatMessage( + userId: GlobalData().userId ?? GlobalData().userData?.id ?? '', + userName: senderNickName, + avatar: GlobalData().userData?.profilePhoto, + content: '向$targetNickName赠送了【${gift.productTitle}】', + timestamp: DateTime.now().millisecondsSinceEpoch, + ); + + // 添加到消息列表 + _addMessage(giftMessage); } catch (e) { print('❌ 发送礼物失败: $e'); SmartDialog.showToast('发送礼物失败'); @@ -442,9 +479,51 @@ class RoomController extends GetxController with WidgetsBindingObserver { try { final svgaFile = message['svgaFile']?.toString() ?? ''; final giftProductId = message['giftProductId']?.toString(); - final targetUserId = message['targetUserId']?.toInt() ?? 0; - final senderUserId = message['senderUserId']?.toInt() ?? 0; - final senderNickName = message['senderNickName']?.toString() ?? ''; + final targetUserId = message['targetUserId']; + final senderUserId = message['senderUserId']; + final senderNickName = message['senderNickName']?.toString() ?? '用户'; + + // 从礼物产品列表中查找礼物名称 + String giftTitle = '礼物'; + if (giftProductId != null && giftProductId.isNotEmpty) { + try { + final gift = giftProducts.firstWhere( + (g) => g.productId == giftProductId, + ); + giftTitle = gift.productTitle; + } catch (e) { + // 如果找不到对应的礼物,使用默认名称 + print('⚠️ 未找到礼物ID: $giftProductId'); + } + } + + // 获取目标用户昵称 + String targetNickName = '用户'; + final channelDetail = rtcChannelDetail.value; + if (channelDetail != null) { + // 检查是否是主持人 + if (channelDetail.anchorInfo?.uid == targetUserId) { + targetNickName = channelDetail.anchorInfo?.nickName ?? '用户'; + } + // 检查是否是男嘉宾 + else if (channelDetail.maleInfo?.userId == targetUserId) { + targetNickName = channelDetail.maleInfo?.nickName ?? '用户'; + } + // 检查是否是女嘉宾 + else if (channelDetail.femaleInfo?.userId == targetUserId) { + targetNickName = channelDetail.femaleInfo?.nickName ?? '用户'; + } + } + + // 在公屏显示赠送礼物消息 + final giftMessage = LiveChatMessage( + userId: senderUserId?.toString() ?? '', + userName: senderNickName, + avatar: null, // 接收到的消息可能没有头像信息 + content: '向$targetNickName赠送了【$giftTitle】', + timestamp: DateTime.now().millisecondsSinceEpoch, + ); + _addMessage(giftMessage); if (svgaFile.isNotEmpty) { // 添加到播放队列 @@ -453,7 +532,9 @@ class RoomController extends GetxController with WidgetsBindingObserver { SvgaAnimationItem( svgaFile: svgaFile, targetUserId: targetUserId, - senderUserId: senderUserId, + senderUserId: senderUserId is int + ? senderUserId + : (int.tryParse(senderUserId?.toString() ?? '') ?? 0), giftProductId: giftProductId, ), ); diff --git a/lib/im/im_manager.dart b/lib/im/im_manager.dart index 5cb0101..cab66ad 100644 --- a/lib/im/im_manager.dart +++ b/lib/im/im_manager.dart @@ -429,6 +429,19 @@ class IMManager { } } + /// 发送自定义消息 + Future sendCustomMessage(String targetId, String event, Map? data,) async { + final customMsg = EMMessage.createCustomSendMessage( + targetId: targetId, + // `event` 为需要传递的自定义消息事件,比如礼物消息,可以设置: + event: event, + // `params` 类型为 `Map`。 + params: data, + ); + + return await EMClient.getInstance.chatManager.sendMessage(customMsg); + } + /// 获取会话列表 Future> getConversations() async { return EMClient.getInstance.chatManager.loadAllConversations(); diff --git a/lib/pages/discover/live_room_page.dart b/lib/pages/discover/live_room_page.dart index d2af234..a43d70e 100644 --- a/lib/pages/discover/live_room_page.dart +++ b/lib/pages/discover/live_room_page.dart @@ -181,8 +181,10 @@ class _LiveRoomPageState extends State { popularityText: popularityText, avatarAsset: avatarAsset, onCloseTap: () { - _overlayController.toggle(); Get.back(); + Future.delayed(Duration(seconds: 1), (){ + _overlayController.show(); + }); }, ); }), diff --git a/lib/widget/live/live_room_guest_list_dialog.dart b/lib/widget/live/live_room_guest_list_dialog.dart index 8ba417d..ab7b804 100644 --- a/lib/widget/live/live_room_guest_list_dialog.dart +++ b/lib/widget/live/live_room_guest_list_dialog.dart @@ -1,11 +1,14 @@ import 'dart:convert'; import 'package:cached_network_image/cached_network_image.dart'; +import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; import 'package:dating_touchme_app/network/network_service.dart'; +import 'package:dating_touchme_app/rtc/rtc_manager.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:get/get.dart'; /// 嘉宾列表对话框 class LiveRoomGuestListDialog extends StatefulWidget { @@ -311,13 +314,13 @@ class _LiveRoomGuestListDialogState extends State { ), ), // 操作按钮 - _buildActionButton(hasGuest), + _buildActionButton(hasGuest, guest), ], ), ); } - Widget _buildActionButton(bool hasGuest) { + Widget _buildActionButton(bool hasGuest, Map guest) { if (hasGuest) { return Container( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.w), @@ -333,8 +336,7 @@ class _LiveRoomGuestListDialogState extends State { } else { return GestureDetector( onTap: () { - // TODO: 实现邀请功能 - SmartDialog.showToast('邀请${_selectedTab == 0 ? "女" : "男"}嘉宾'); + _inviteGuest(guest); }, child: Container( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 6.w), @@ -377,4 +379,60 @@ class _LiveRoomGuestListDialogState extends State { } return parts.isEmpty ? '' : parts.join('·'); } + + /// 邀请嘉宾 + Future _inviteGuest(Map guest) async { + try { + final targetUserId = guest['userId'] as String?; + if (targetUserId == null || targetUserId.isEmpty) { + SmartDialog.showToast('用户ID不存在'); + return; + } + + // 获取房间信息 + final roomController = Get.isRegistered() + ? Get.find() + : null; + + if (roomController == null) { + SmartDialog.showToast('房间控制器未初始化'); + return; + } + + final channelId = RTCManager.instance.currentChannelId; + if (channelId == null || channelId.isEmpty) { + SmartDialog.showToast('频道ID不存在'); + return; + } + + // 获取房间详情 + final channelDetail = roomController.rtcChannelDetail.value; + final anchorName = channelDetail?.anchorInfo?.nickName ?? '主持人'; + + // 构建消息体,包含房间信息 + final messageData = { + 'type': 'live_room_invite', + 'channelId': channelId, + 'anchorAvatar': channelDetail?.anchorInfo?.profilePhoto ?? '', + 'anchorName': anchorName, + }; + + // 发送自定义消息 + final result = await IMManager.instance.sendCustomMessage( + targetUserId, + 'live_room_invite', + messageData, + ); + + if (result != null) { + SmartDialog.showToast('邀请已发送'); + SmartDialog.dismiss(); + } else { + SmartDialog.showToast('邀请发送失败'); + } + } catch (e) { + print('❌ 邀请嘉宾失败: $e'); + SmartDialog.showToast('邀请发送失败'); + } + } }