From 24861e271806193601c4d41ccfba946f242fdab2 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Fri, 26 Dec 2025 21:41:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(live):=20=E6=B7=BB=E5=8A=A0=E8=BF=9E?= =?UTF-8?q?=E9=BA=A6=E5=8D=A1=E7=89=87=E5=92=8C=E7=8E=AB=E7=91=B0=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 API URL 中添加获取用户连麦卡片的接口 - 实现房间控制器中的连麦卡片和玫瑰数量响应式变量 - 添加获取用户道具连麦卡片和虚拟账户信息的网络请求方法 - 在直播页面中加载连麦卡片信息和玫瑰数量 - 实现连麦卡片文本显示功能,仅对男性用户在非直播状态显示 - 更新礼物弹窗中玫瑰数量的动态显示 - 生成对应的网络 API 代码实现 --- lib/controller/discover/room_controller.dart | 43 +++++++++++++++++++ lib/network/api_urls.dart | 3 ++ lib/network/rtc_api.dart | 5 +++ lib/network/rtc_api.g.dart | 35 +++++++++++++++ lib/pages/discover/live_room_page.dart | 19 ++++++++ lib/widget/live/live_gift_popup.dart | 14 ++++-- .../live/live_room_notice_chat_panel.dart | 39 ++++++++++++++--- 7 files changed, 147 insertions(+), 11 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 5e31248..857427e 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -3,6 +3,7 @@ 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'; +import 'package:dating_touchme_app/model/rtc/link_mic_card_model.dart'; 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'; @@ -49,6 +50,12 @@ class RoomController extends GetxController with WidgetsBindingObserver { /// 礼物产品列表 final RxList giftProducts = [].obs; + /// 连麦卡片信息 + final Rxn linkMicCard = Rxn(); + + /// 玫瑰数量 + final RxInt roseCount = 0.obs; + /// 消息服务实例 final LiveChatMessageService _messageService = LiveChatMessageService.instance; @@ -631,4 +638,40 @@ class RoomController extends GetxController with WidgetsBindingObserver { SmartDialog.showToast('踢出用户失败'); } } + + /// 获取用户道具连麦卡片 + Future getUserPropLinkMicCard() async { + try { + final response = await _networkService.rtcApi.getUserPropLinkMicCard(); + final base = response.data; + if (base.isSuccess && base.data != null) { + linkMicCard.value = base.data; + print('✅ 获取连麦卡片成功: type=${base.data!.type}, num=${base.data!.num}, unitSellingPrice=${base.data!.unitSellingPrice}'); + } else { + linkMicCard.value = null; + print('❌ 获取连麦卡片失败: ${base.message}'); + } + } catch (e) { + linkMicCard.value = null; + print('❌ 获取连麦卡片异常: $e'); + } + } + + /// 获取虚拟账户(玫瑰数量) + Future getVirtualAccount() async { + try { + final response = await _networkService.userApi.getVirtualAccount({}); + final base = response.data; + if (base.isSuccess && base.data != null) { + roseCount.value = base.data!.balance ?? 0; + print('✅ 获取玫瑰数量成功: ${roseCount.value}'); + } else { + roseCount.value = 0; + print('❌ 获取玫瑰数量失败: ${base.message}'); + } + } catch (e) { + roseCount.value = 0; + print('❌ 获取玫瑰数量异常: $e'); + } + } } diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 4c7da72..603ce0c 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -125,4 +125,7 @@ class ApiUrls { static const String listVisitorInfo = 'dating-agency-service/user/page/dongwo/visitor-info'; + + static const String getUserPropLinkMicCard = + 'dating-agency-chat-audio/user/get/user-prop/link-mic-card'; } diff --git a/lib/network/rtc_api.dart b/lib/network/rtc_api.dart index 7abf0d5..e3dc9a6 100644 --- a/lib/network/rtc_api.dart +++ b/lib/network/rtc_api.dart @@ -1,5 +1,6 @@ import 'package:dating_touchme_app/model/discover/rtc_channel_model.dart'; import 'package:dating_touchme_app/model/live/gift_product_model.dart'; +import 'package:dating_touchme_app/model/rtc/link_mic_card_model.dart'; 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/api_urls.dart'; @@ -88,4 +89,8 @@ abstract class RtcApi { Future>> kickingRtcChannelUser( @Body() Map data, ); + + /// 获取用户道具连麦卡片 + @GET(ApiUrls.getUserPropLinkMicCard) + Future>> getUserPropLinkMicCard(); } diff --git a/lib/network/rtc_api.g.dart b/lib/network/rtc_api.g.dart index 8f10ee6..fa855f3 100644 --- a/lib/network/rtc_api.g.dart +++ b/lib/network/rtc_api.g.dart @@ -501,6 +501,41 @@ class _RtcApi implements RtcApi { return httpResponse; } + @override + Future>> + getUserPropLinkMicCard() async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _options = + _setStreamType>>( + Options(method: 'GET', headers: _headers, extra: _extra) + .compose( + _dio.options, + 'dating-agency-chat-audio/user/get/user-prop/link-mic-card', + queryParameters: queryParameters, + data: _data, + ) + .copyWith( + baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl), + ), + ); + final _result = await _dio.fetch>(_options); + late BaseResponse _value; + try { + _value = BaseResponse.fromJson( + _result.data!, + (json) => LinkMicCardModel.fromJson(json as Map), + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + return httpResponse; + } + RequestOptions _setStreamType(RequestOptions requestOptions) { if (T != dynamic && !(requestOptions.responseType == ResponseType.bytes || diff --git a/lib/pages/discover/live_room_page.dart b/lib/pages/discover/live_room_page.dart index 301e7de..f8db0eb 100644 --- a/lib/pages/discover/live_room_page.dart +++ b/lib/pages/discover/live_room_page.dart @@ -1,4 +1,5 @@ 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:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -47,6 +48,24 @@ class _LiveRoomPageState extends State { _overlayController = Get.find(); // 启用屏幕常亮 WakelockPlus.enable(); + // 如果当前用户是男性,请求连麦卡片信息 + _loadLinkMicCard(); + // 请求玫瑰数量 + _loadRoseCount(); + } + + /// 加载连麦卡片信息(仅男性用户) + Future _loadLinkMicCard() async { + final userData = GlobalData().userData; + if (userData?.genderCode == 0) { + // 男性用户才请求 + await _roomController.getUserPropLinkMicCard(); + } + } + + /// 加载玫瑰数量 + Future _loadRoseCount() async { + await _roomController.getVirtualAccount(); } @override diff --git a/lib/widget/live/live_gift_popup.dart b/lib/widget/live/live_gift_popup.dart index 1e6c37b..23bf623 100644 --- a/lib/widget/live/live_gift_popup.dart +++ b/lib/widget/live/live_gift_popup.dart @@ -366,10 +366,16 @@ class _LiveGiftPopupState extends State { children: [ Image.asset(Assets.imagesRoseGift, width: 21.w, height: 21.w), SizedBox(width: 8.w), - Text( - "9", - style: TextStyle(fontSize: 13.w, color: Colors.white), - ), + Obx(() { + final roomController = Get.isRegistered() + ? Get.find() + : null; + final roseCount = roomController?.roseCount.value ?? 0; + return Text( + roseCount.toString(), + style: TextStyle(fontSize: 13.w, color: Colors.white), + ); + }), SizedBox(width: 12.w), ], ), diff --git a/lib/widget/live/live_room_notice_chat_panel.dart b/lib/widget/live/live_room_notice_chat_panel.dart index 30aa6ef..970ddbe 100644 --- a/lib/widget/live/live_room_notice_chat_panel.dart +++ b/lib/widget/live/live_room_notice_chat_panel.dart @@ -31,6 +31,36 @@ class _LiveRoomNoticeChatPanelState extends State { super.dispose(); } + /// 构建连麦卡片文本(仅男性用户显示) + Widget _buildLinkMicCardText() { + final userData = GlobalData().userData; + final isMale = userData?.genderCode == 0; + + // 女性用户不显示 + if (!isMale) { + return const SizedBox(); + } + + // 使用 Obx 监听连麦卡片数据和直播状态变化 + return Obx(() { + // 直播状态下不显示 + if (controller.isLive.value) { + return const SizedBox(); + } + + final linkMicCard = controller.linkMicCard.value; + final cardNum = linkMicCard?.num ?? 0; + + return Text( + '剩余$cardNum张相亲卡', + style: TextStyle( + fontSize: 9.w, + color: Colors.white.withOpacity(0.8), + ), + ); + }); + } + @override Widget build(BuildContext context) { return Container( @@ -111,13 +141,8 @@ class _LiveRoomNoticeChatPanelState extends State { ), ), SizedBox(height: 2.w), - controller.isLive.value ? const SizedBox() :Text( - '剩余2张相亲卡', - style: TextStyle( - fontSize: 9.w, - color: Colors.white.withOpacity(0.8), - ), - ), + // 只有男性用户且在非直播状态下才显示剩余相亲卡 + _buildLinkMicCardText(), ], ), ],