Browse Source

feat(live): 实现直播结束消息处理功能

- 在 live_chat_message_service 中新增结束直播消息的处理逻辑
- 新增 _handleEndLiveMessage 方法用于处理结束直播消息
- 收到 end_live 消息时自动关闭 overlay 小窗或跳转至直播结束页面
- 在 room_controller 中主播离开频道时发送 end_live 消息
- 导入必要的依赖包以支持新功能实现
ios
Jolie 4 months ago
parent
commit
2adaeb2985
2 changed files with 47 additions and 0 deletions
  1. 14
      lib/controller/discover/room_controller.dart
  2. 33
      lib/service/live_chat_message_service.dart

14
lib/controller/discover/room_controller.dart

@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import 'package:agora_rtc_engine/agora_rtc_engine.dart';
import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/controller/global.dart';
import 'package:dating_touchme_app/model/live/gift_product_model.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/model/rtc/rtc_channel_detail.dart';
import 'package:dating_touchme_app/network/network_service.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/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:dating_touchme_app/service/live_chat_message_service.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -285,6 +288,17 @@ class RoomController extends GetxController {
} }
Future<void> leaveChannel() async { Future<void> 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; isLive = false;
if (currentRole == CurrentRole.maleAudience || if (currentRole == CurrentRole.maleAudience ||
currentRole == CurrentRole.femaleAudience) { currentRole == CurrentRole.femaleAudience) {

33
lib/service/live_chat_message_service.dart

@ -3,7 +3,9 @@ import 'dart:typed_data';
import 'package:agora_rtm/agora_rtm.dart'; import 'package:agora_rtm/agora_rtm.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/global.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/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/rtc_manager.dart';
import 'package:dating_touchme_app/rtc/rtm_manager.dart'; import 'package:dating_touchme_app/rtc/rtm_manager.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
@ -64,6 +66,13 @@ class LiveChatMessageService {
final messageText = _parseMessageContent(event.message); final messageText = _parseMessageContent(event.message);
final messageData = json.decode(messageText) as Map<String, dynamic>; final messageData = json.decode(messageText) as Map<String, dynamic>;
print('📥 收到消息: $messageData'); print('📥 收到消息: $messageData');
//
if (messageData['type'] == 'end_live') {
_handleEndLiveMessage();
return;
}
// //
if (messageData['type'] == 'chat_message') { if (messageData['type'] == 'chat_message') {
final chatMessage = LiveChatMessage.fromJson(messageData); final chatMessage = LiveChatMessage.fromJson(messageData);
@ -80,6 +89,30 @@ class LiveChatMessageService {
} }
} }
///
void _handleEndLiveMessage() {
try {
// overlay
if (Get.isRegistered<OverlayController>()) {
final overlayController = Get.find<OverlayController>();
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 Uint8List
String _parseMessageContent(dynamic message) { String _parseMessageContent(dynamic message) {
if (message is String) { if (message is String) {

Loading…
Cancel
Save