diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index bfee3d9..2ab9d66 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/model/live/gift_product_model.dart'; @@ -5,6 +7,7 @@ import 'package:dating_touchme_app/model/rtc/rtc_channel_data.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; import 'package:dating_touchme_app/network/network_service.dart'; import 'package:dating_touchme_app/rtc/rtc_manager.dart'; +import 'package:dating_touchme_app/rtc/rtm_manager.dart'; import 'package:dating_touchme_app/service/live_chat_message_service.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -285,6 +288,17 @@ class RoomController extends GetxController { } Future leaveChannel() async { + // 如果是主播,发送结束直播消息 + if (currentRole == CurrentRole.broadcaster) { + final channelId = RTCManager.instance.currentChannelId; + if (channelId != null && channelId.isNotEmpty) { + await RTMManager.instance.publishChannelMessage( + channelName: channelId, + message: json.encode({'type': 'end_live'}), + ); + } + } + isLive = false; if (currentRole == CurrentRole.maleAudience || currentRole == CurrentRole.femaleAudience) { diff --git a/lib/service/live_chat_message_service.dart b/lib/service/live_chat_message_service.dart index c4d0323..6946158 100644 --- a/lib/service/live_chat_message_service.dart +++ b/lib/service/live_chat_message_service.dart @@ -3,7 +3,9 @@ import 'dart:typed_data'; import 'package:agora_rtm/agora_rtm.dart'; import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/controller/global.dart'; +import 'package:dating_touchme_app/controller/overlay_controller.dart'; import 'package:dating_touchme_app/model/live/live_chat_message.dart'; +import 'package:dating_touchme_app/pages/discover/live_end_page.dart'; import 'package:dating_touchme_app/rtc/rtc_manager.dart'; import 'package:dating_touchme_app/rtc/rtm_manager.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -64,6 +66,13 @@ class LiveChatMessageService { final messageText = _parseMessageContent(event.message); final messageData = json.decode(messageText) as Map; print('📥 收到消息: $messageData'); + + // 处理结束直播消息 + if (messageData['type'] == 'end_live') { + _handleEndLiveMessage(); + return; + } + // 只处理聊天消息类型 if (messageData['type'] == 'chat_message') { final chatMessage = LiveChatMessage.fromJson(messageData); @@ -80,6 +89,30 @@ class LiveChatMessageService { } } + /// 处理结束直播消息 + void _handleEndLiveMessage() { + try { + // 检查 overlay 是否显示,如果显示则关闭 + if (Get.isRegistered()) { + final overlayController = Get.find(); + if (overlayController.showOverlay.value) { + overlayController.hide(); + print('✅ 已关闭 overlay 小窗'); + return; + } + } + + // 检查当前是否在 LiveRoomPage,如果是则跳转到 live_end_page + final currentRoute = Get.currentRoute; + if (currentRoute == '/LiveRoomPage' || currentRoute.contains('LiveRoomPage')) { + Get.off(() => const LiveEndPage()); + print('✅ 已跳转到直播结束页面'); + } + } catch (e) { + print('❌ 处理结束直播消息失败: $e'); + } + } + /// 解析消息内容(支持 String 和 Uint8List) String _parseMessageContent(dynamic message) { if (message is String) {