From 3643d37fbe31cc7f6e9abcaeb786dbe38494ac9f Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Mon, 12 Jan 2026 21:33:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(rtc):=20=E8=A7=A3=E5=86=B3RTC=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E5=92=8C=E9=A2=91?= =?UTF-8?q?=E9=81=93=E5=88=B7=E6=96=B0=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在CallController中修复忙线提示时重置创建频道状态 - 调整聊天输入框底部内边距样式 - 在网络配置中添加API URL导入并实现SW RTC Token回调刷新逻辑 - 在房间控制器中添加连麦成功后的数据刷新机制 - 增强RTC管理器中服务器封禁连接状态的处理逻辑 - 添加非主播角色被封禁时自动离开频道和结束直播消息处理 --- lib/controller/discover/room_controller.dart | 8 ++++++++ lib/controller/message/call_controller.dart | 1 + lib/network/network_config.dart | 10 +++++++++- lib/rtc/rtc_manager.dart | 18 ++++++++++++++++-- lib/widget/message/chat_input_bar.dart | 3 +++ 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 6fe806c..0468175 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -23,6 +23,7 @@ import '../../pages/mine/real_name_page.dart'; import '../../pages/setting/match_spread_page.dart'; import '../../widget/live/live_recharge_popup.dart'; import '../message/call_controller.dart'; +import 'discover_controller.dart'; import 'svga_player_manager.dart'; // 当前角色 @@ -262,6 +263,11 @@ class RoomController extends GetxController with WidgetsBindingObserver { }; final response = await _networkService.rtcApi.connectRtcChannel(data); if (!response.data.isSuccess) { + // 刷新 DiscoverController.loadRtcChannelPage + if (Get.isRegistered()) { + final discoverController = Get.find(); + discoverController.loadRtcChannelPage(); + } SmartDialog.showToast(response.data.message); return; } @@ -276,6 +282,8 @@ class RoomController extends GetxController with WidgetsBindingObserver { } else { await RTCManager.instance.publishAudio(); } + // 上麦成功后刷新连麦卡片数据 + await getUserPropLinkMicCard(); RtcSeatUserInfo userInfo = RtcSeatUserInfo( uid: rtcChannel.value?.uid, miId: GlobalData().userData?.id ?? '', diff --git a/lib/controller/message/call_controller.dart b/lib/controller/message/call_controller.dart index bc94f03..c2c88b2 100644 --- a/lib/controller/message/call_controller.dart +++ b/lib/controller/message/call_controller.dart @@ -186,6 +186,7 @@ class CallController extends GetxController { } if (!response.data.data!.success && response.data.data!.code == 'E0003') { SmartDialog.showToast('对方忙线中'); + isCreatingChannel.value = false; return null; } rtcChannel.value = response.data.data; diff --git a/lib/network/network_config.dart b/lib/network/network_config.dart index 9cc2447..8d0be35 100644 --- a/lib/network/network_config.dart +++ b/lib/network/network_config.dart @@ -1,8 +1,10 @@ import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/controller/message/conversation_controller.dart'; +import 'package:dating_touchme_app/controller/discover/discover_controller.dart'; import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/controller/overlay_controller.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; +import 'package:dating_touchme_app/network/api_urls.dart'; import 'package:dio/dio.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart' hide Response; @@ -100,6 +102,13 @@ class ResponseInterceptor extends Interceptor { _showError("登录已过期,请重新登录"); _handleTokenExpired(); } else { + if(response.realUri.path.contains(ApiUrls.getSwRtcToken)){ + // 调用 DiscoverController.loadRtcChannelPage 刷新频道列表 + if (Get.isRegistered()) { + final discoverController = Get.find(); + discoverController.loadRtcChannelPage(); + } + } // 业务错误 final message = data['message'] ?? '请求失败'; _showError(message); @@ -151,7 +160,6 @@ class ResponseInterceptor extends Interceptor { default: errorMessage = err.message ?? '未知错误'; } - _showError(errorMessage); handler.reject(err); } diff --git a/lib/rtc/rtc_manager.dart b/lib/rtc/rtc_manager.dart index 0e51098..d65474e 100644 --- a/lib/rtc/rtc_manager.dart +++ b/lib/rtc/rtc_manager.dart @@ -238,8 +238,22 @@ class RTCManager { RtcConnection connection, ConnectionStateType state, ConnectionChangedReasonType reason, - ) { - print('连接状态改变:$state,原因:$reason'); + ) async{ + if(state == ConnectionStateType.connectionStateFailed && + reason == ConnectionChangedReasonType.connectionChangedBannedByServer){ + if (Get.isRegistered()) { + final roomController = Get.find(); + // 判断不是主播(从 RoomController.currentRole 获取角色) + final isNotBroadcaster = roomController.currentRole != CurrentRole.broadcaster; + if (isNotBroadcaster) { + await roomController.leaveChannel(); + // 调用 LiveChatMessageService 处理结束直播消息 + LiveChatMessageService.instance.handleEndLiveMessage(); + } + } + return; + } + print('连接状态改变:$state,原因:$reason, localUid: ${connection.localUid}'); if (onConnectionStateChanged != null) { onConnectionStateChanged!(connection, state, reason); } diff --git a/lib/widget/message/chat_input_bar.dart b/lib/widget/message/chat_input_bar.dart index 1bc1875..f761f96 100644 --- a/lib/widget/message/chat_input_bar.dart +++ b/lib/widget/message/chat_input_bar.dart @@ -174,6 +174,9 @@ class _ChatInputBarState extends State { fontSize: 14.sp, color: Colors.grey, ), + contentPadding: EdgeInsets.only( + bottom: 10 + ), ), inputFormatters: [ // 可以添加其他格式化器,但不要添加过滤Unicode的规则