diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 228ed13..1245947 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -90,6 +90,10 @@ class RoomController extends GetxController with WidgetsBindingObserver { // matchmakerFlag + final closeBoss = false.obs; + final closeMale = false.obs; + final closeFemale = false.obs; + final femaleData = Rxn(); final maleData = Rxn(); @@ -116,6 +120,7 @@ class RoomController extends GetxController with WidgetsBindingObserver { } else { print("清除数据"); femaleData.value = null; + closeFemale.value = false; } if (value?.maleInfo != null) { print("获取数据"); @@ -123,6 +128,7 @@ class RoomController extends GetxController with WidgetsBindingObserver { } else { print("清除数据"); maleData.value = null; + closeMale.value = false; } }); } diff --git a/lib/controller/home/home_controller.dart b/lib/controller/home/home_controller.dart index a9ee598..f94e57e 100644 --- a/lib/controller/home/home_controller.dart +++ b/lib/controller/home/home_controller.dart @@ -102,6 +102,7 @@ class HomeController extends GetxController { final sseClient = SSEClient(); + Timer? illTimer; openSSE() async { final Stream stream = sseClient.connect("connectionId", request); @@ -117,7 +118,14 @@ class HomeController extends GetxController { if (Get.isRegistered()) { final roomController = Get.find(); if(data["data"]["illegalHandle"] == 1){ - // RTCManager.instance.closeCamera(); + if(data["data"]["illegalSubLabel"] != "WithoutFace"){ + illTimer?.cancel(); + RTCManager.instance.closeCamera(); + illTimer = Timer(const Duration(minutes: 2), () { + // 5 秒内没有被重新触发,才会执行这里 + RTCManager.instance.reOpenCamera(); + }); + } // 隐藏 overlay if(!roomController.isDialogShowing.value){ @@ -347,8 +355,8 @@ class HomeController extends GetxController { throw Exception(response.data.message ?? '获取数据失败'); } } catch(e){ - print('钱包数据获取失败: $e'); - SmartDialog.showToast('钱包数据获取失败'); + print('足迹数据获取失败: $e'); + SmartDialog.showToast('足迹数据获取失败'); rethrow; } diff --git a/lib/controller/message/chat_controller.dart b/lib/controller/message/chat_controller.dart index 328ebaa..ce8670a 100644 --- a/lib/controller/message/chat_controller.dart +++ b/lib/controller/message/chat_controller.dart @@ -1849,12 +1849,16 @@ class ChatController extends GetxController { } } + + bool isSend = false; /// 发送礼物(聊天界面) Future sendGift({ required GiftProductModel gift, int quantity = 1, }) async { try { + if(isSend) return false; + isSend = true; // 准备请求参数(IM 聊天送礼接口) final requestData = { 'toUserId': int.tryParse(userId) ?? 0, @@ -1886,6 +1890,7 @@ class ChatController extends GetxController { } else { SmartDialog.showToast('发送礼物失败'); } + isSend = false; return false; } @@ -1938,6 +1943,7 @@ class ChatController extends GetxController { if (Get.isLogEnable) { Get.log('✅ 礼物消息发送成功: ${gift.productTitle}'); } + isSend = false; return true; } else { // 发送失败,更新消息状态 @@ -1946,6 +1952,7 @@ class ChatController extends GetxController { update(); } SmartDialog.showToast('礼物消息发送失败,请点击重发'); + isSend = false; return false; } } catch (e) { @@ -1953,6 +1960,7 @@ class ChatController extends GetxController { Get.log('❌ 发送礼物失败: $e'); } SmartDialog.showToast('发送礼物失败: $e'); + isSend = false; return false; } } diff --git a/lib/main.dart b/lib/main.dart index 644bfa0..0168e55 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -101,7 +101,9 @@ void main() async { ), ); }, - home: Agreement(), + home: AppLifecycleCleaner( + child: Agreement(), + ), ); }, ) @@ -374,4 +376,42 @@ class _MyAppState extends State { } } +class AppLifecycleCleaner extends StatefulWidget { + final Widget child; + + const AppLifecycleCleaner({ + super.key, + required this.child, + }); + + @override + State createState() => _AppLifecycleCleanerState(); +} + +class _AppLifecycleCleanerState extends State + with WidgetsBindingObserver { + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + SmartDialog.dismiss(status: SmartStatus.toast); + } + } + + @override + Widget build(BuildContext context) { + return widget.child; + } +} diff --git a/lib/rtc/rtc_manager.dart b/lib/rtc/rtc_manager.dart index 07f4d89..2069004 100644 --- a/lib/rtc/rtc_manager.dart +++ b/lib/rtc/rtc_manager.dart @@ -381,10 +381,23 @@ class RTCManager { ){ print("$remoteUid,$state"); print("变化变化"); + final roomController = Get.find(); if(state == RemoteVideoState.remoteVideoStateStopped){ - + if(remoteUid == roomController.rtcChannelDetail.value?.anchorInfo?.uid){ + roomController.closeBoss.value = true; + } else if(remoteUid == roomController.rtcChannelDetail.value?.femaleInfo?.uid){ + roomController.closeFemale.value = true; + } else if(remoteUid == roomController.rtcChannelDetail.value?.maleInfo?.uid){ + roomController.closeMale.value = true; + } } else { - + if(remoteUid == roomController.rtcChannelDetail.value?.anchorInfo?.uid){ + roomController.closeBoss.value = false; + } else if(remoteUid == roomController.rtcChannelDetail.value?.femaleInfo?.uid){ + roomController.closeFemale.value = false; + } else if(remoteUid == roomController.rtcChannelDetail.value?.maleInfo?.uid){ + roomController.closeMale.value = false; + } } }, onError: (ErrorCodeType err, String msg) { diff --git a/lib/widget/live/live_room_anchor_showcase.dart b/lib/widget/live/live_room_anchor_showcase.dart index c39f3c5..bd0d0d5 100644 --- a/lib/widget/live/live_room_anchor_showcase.dart +++ b/lib/widget/live/live_room_anchor_showcase.dart @@ -1,4 +1,5 @@ import 'package:agora_rtc_engine/agora_rtc_engine.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/extension/ex_widget.dart'; @@ -229,7 +230,19 @@ class _LiveRoomAnchorShowcaseState extends State { child: SizedBox( width: 177.w, height: 175.w, - child: _roomController.currentRole == CurrentRole.broadcaster + child: _roomController.closeBoss.value ? CachedNetworkImage( + imageUrl: "${_roomController.rtcChannelDetail.value?.anchorInfo?.profilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_120", + width: 177.w, + height: 175.w, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + ) : _roomController.currentRole == CurrentRole.broadcaster ? AgoraVideoView( controller: VideoViewController( rtcEngine: engine, @@ -300,7 +313,7 @@ class _LiveRoomAnchorShowcaseState extends State { (_rtcManager.currentChannelId != null && _rtcManager.currentChannelId!.isNotEmpty) ? Stack( children: [ - AgoraVideoView( + if((isLeft && !_roomController.closeMale.value) || (!isLeft && !_roomController.closeFemale.value))AgoraVideoView( controller: isCurrentUser ? VideoViewController( rtcEngine: engine, @@ -314,6 +327,19 @@ class _LiveRoomAnchorShowcaseState extends State { ), ), ), + if((isLeft && _roomController.closeMale.value) || (!isLeft && _roomController.closeFemale.value)) CachedNetworkImage( + imageUrl: "${userInfo.profilePhoto ?? ""}?x-oss-process=image/format,webp/resize,w_120", + width: 177.w, + height: 175.w, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + ), if(!isCurrentUser) Positioned( top: 5.w,