Browse Source

fix(rtc): 解决RTC连接异常处理和频道刷新问题

- 在CallController中修复忙线提示时重置创建频道状态
- 调整聊天输入框底部内边距样式
- 在网络配置中添加API URL导入并实现SW RTC Token回调刷新逻辑
- 在房间控制器中添加连麦成功后的数据刷新机制
- 增强RTC管理器中服务器封禁连接状态的处理逻辑
- 添加非主播角色被封禁时自动离开频道和结束直播消息处理
master
Jolie 2 months ago
parent
commit
3643d37fbe
5 changed files with 37 additions and 3 deletions
  1. 8
      lib/controller/discover/room_controller.dart
  2. 1
      lib/controller/message/call_controller.dart
  3. 10
      lib/network/network_config.dart
  4. 18
      lib/rtc/rtc_manager.dart
  5. 3
      lib/widget/message/chat_input_bar.dart

8
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 '../../pages/setting/match_spread_page.dart';
import '../../widget/live/live_recharge_popup.dart'; import '../../widget/live/live_recharge_popup.dart';
import '../message/call_controller.dart'; import '../message/call_controller.dart';
import 'discover_controller.dart';
import 'svga_player_manager.dart'; import 'svga_player_manager.dart';
// //
@ -262,6 +263,11 @@ class RoomController extends GetxController with WidgetsBindingObserver {
}; };
final response = await _networkService.rtcApi.connectRtcChannel(data); final response = await _networkService.rtcApi.connectRtcChannel(data);
if (!response.data.isSuccess) { if (!response.data.isSuccess) {
// DiscoverController.loadRtcChannelPage
if (Get.isRegistered<DiscoverController>()) {
final discoverController = Get.find<DiscoverController>();
discoverController.loadRtcChannelPage();
}
SmartDialog.showToast(response.data.message); SmartDialog.showToast(response.data.message);
return; return;
} }
@ -276,6 +282,8 @@ class RoomController extends GetxController with WidgetsBindingObserver {
} else { } else {
await RTCManager.instance.publishAudio(); await RTCManager.instance.publishAudio();
} }
//
await getUserPropLinkMicCard();
RtcSeatUserInfo userInfo = RtcSeatUserInfo( RtcSeatUserInfo userInfo = RtcSeatUserInfo(
uid: rtcChannel.value?.uid, uid: rtcChannel.value?.uid,
miId: GlobalData().userData?.id ?? '', miId: GlobalData().userData?.id ?? '',

1
lib/controller/message/call_controller.dart

@ -186,6 +186,7 @@ class CallController extends GetxController {
} }
if (!response.data.data!.success && response.data.data!.code == 'E0003') { if (!response.data.data!.success && response.data.data!.code == 'E0003') {
SmartDialog.showToast('对方忙线中'); SmartDialog.showToast('对方忙线中');
isCreatingChannel.value = false;
return null; return null;
} }
rtcChannel.value = response.data.data; rtcChannel.value = response.data.data;

10
lib/network/network_config.dart

@ -1,8 +1,10 @@
import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/controller/global.dart';
import 'package:dating_touchme_app/controller/message/conversation_controller.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/discover/room_controller.dart';
import 'package:dating_touchme_app/controller/overlay_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/im/im_manager.dart';
import 'package:dating_touchme_app/network/api_urls.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart' hide Response; import 'package:get/get.dart' hide Response;
@ -100,6 +102,13 @@ class ResponseInterceptor extends Interceptor {
_showError("登录已过期,请重新登录"); _showError("登录已过期,请重新登录");
_handleTokenExpired(); _handleTokenExpired();
} else { } else {
if(response.realUri.path.contains(ApiUrls.getSwRtcToken)){
// DiscoverController.loadRtcChannelPage
if (Get.isRegistered<DiscoverController>()) {
final discoverController = Get.find<DiscoverController>();
discoverController.loadRtcChannelPage();
}
}
// //
final message = data['message'] ?? '请求失败'; final message = data['message'] ?? '请求失败';
_showError(message); _showError(message);
@ -151,7 +160,6 @@ class ResponseInterceptor extends Interceptor {
default: default:
errorMessage = err.message ?? '未知错误'; errorMessage = err.message ?? '未知错误';
} }
_showError(errorMessage); _showError(errorMessage);
handler.reject(err); handler.reject(err);
} }

18
lib/rtc/rtc_manager.dart

@ -238,8 +238,22 @@ class RTCManager {
RtcConnection connection, RtcConnection connection,
ConnectionStateType state, ConnectionStateType state,
ConnectionChangedReasonType reason, ConnectionChangedReasonType reason,
) {
print('连接状态改变:$state,原因:$reason');
) async{
if(state == ConnectionStateType.connectionStateFailed &&
reason == ConnectionChangedReasonType.connectionChangedBannedByServer){
if (Get.isRegistered<RoomController>()) {
final roomController = Get.find<RoomController>();
// 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) { if (onConnectionStateChanged != null) {
onConnectionStateChanged!(connection, state, reason); onConnectionStateChanged!(connection, state, reason);
} }

3
lib/widget/message/chat_input_bar.dart

@ -174,6 +174,9 @@ class _ChatInputBarState extends State<ChatInputBar> {
fontSize: 14.sp, fontSize: 14.sp,
color: Colors.grey, color: Colors.grey,
), ),
contentPadding: EdgeInsets.only(
bottom: 10
),
), ),
inputFormatters: [ inputFormatters: [
// Unicode的规则 // Unicode的规则

Loading…
Cancel
Save