From 94aab5d7700056e23bfafed0920db3818ce3b9a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Mon, 2 Mar 2026 10:06:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/discover/room_controller.dart | 21 ++-- lib/network/rtc_api.dart | 2 + lib/network/rtc_api.g.dart | 6 + lib/network/user_api.dart | 1 + lib/network/user_api.g.dart | 3 + lib/pages/home/content_card.dart | 27 ++++- lib/widget/live/kick_list.dart | 4 +- .../live/live_room_anchor_showcase.dart | 6 +- lib/widget/live/live_room_chat_item.dart | 2 +- .../live/live_room_invitation_list.dart | 17 +-- lib/widget/live/live_room_user_header.dart | 113 +++++++++++++++++- .../live/live_room_user_profile_dialog.dart | 100 +++++++++++++++- 12 files changed, 268 insertions(+), 34 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 13801db..0fa3250 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -176,21 +176,21 @@ class RoomController extends GetxController with WidgetsBindingObserver { final tab = 0.obs; - changeTab(int i) async { + changeTab(int i, int genderCode) async { tab.value = i; if(tab.value == 0){ page.value = 1; audienceList.clear(); - await getAudienceList(); + await getAudienceList(genderCode); } else if(tab.value == 1) { page.value = 1; audienceList.clear(); - await getOnMicList(); + await getOnMicList(genderCode); } else if(tab.value == 2) { page.value = 1; audienceList.clear(); - await getFriendList(); + await getFriendList(genderCode); } update(); listRefreshController.finishRefresh(IndicatorResult.success); @@ -203,14 +203,15 @@ class RoomController extends GetxController with WidgetsBindingObserver { late final EasyRefreshController listRefreshController; - getAudienceList() async { + getAudienceList(int? genderCode) async { try{ final channelId = RTCManager.instance.currentChannelId; final response = await _networkService.rtcApi.userPageRtcChannelAudience( pageNum: page.value, pageSize: 10, - channelId: channelId ?? "" + channelId: channelId ?? "", + genderCode: genderCode ); if (response.data.isSuccess && response.data.data != null) { final data = response.data.data?.records ?? []; @@ -235,14 +236,15 @@ class RoomController extends GetxController with WidgetsBindingObserver { } } - getOnMicList() async { + getOnMicList(int genderCode) async { try{ final channelId = RTCManager.instance.currentChannelId; final response = await _networkService.rtcApi.userPageMicJoinRtcChannelUser( pageNum: page.value, pageSize: 10, - channelId: channelId ?? "" + channelId: channelId ?? "", + genderCode: genderCode ); if (response.data.isSuccess && response.data.data != null) { final data = response.data.data?.records ?? []; @@ -268,11 +270,12 @@ class RoomController extends GetxController with WidgetsBindingObserver { } - getFriendList() async { + getFriendList(int genderCode) async { try{ final response = await _networkService.userApi.userPageFriendRelation( pageNum: page.value, pageSize: 10, + genderCode: genderCode ); if (response.data.isSuccess && response.data.data != null) { final data = response.data.data?.records ?? []; diff --git a/lib/network/rtc_api.dart b/lib/network/rtc_api.dart index 688ef32..203ff04 100644 --- a/lib/network/rtc_api.dart +++ b/lib/network/rtc_api.dart @@ -151,6 +151,7 @@ abstract class RtcApi { @Query('pageNum') required int pageNum, @Query('pageSize') required int pageSize, @Query('channelId') required String channelId, + @Query('genderCode') int? genderCode, } ); @@ -160,6 +161,7 @@ abstract class RtcApi { @Query('pageNum') required int pageNum, @Query('pageSize') required int pageSize, @Query('channelId') required String channelId, + @Query('genderCode') int? genderCode, } ); diff --git a/lib/network/rtc_api.g.dart b/lib/network/rtc_api.g.dart index 035e8db..f3df6f9 100644 --- a/lib/network/rtc_api.g.dart +++ b/lib/network/rtc_api.g.dart @@ -792,13 +792,16 @@ class _RtcApi implements RtcApi { required int pageNum, required int pageSize, required String channelId, + int? genderCode, }) async { final _extra = {}; final queryParameters = { r'pageNum': pageNum, r'pageSize': pageSize, r'channelId': channelId, + r'genderCode': genderCode, }; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; const Map? _data = null; final _options = @@ -835,13 +838,16 @@ class _RtcApi implements RtcApi { required int pageNum, required int pageSize, required String channelId, + int? genderCode, }) async { final _extra = {}; final queryParameters = { r'pageNum': pageNum, r'pageSize': pageSize, r'channelId': channelId, + r'genderCode': genderCode, }; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; const Map? _data = null; final _options = diff --git a/lib/network/user_api.dart b/lib/network/user_api.dart index 9291283..65fe83c 100644 --- a/lib/network/user_api.dart +++ b/lib/network/user_api.dart @@ -228,6 +228,7 @@ abstract class UserApi { { @Query('pageNum') required int pageNum, @Query('pageSize') required int pageSize, + @Query('genderCode') int? genderCode, } ); diff --git a/lib/network/user_api.g.dart b/lib/network/user_api.g.dart index cd04699..548d1e4 100644 --- a/lib/network/user_api.g.dart +++ b/lib/network/user_api.g.dart @@ -1350,12 +1350,15 @@ class _UserApi implements UserApi { Future>> userPageFriendRelation({ required int pageNum, required int pageSize, + int? genderCode, }) async { final _extra = {}; final queryParameters = { r'pageNum': pageNum, r'pageSize': pageSize, + r'genderCode': genderCode, }; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; const Map? _data = null; final _options = _setStreamType>>( diff --git a/lib/pages/home/content_card.dart b/lib/pages/home/content_card.dart index 65b8af4..929fa7d 100644 --- a/lib/pages/home/content_card.dart +++ b/lib/pages/home/content_card.dart @@ -8,6 +8,7 @@ import 'package:dating_touchme_app/pages/discover/live_room_page.dart'; import 'package:dating_touchme_app/pages/home/user_information_page.dart'; import 'package:dating_touchme_app/pages/message/chat_page.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -121,7 +122,7 @@ class _CardHeader extends StatelessWidget { ), ), // 直播状态下显示视频相亲中标签 - if (item.liveStreaming) + if (false) Container( padding: const EdgeInsets.symmetric( horizontal: 8, @@ -203,10 +204,16 @@ class _CardHeader extends StatelessWidget { } } }, - child: Image.asset( + child: !item.liveStreaming ? Image.asset( _getButtonImage(isLive, isOnline), width: item.liveStreaming ? 60 : 50, height: 30, + ) : Text( + "视频相亲中", + style: TextStyle( + color: const Color.fromRGBO(255, 120, 120, 1), + fontSize: 11.w + ), ), ), ], @@ -232,10 +239,22 @@ class ContentCard extends StatelessWidget { @override Widget build(BuildContext context) { return GestureDetector( - onTap: () { + onTap: () async { + if (item.liveStreaming) { + late final RoomController roomController; + + if (Get.isRegistered()) { + roomController = Get.find(); + } else { + roomController = Get.put(RoomController()); + } + await roomController.joinChannel(item.isLiveChannelId ?? ""); + } else { + Get.to(() => UserInformationPage(miId: item.miId, userId: item.userId,)); + } // 点击卡片跳转到用户信息页面,传递用户数据 // 注意:userId 参数应该传入 miId,因为详情接口使用 miId 来获取用户信息 - Get.to(() => UserInformationPage(miId: item.miId, userId: item.userId,)); + }, child: Container( decoration: BoxDecoration( diff --git a/lib/widget/live/kick_list.dart b/lib/widget/live/kick_list.dart index 09c073a..1eb168e 100644 --- a/lib/widget/live/kick_list.dart +++ b/lib/widget/live/kick_list.dart @@ -80,7 +80,7 @@ class _KickListState extends State { print('推荐列表下拉刷新被触发'); _roomController.page.value = 1; _roomController.audienceList.clear(); - await _roomController.getAudienceList(); + await _roomController.getAudienceList(null); _roomController.listRefreshController.finishRefresh(IndicatorResult.success); _roomController.listRefreshController.finishLoad(IndicatorResult.none); }, @@ -88,7 +88,7 @@ class _KickListState extends State { onLoad: () async { print('推荐列表上拉加载被触发, hasMore: '); _roomController.page.value += 1; - await _roomController.getAudienceList(); + await _roomController.getAudienceList(null); }, child: ListView.separated( // 关键:始终允许滚动,即使内容不足 diff --git a/lib/widget/live/live_room_anchor_showcase.dart b/lib/widget/live/live_room_anchor_showcase.dart index dfc79c9..81a4bc2 100644 --- a/lib/widget/live/live_room_anchor_showcase.dart +++ b/lib/widget/live/live_room_anchor_showcase.dart @@ -447,8 +447,8 @@ class _LiveRoomAnchorShowcaseState extends State { content: "", timestamp: 0 ), - () => - _showGiftPopupForUser(userInfo, 1), + (int type) => + _showGiftPopupForUser(userInfo, type), response.data.data! ); } else { @@ -512,7 +512,7 @@ class _LiveRoomAnchorShowcaseState extends State { void _showGuestListDialog(BuildContext context, bool isMaleSeat) async { _roomController.audienceList.clear(); - await _roomController.getAudienceList(); + await _roomController.getAudienceList(isMaleSeat ? 0 : 1); _roomController.setDialogDismiss(true); SmartDialog.show( alignment: Alignment.bottomCenter, diff --git a/lib/widget/live/live_room_chat_item.dart b/lib/widget/live/live_room_chat_item.dart index 1d80792..9d68089 100644 --- a/lib/widget/live/live_room_chat_item.dart +++ b/lib/widget/live/live_room_chat_item.dart @@ -97,7 +97,7 @@ class LiveRoomChatItem extends StatelessWidget { showUserProfileDialog( context, message, - () => _showGiftPopup(context, 1), + (int type) => _showGiftPopup(context, type), response.data.data! ); diff --git a/lib/widget/live/live_room_invitation_list.dart b/lib/widget/live/live_room_invitation_list.dart index e30c570..48bdd82 100644 --- a/lib/widget/live/live_room_invitation_list.dart +++ b/lib/widget/live/live_room_invitation_list.dart @@ -28,10 +28,13 @@ class _LiveRoomInvitationListState extends State with Ti final RoomController _roomController = Get.find(); + int genderCode = 0; + @override void initState() { super.initState(); _tabController = TabController(length: 3, vsync: this); + genderCode = widget.nowSex == 0 ? 1 : 0; } List> selectUserId = []; @@ -69,7 +72,7 @@ class _LiveRoomInvitationListState extends State with Ti controller: _tabController, showIndicator: true, onTap: (int i) async { - _roomController.changeTab(i); + _roomController.changeTab(i, genderCode); }, ), ), @@ -108,11 +111,11 @@ class _LiveRoomInvitationListState extends State with Ti _roomController.page.value = 1; _roomController.audienceList.clear(); if(_roomController.tab.value == 0){ - await _roomController.getAudienceList(); + await _roomController.getAudienceList(genderCode); } else if(_roomController.tab.value == 1){ - await _roomController.getOnMicList(); + await _roomController.getOnMicList(genderCode); } else if(_roomController.tab.value == 2){ - await _roomController.getFriendList(); + await _roomController.getFriendList(genderCode); } _roomController.listRefreshController.finishRefresh(IndicatorResult.success); _roomController.listRefreshController.finishLoad(IndicatorResult.none); @@ -122,11 +125,11 @@ class _LiveRoomInvitationListState extends State with Ti print('推荐列表上拉加载被触发, hasMore: '); _roomController.page.value += 1; if(_roomController.tab.value == 0){ - await _roomController.getAudienceList(); + await _roomController.getAudienceList(genderCode); } else if(_roomController.tab.value == 1){ - await _roomController.getOnMicList(); + await _roomController.getOnMicList(genderCode); } else if(_roomController.tab.value == 2){ - await _roomController.getFriendList(); + await _roomController.getFriendList(genderCode); } }, child: Obx(() { diff --git a/lib/widget/live/live_room_user_header.dart b/lib/widget/live/live_room_user_header.dart index ec24631..c8e9a21 100644 --- a/lib/widget/live/live_room_user_header.dart +++ b/lib/widget/live/live_room_user_header.dart @@ -1,11 +1,17 @@ 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/extension/ex_widget.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/model/live/live_chat_message.dart'; +import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; +import 'package:dating_touchme_app/network/user_api.dart'; import 'package:dating_touchme_app/pages/discover/live_end_page.dart'; import 'package:dating_touchme_app/pages/discover/settlement_page.dart'; import 'package:dating_touchme_app/widget/live/disconnect_mic_dialog.dart'; import 'package:dating_touchme_app/widget/live/kick_list.dart'; +import 'package:dating_touchme_app/widget/live/live_gift_popup.dart'; +import 'package:dating_touchme_app/widget/live/live_room_user_profile_dialog.dart'; import 'package:easy_refresh/easy_refresh.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -34,6 +40,59 @@ class LiveRoomUserHeader extends StatelessWidget { final VoidCallback? onFollowTap; final VoidCallback? onCloseTap; + + void _showGiftPopupForUser(RtcSeatUserInfo? userInfo, int type) async { + + // 获取 RoomController 判断当前用户角色 + final _roomController = Get.find(); + + if (userInfo == null) { + return; + } + + // 获取目标用户ID(优先使用userId,如果没有则使用miId) + final targetUserId = userInfo.uid; + + if (targetUserId == null) { + SmartDialog.showToast('用户ID不存在'); + return; + } + + // 刷新玫瑰数量 + await _roomController.getVirtualAccount(); + + // 创建必要的 ValueNotifier + final activeGift = ValueNotifier(null); + final giftNum = ValueNotifier(1); + _roomController.setDialogDismiss(true); + SmartDialog.show( + alignment: Alignment.bottomCenter, + maskColor: Colors.black.withOpacity(0.5), + onDismiss: (){ + _roomController.setDialogDismiss(false); + }, + builder: (context) { + return Obx(() { + // 获取礼物列表 + final giftProducts = _roomController.giftProducts; + final giftList = giftProducts.toList(); + + return LiveGiftPopup( + activeGift: activeGift, + giftNum: giftNum, + giftList: giftList, + changeActive: (index) { + activeGift.value = index; + }, + type: type, + showHeader: false, // 不显示头部 + targetUserId: targetUserId, // 设置目标用户ID + ); + }); + }, + ); + } + @override Widget build(BuildContext context) { // 获取 RoomController 判断当前用户角色 @@ -69,7 +128,57 @@ class LiveRoomUserHeader extends StatelessWidget { ); }, ), - ), + ).onTap(() async { + // 检查是否是当前用户自己的消息 + final currentUserId = GlobalData().userId ?? GlobalData().userData?.id; + if (currentUserId != null && currentUserId == roomController.rtcChannelDetail + .value?.anchorInfo?.userId) { + // 是自己的头像,不显示弹框 + return; + } + try { + final _userApi = Get.find(); + final response = await _userApi.getDongwoMarriageInformationDetail(miId: roomController.rtcChannelDetail + .value?.anchorInfo?.miId ?? ""); + if (response.data.isSuccess && response.data.data != null) { + + + // 不是自己的消息,显示用户资料对话框 + showUserProfileDialog( + context, + LiveChatMessage( + userId: roomController.rtcChannelDetail + .value?.anchorInfo?.userId ?? "", + uid: roomController.rtcChannelDetail + .value?.anchorInfo?.uid, + userName: roomController.rtcChannelDetail + .value?.anchorInfo?.nickName ?? "", + avatar: roomController.rtcChannelDetail + .value?.anchorInfo?.profilePhoto, + miId: roomController.rtcChannelDetail + .value?.anchorInfo?.miId, + content: "", + timestamp: 0 + ), + (int type) => + _showGiftPopupForUser(roomController.rtcChannelDetail + .value?.anchorInfo, type), + response.data.data! + ); + } else { + // 响应失败,设置错误信息 + final errorMsg = response.data.message ?? '获取数据失败'; + + SmartDialog.showToast(errorMsg); + } + } catch(e, stackTrace){ + print('获取用户信息失败: $e'); + print('堆栈跟踪: $stackTrace'); + + SmartDialog.showToast('获取用户信息失败,请稍后重试'); + // 不再 rethrow,避免导致闪退 + } + }), SizedBox(width: 7.w), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -120,7 +229,7 @@ class LiveRoomUserHeader extends StatelessWidget { GestureDetector( onTap: () async { roomController.audienceList.clear(); - await roomController.getAudienceList(); + await roomController.getAudienceList(null); // 隐藏键盘 FocusScope.of(context).unfocus(); // 隐藏 overlay diff --git a/lib/widget/live/live_room_user_profile_dialog.dart b/lib/widget/live/live_room_user_profile_dialog.dart index 153aada..d8a5a4e 100644 --- a/lib/widget/live/live_room_user_profile_dialog.dart +++ b/lib/widget/live/live_room_user_profile_dialog.dart @@ -14,7 +14,7 @@ import 'package:get/get.dart'; void showUserProfileDialog( BuildContext context, LiveChatMessage message, - VoidCallback onShowGiftPopup, + Function(int) onShowGiftPopup, UserInfoData userData, ) { @@ -71,7 +71,6 @@ void showUserProfileDialog( ), Row( children: [ - SizedBox(width: 30.w), // 用户名和标签 Expanded( child: Column( @@ -290,7 +289,7 @@ void showUserProfileDialog( ), child: Center( child: Text( - "提出房间", + "踢出房间", style: TextStyle( color: Colors.white ), @@ -325,13 +324,92 @@ void showUserProfileDialog( ), ).onTap(() async { SmartDialog.dismiss(); - onShowGiftPopup(); + onShowGiftPopup(2); + }), + ], + ), + if(!isHost) Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 165.w, + height: 35.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8.w)), + color: const Color.fromRGBO(253, 43, 84, 1), + gradient: const LinearGradient( + colors: [ + Color.fromRGBO(117, 98, 249, 1), + Color.fromRGBO(152, 124, 255, 1), + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + child: Center( + child: Text( + "私聊", + style: TextStyle( + color: Colors.white + ), + ), + ), + ).onTap(() async { + await roomController.inviteMic([{"userId": message.userId, "uid": message.uid}]); + + SmartDialog.dismiss(); + Get.to(() => ChatPage( + userId: message.userId, + )); + }), + + + + + if(!(userData.isFriend ?? false)) Container( + width: 165.w, + height: 35.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8 .w)), + color: const Color.fromRGBO(245, 154, 35, 1), + ), + child: Center( + child: Text( + "加好友", + style: TextStyle( + color: Colors.white + ), + ), + ), + ).onTap(() async { + SmartDialog.dismiss(); + onShowGiftPopup(2); + }), + + if(userData.isFriend ?? false) Container( + width: 165.w, + height: 35.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8 .w)), + color: const Color.fromRGBO(245, 154, 35, 1), + ), + child: Center( + child: Text( + "送礼物", + style: TextStyle( + color: Colors.white + ), + ), + ), + ).onTap(() async { + SmartDialog.dismiss(); + onShowGiftPopup(1); }), ], ), SizedBox(height: 15.w), // 底部操作链接 - Row( + if(isHost) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ _buildActionLink('私聊', () { @@ -366,7 +444,17 @@ void showUserProfileDialog( ), _buildActionLink('送礼物', () { SmartDialog.dismiss(); - onShowGiftPopup(); + onShowGiftPopup(1); + }), + ], + ), + // 底部操作链接 + if(!isHost) Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if(!(userData.isFriend ?? false)) _buildActionLink('送礼物', () { + SmartDialog.dismiss(); + onShowGiftPopup(1); }), ], ),