From bc47f9889c51e6a493b7c4e11414e379789c3f50 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Thu, 4 Dec 2025 17:46:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(rtc):=20=E4=BF=AE=E5=A4=8D=E8=B8=A2?= =?UTF-8?q?=E4=BA=BA=E5=8A=9F=E8=83=BD=E6=8E=A5=E5=8F=A3=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E5=B9=B6=E5=AE=8C=E5=96=84=E7=9B=B8=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修正 API URL 中重复的 '/user' 路径段 - 更新 kickingRtcChannelUser 方法参数类型及调用方式 - 在 RoomController 中实现完整的踢人消息处理流程 - 添加通过 RTM 广播踢人事件的功能 - 优化被踢用户和其他用户的界面反馈逻辑 - 修复 live_room_page 页面返回时 overlay 显示状态错误的问题 - 移除旧版断开麦克风连接的冗余代码 --- lib/controller/discover/room_controller.dart | 45 +++++++++++++++++++- lib/network/api_urls.dart | 2 +- lib/network/rtc_api.g.dart | 2 +- lib/pages/discover/live_room_page.dart | 2 +- lib/widget/live/disconnect_mic_dialog.dart | 20 ++------- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index f7e5c1c..f790ad5 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -538,6 +538,32 @@ class RoomController extends GetxController with WidgetsBindingObserver { } catch (e) { print('❌ 处理礼物消息失败: $e'); } + } else if (message['type'] == 'kick_user') { + // 处理踢人消息 + try { + final kickingUId = message['kickingUId']; + final operatorName = message['operatorName']?.toString() ?? '主持人'; + + print('✅ 收到踢人消息: 被踢用户ID $kickingUId'); + + // 判断当前用户是否是被踢的用户 + if (rtcChannel.value?.uid == kickingUId) { + // 被踢用户:离开房间 + SmartDialog.showToast('您已被$operatorName踢出房间'); + await leaveChannel(); + // 可以选择自动返回上一页或跳转到其他页面 + Get.back(); + } else { + // 其他用户:刷新房间详情 + final channelName = RTCManager.instance.currentChannelId; + if (channelName != null && channelName.isNotEmpty) { + await fetchRtcChannelDetail(channelName); + } + print('✅ 其他用户收到踢人消息,已刷新房间详情'); + } + } catch (e) { + print('❌ 处理踢人消息失败: $e'); + } } } @@ -555,7 +581,7 @@ class RoomController extends GetxController with WidgetsBindingObserver { /// 踢出 RTC 频道用户 Future kickingRtcChannelUser({ - required int channelId, + required String channelId, required int kickingUId, }) async { try { @@ -570,9 +596,24 @@ class RoomController extends GetxController with WidgetsBindingObserver { if (response.data.isSuccess) { SmartDialog.showToast('已踢出用户'); - // 刷新频道详情 + + // 发送 RTM 消息通知所有用户 final channelName = RTCManager.instance.currentChannelId; if (channelName != null && channelName.isNotEmpty) { + final messageData = { + 'type': 'kick_user', + 'kickingUId': kickingUId, + 'operatorId': GlobalData().userData?.id ?? '', + 'operatorName': GlobalData().userData?.nickName ?? '', + }; + + await RTMManager.instance.publishChannelMessage( + channelName: channelName, + message: json.encode(messageData), + ); + print('✅ 踢人消息已发送: 踢出用户ID $kickingUId'); + + // 刷新频道详情 await fetchRtcChannelDetail(channelName); } } else { diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 7dc552d..c0ac858 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -107,5 +107,5 @@ class ApiUrls { static const String submitMatchmakerOrder = 'dating-agency-mall/user/submit/matchmaker-order'; static const String kickingRtcChannelUser = - 'dating-agency-chat-audio/user/user//kicking/rtc-channel-user'; + 'dating-agency-chat-audio/user/kicking/rtc-channel-user'; } diff --git a/lib/network/rtc_api.g.dart b/lib/network/rtc_api.g.dart index 63083af..8f10ee6 100644 --- a/lib/network/rtc_api.g.dart +++ b/lib/network/rtc_api.g.dart @@ -480,7 +480,7 @@ class _RtcApi implements RtcApi { Options(method: 'POST', headers: _headers, extra: _extra) .compose( _dio.options, - 'dating-agency-chat-audio/user/user//kicking/rtc-channel-user', + 'dating-agency-chat-audio/user/kicking/rtc-channel-user', queryParameters: queryParameters, data: _data, ) diff --git a/lib/pages/discover/live_room_page.dart b/lib/pages/discover/live_room_page.dart index 36d5b00..233fc11 100644 --- a/lib/pages/discover/live_room_page.dart +++ b/lib/pages/discover/live_room_page.dart @@ -107,7 +107,7 @@ class _LiveRoomPageState extends State { Widget build(BuildContext context) { return PopScope( onPopInvokedWithResult: (bool didPop, Object? result) async { - _overlayController.hide(); + _overlayController.show(); Get.back(); }, child: Scaffold( diff --git a/lib/widget/live/disconnect_mic_dialog.dart b/lib/widget/live/disconnect_mic_dialog.dart index f5ebf7c..ad501ae 100644 --- a/lib/widget/live/disconnect_mic_dialog.dart +++ b/lib/widget/live/disconnect_mic_dialog.dart @@ -145,7 +145,10 @@ class DisconnectMicDialog extends StatelessWidget { onTap: isConnected ? () async { // 解除连麦 - await _disconnectMic(roomController, isMale); + await roomController.kickingRtcChannelUser( + channelId: roomController.rtcChannelDetail.value!.channelId, + kickingUId: userInfo.uid ?? 0); + SmartDialog.dismiss(); } : null, child: Container( @@ -177,20 +180,5 @@ class DisconnectMicDialog extends StatelessWidget { ], ); } - - /// 解除连麦 - Future _disconnectMic(RoomController roomController, bool isMale) async { - // 更新本地状态 - 移除对应嘉宾的信息 - final currentDetail = roomController.rtcChannelDetail.value; - if (currentDetail != null) { - final newDetail = RtcChannelDetail( - channelId: currentDetail.channelId, - anchorInfo: currentDetail.anchorInfo, - maleInfo: isMale ? null : currentDetail.maleInfo, - femaleInfo: !isMale ? null : currentDetail.femaleInfo, - ); - roomController.rtcChannelDetail.value = newDetail; - } - } }