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; - } - } }