Browse Source

feat(live): 添加连麦卡片和玫瑰数量功能

- 在 API URL 中添加获取用户连麦卡片的接口
- 实现房间控制器中的连麦卡片和玫瑰数量响应式变量
- 添加获取用户道具连麦卡片和虚拟账户信息的网络请求方法
- 在直播页面中加载连麦卡片信息和玫瑰数量
- 实现连麦卡片文本显示功能,仅对男性用户在非直播状态显示
- 更新礼物弹窗中玫瑰数量的动态显示
- 生成对应的网络 API 代码实现
master
Jolie 3 months ago
parent
commit
24861e2718
7 changed files with 147 additions and 11 deletions
  1. 43
      lib/controller/discover/room_controller.dart
  2. 3
      lib/network/api_urls.dart
  3. 5
      lib/network/rtc_api.dart
  4. 35
      lib/network/rtc_api.g.dart
  5. 19
      lib/pages/discover/live_room_page.dart
  6. 14
      lib/widget/live/live_gift_popup.dart
  7. 39
      lib/widget/live/live_room_notice_chat_panel.dart

43
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<GiftProductModel> giftProducts = <GiftProductModel>[].obs;
///
final Rxn<LinkMicCardModel> linkMicCard = Rxn<LinkMicCardModel>();
///
final RxInt roseCount = 0.obs;
///
final LiveChatMessageService _messageService =
LiveChatMessageService.instance;
@ -631,4 +638,40 @@ class RoomController extends GetxController with WidgetsBindingObserver {
SmartDialog.showToast('踢出用户失败');
}
}
///
Future<void> 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<void> 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');
}
}
}

3
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';
}

5
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<HttpResponse<BaseResponse<dynamic>>> kickingRtcChannelUser(
@Body() Map<String, dynamic> data,
);
///
@GET(ApiUrls.getUserPropLinkMicCard)
Future<HttpResponse<BaseResponse<LinkMicCardModel>>> getUserPropLinkMicCard();
}

35
lib/network/rtc_api.g.dart

@ -501,6 +501,41 @@ class _RtcApi implements RtcApi {
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<LinkMicCardModel>>>
getUserPropLinkMicCard() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<LinkMicCardModel>>>(
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<Map<String, dynamic>>(_options);
late BaseResponse<LinkMicCardModel> _value;
try {
_value = BaseResponse<LinkMicCardModel>.fromJson(
_result.data!,
(json) => LinkMicCardModel.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||

19
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<LiveRoomPage> {
_overlayController = Get.find<OverlayController>();
//
WakelockPlus.enable();
//
_loadLinkMicCard();
//
_loadRoseCount();
}
///
Future<void> _loadLinkMicCard() async {
final userData = GlobalData().userData;
if (userData?.genderCode == 0) {
//
await _roomController.getUserPropLinkMicCard();
}
}
///
Future<void> _loadRoseCount() async {
await _roomController.getVirtualAccount();
}
@override

14
lib/widget/live/live_gift_popup.dart

@ -366,10 +366,16 @@ class _LiveGiftPopupState extends State<LiveGiftPopup> {
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<RoomController>()
? Get.find<RoomController>()
: null;
final roseCount = roomController?.roseCount.value ?? 0;
return Text(
roseCount.toString(),
style: TextStyle(fontSize: 13.w, color: Colors.white),
);
}),
SizedBox(width: 12.w),
],
),

39
lib/widget/live/live_room_notice_chat_panel.dart

@ -31,6 +31,36 @@ class _LiveRoomNoticeChatPanelState extends State<LiveRoomNoticeChatPanel> {
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<LiveRoomNoticeChatPanel> {
),
),
SizedBox(height: 2.w),
controller.isLive.value ? const SizedBox() :Text(
'剩余2张相亲卡',
style: TextStyle(
fontSize: 9.w,
color: Colors.white.withOpacity(0.8),
),
),
//
_buildLinkMicCardText(),
],
),
],

Loading…
Cancel
Save