From 26eb4a39a3a04e53ac92799ce25164aa68ae1120 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Sat, 27 Dec 2025 09:06:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(live):=20=E5=AE=8C=E5=96=84=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E6=88=BF=E9=97=B4=E9=80=80=E5=87=BA=E5=92=8C=E7=A4=BC?= =?UTF-8?q?=E7=89=A9=E5=BC=B9=E7=AA=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在登出时自动退出直播间并清理相关资源 - 添加小窗口隐藏功能确保登出时完全清理 - 实现礼物弹窗默认选中主持人逻辑 - 优化直播房间界面显示,根据好友关系控制加好友按钮 - 统一在多个控制器中添加登出时的资源清理逻辑 --- .../mine/deactivate_controller.dart | 23 ++++++++ .../setting/setting_controller.dart | 23 ++++++++ lib/network/network_config.dart | 26 +++++++-- lib/widget/live/live_gift_popup.dart | 50 +++++++++++++++++ .../live/live_room_anchor_showcase.dart | 54 ++++++++++--------- 5 files changed, 149 insertions(+), 27 deletions(-) diff --git a/lib/controller/mine/deactivate_controller.dart b/lib/controller/mine/deactivate_controller.dart index e5b3142..9c0a7de 100644 --- a/lib/controller/mine/deactivate_controller.dart +++ b/lib/controller/mine/deactivate_controller.dart @@ -1,5 +1,7 @@ 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/room_controller.dart'; +import 'package:dating_touchme_app/controller/overlay_controller.dart'; import 'package:dating_touchme_app/im/im_manager.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -12,6 +14,27 @@ class DeactivateController extends GetxController { final s = "".obs; void logout() async { + // 退出直播间 + if (Get.isRegistered()) { + try { + final roomController = Get.find(); + await roomController.leaveChannel(); + } catch (e) { + print('退出直播间失败: $e'); + } + } + + // 取消小窗口 + if (Get.isRegistered()) { + try { + final overlayController = Get.find(); + overlayController.hide(); // 隐藏直播房间小窗 + overlayController.hideVideoCall(); // 隐藏视频通话小窗 + } catch (e) { + print('取消小窗口失败: $e'); + } + } + // 先退出 IM 登录 await IMManager.instance.logout(); // 清除会话列表和用户信息缓存 diff --git a/lib/controller/setting/setting_controller.dart b/lib/controller/setting/setting_controller.dart index aedd024..4f60ada 100644 --- a/lib/controller/setting/setting_controller.dart +++ b/lib/controller/setting/setting_controller.dart @@ -1,6 +1,8 @@ import 'dart:async'; 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/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/extension/ex_widget.dart'; import 'package:flutter/material.dart'; @@ -47,6 +49,27 @@ class SettingController extends GetxController { } void logout() async { + // 退出直播间 + if (Get.isRegistered()) { + try { + final roomController = Get.find(); + await roomController.leaveChannel(); + } catch (e) { + print('退出直播间失败: $e'); + } + } + + // 取消小窗口 + if (Get.isRegistered()) { + try { + final overlayController = Get.find(); + overlayController.hide(); // 隐藏直播房间小窗 + overlayController.hideVideoCall(); // 隐藏视频通话小窗 + } catch (e) { + print('取消小窗口失败: $e'); + } + } + // 先退出 IM 登录 await IMManager.instance.logout(); // 清除会话列表和用户信息缓存 diff --git a/lib/network/network_config.dart b/lib/network/network_config.dart index f88cfa3..19be50f 100644 --- a/lib/network/network_config.dart +++ b/lib/network/network_config.dart @@ -1,8 +1,7 @@ -import 'package:dating_touchme_app/controller/discover/discover_controller.dart'; import 'package:dating_touchme_app/controller/global.dart'; -import 'package:dating_touchme_app/controller/home/home_controller.dart'; import 'package:dating_touchme_app/controller/message/conversation_controller.dart'; -import 'package:dating_touchme_app/controller/mine/mine_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:dio/dio.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -163,6 +162,27 @@ class ResponseInterceptor extends Interceptor { // 处理token过期逻辑,如清除本地数据、跳转登录页等 // 这里可以使用Get.offAllNamed('/login')等方式跳转 // 先退出 IM 登录 + // 退出直播间 + if (Get.isRegistered()) { + try { + final roomController = Get.find(); + await roomController.leaveChannel(); + } catch (e) { + print('退出直播间失败: $e'); + } + } + + // 取消小窗口 + if (Get.isRegistered()) { + try { + final overlayController = Get.find(); + overlayController.hide(); // 隐藏直播房间小窗 + overlayController.hideVideoCall(); // 隐藏视频通话小窗 + } catch (e) { + print('取消小窗口失败: $e'); + } + } + await IMManager.instance.logout(); // 清除会话列表和用户信息缓存 if (Get.isRegistered()) { diff --git a/lib/widget/live/live_gift_popup.dart b/lib/widget/live/live_gift_popup.dart index 23bf623..8c33c09 100644 --- a/lib/widget/live/live_gift_popup.dart +++ b/lib/widget/live/live_gift_popup.dart @@ -37,6 +37,8 @@ class LiveGiftPopup extends StatefulWidget { class _LiveGiftPopupState extends State { // 选中的用户ID(单选) int? _selectedUserId; + // 标记是否已经尝试过设置默认选中 + bool _hasTriedSetDefault = false; @override void initState() { @@ -44,6 +46,9 @@ class _LiveGiftPopupState extends State { // 如果传入了目标用户ID,直接设置 if (widget.targetUserId != null) { _selectedUserId = widget.targetUserId; + } else if (widget.showHeader) { + // 如果没有传入目标用户ID且显示头部,默认选中主持人 + _initDefaultSelectedUser(); } // 默认选择第一个礼物 if (widget.giftList.isNotEmpty && widget.activeGift.value == null) { @@ -51,6 +56,36 @@ class _LiveGiftPopupState extends State { } } + /// 初始化默认选中的用户(主持人) + void _initDefaultSelectedUser() { + try { + final roomController = Get.isRegistered() + ? Get.find() + : null; + + if (roomController != null) { + final rtcChannelDetail = roomController.rtcChannelDetail.value; + // 默认选中主持人(anchorInfo) + if (rtcChannelDetail?.anchorInfo != null) { + final anchorInfo = rtcChannelDetail!.anchorInfo!; + // 获取当前用户ID,排除本人 + final currentUserId = GlobalData().userId ?? GlobalData().userData?.id; + // 如果主持人不是本人,则默认选中 + if (anchorInfo.userId != currentUserId && anchorInfo.miId != currentUserId) { + // 使用 uid 作为选中标识 + if (anchorInfo.uid != null) { + setState(() { + _selectedUserId = anchorInfo.uid; + }); + } + } + } + } + } catch (e) { + print('初始化默认选中用户失败: $e'); + } + } + // 切换用户选中状态(单选模式) void _toggleUserSelection(int userId) { setState(() { @@ -201,6 +236,21 @@ class _LiveGiftPopupState extends State { // 最多显示3个用户 final displayUsers = filteredUserList.take(3).toList(); + // 如果还没有选中用户,且主持人存在且不是本人,默认选中主持人 + if (!_hasTriedSetDefault && _selectedUserId == null && rtcChannelDetail?.anchorInfo != null) { + final anchorInfo = rtcChannelDetail!.anchorInfo!; + if (anchorInfo.userId != currentUserId && anchorInfo.miId != currentUserId && anchorInfo.uid != null) { + _hasTriedSetDefault = true; + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && _selectedUserId == null) { + setState(() { + _selectedUserId = anchorInfo.uid; + }); + } + }); + } + } + return Container( height: 53.w, padding: EdgeInsets.symmetric(horizontal: 10.w), diff --git a/lib/widget/live/live_room_anchor_showcase.dart b/lib/widget/live/live_room_anchor_showcase.dart index 4972769..0d9d6ad 100644 --- a/lib/widget/live/live_room_anchor_showcase.dart +++ b/lib/widget/live/live_room_anchor_showcase.dart @@ -89,35 +89,41 @@ class _LiveRoomAnchorShowcaseState extends State { ), ), if(_roomController.currentRole != CurrentRole.broadcaster) - Positioned( - bottom: 5.w, - right: 5.w, - child: Container( - width: 47.w, - height: 20.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(20.w)), - color: Colors.white, - ), - child: Center( - child: Text( - "加好友", - style: TextStyle( - fontSize: 11.w, - color: const Color.fromRGBO(117, 98, 249, 1), + Obx(() { + final anchorInfo = _roomController + .rtcChannelDetail + .value + ?.anchorInfo; + // 如果已经是好友,不显示加好友按钮 + if (anchorInfo?.isFriend == true) { + return const SizedBox.shrink(); + } + return Positioned( + bottom: 5.w, + right: 5.w, + child: Container( + width: 47.w, + height: 20.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(20.w)), + color: Colors.white, + ), + child: Center( + child: Text( + "加好友", + style: TextStyle( + fontSize: 11.w, + color: const Color.fromRGBO(117, 98, 249, 1), + ), ), ), ), ).onTap((){ - final anchorInfo = _roomController - .rtcChannelDetail - .value - ?.anchorInfo; if (anchorInfo != null) { _showGiftPopupForUser(anchorInfo, 2); } - }), - ), + }); + }), ], ), SizedBox(height: 5.w), @@ -243,7 +249,7 @@ class _LiveRoomAnchorShowcaseState extends State { ), ), ), - if(!isCurrentUser) + if(!isCurrentUser && userInfo.isFriend != true) Positioned( top: 5.w, right: 5.w, @@ -267,7 +273,7 @@ class _LiveRoomAnchorShowcaseState extends State { ), ), ), - if(!isCurrentUser) + if(!isCurrentUser && userInfo.isFriend != true) Positioned( bottom: 5.w, right: 5.w,