Browse Source

refactor(network): 移除冗余的 home_api.g.dart 文件

- 删除了由 RetrofitGenerator 生成的 _HomeApi 类实现
- 清理了不再使用的 Dio 请求封装逻辑
- 移除了过时的错误日志记录机制

chore(deps): 更新 pubspec.lock 中所有依赖源地址

- 将所有依赖包的下载源从 pub.dev 更改为 pub.flutter-io.cn
- 提升国内构建速度和稳定性
- 确保依赖解析的一致性

fix(live): 修正礼物弹窗用户 ID 类型不一致问题

- 统一 targetUserId 参数类型为 int?
- 修改 _selectedUserId 变量类型为 int?
- 调整 _toggleUserSelection 方法参数类型
- 更新用户选中状态判断条件
- 优化空值处理逻辑避免运行时异常
- 修复展示用户列表时 uid 使用错误问题
ios
Jolie 4 months ago
parent
commit
701a7304e5
8 changed files with 234 additions and 2027 deletions
  1. 12
      lib/controller/discover/room_controller.dart
  2. 4
      lib/controller/discover/svga_player_manager.dart
  3. 96
      lib/network/home_api.g.dart
  4. 464
      lib/network/rtc_api.g.dart
  5. 1229
      lib/network/user_api.g.dart
  6. 14
      lib/widget/live/live_gift_popup.dart
  7. 6
      lib/widget/live/live_room_anchor_showcase.dart
  8. 436
      pubspec.lock

12
lib/controller/discover/room_controller.dart

@ -362,7 +362,7 @@ class RoomController extends GetxController with WidgetsBindingObserver {
/// ///
Future<void> sendGift({ Future<void> sendGift({
required GiftProductModel gift, required GiftProductModel gift,
String? targetUserId,
required int targetUserId,
}) async { }) async {
try { try {
// //
@ -376,7 +376,7 @@ class RoomController extends GetxController with WidgetsBindingObserver {
final requestData = { final requestData = {
'channelId': int.tryParse(channelId) ?? 0, 'channelId': int.tryParse(channelId) ?? 0,
'type': 1, // 1. 2. 'type': 1, // 1. 2.
'toUId': targetUserId != null ? int.tryParse(targetUserId) ?? 0 : 0,
'toUId': targetUserId,
'productSpecId': int.tryParse(gift.productSpecId) ?? 0, 'productSpecId': int.tryParse(gift.productSpecId) ?? 0,
'quantity': 1, 'quantity': 1,
}; };
@ -399,7 +399,7 @@ class RoomController extends GetxController with WidgetsBindingObserver {
SvgaAnimationItem( SvgaAnimationItem(
svgaFile: gift.svgaFile, svgaFile: gift.svgaFile,
targetUserId: targetUserId, targetUserId: targetUserId,
senderUserId: GlobalData().userId ?? GlobalData().userData?.id,
senderUserId: rtcChannel.value?.uid,
giftProductId: gift.productId, giftProductId: gift.productId,
), ),
); );
@ -411,7 +411,7 @@ class RoomController extends GetxController with WidgetsBindingObserver {
'svgaFile': gift.svgaFile, 'svgaFile': gift.svgaFile,
'giftProductId': gift.productId, 'giftProductId': gift.productId,
'targetUserId': targetUserId, 'targetUserId': targetUserId,
'senderUserId': GlobalData().userId ?? GlobalData().userData?.id,
'senderUserId': rtcChannel.value?.uid,
'senderNickName': GlobalData().userData?.nickName ?? '', 'senderNickName': GlobalData().userData?.nickName ?? '',
}; };
@ -433,8 +433,8 @@ class RoomController extends GetxController with WidgetsBindingObserver {
try { try {
final svgaFile = message['svgaFile']?.toString() ?? ''; final svgaFile = message['svgaFile']?.toString() ?? '';
final giftProductId = message['giftProductId']?.toString(); final giftProductId = message['giftProductId']?.toString();
final targetUserId = message['targetUserId']?.toString();
final senderUserId = message['senderUserId']?.toString();
final targetUserId = message['targetUserId']?.toInt() ?? 0;
final senderUserId = message['senderUserId']?.toInt() ?? 0;
final senderNickName = message['senderNickName']?.toString() ?? ''; final senderNickName = message['senderNickName']?.toString() ?? '';
if (svgaFile.isNotEmpty) { if (svgaFile.isNotEmpty) {

4
lib/controller/discover/svga_player_manager.dart

@ -6,8 +6,8 @@ import 'package:get/get.dart';
/// SVGA /// SVGA
class SvgaAnimationItem { class SvgaAnimationItem {
final String svgaFile; final String svgaFile;
final String? targetUserId; // ID
final String? senderUserId; // ID
final int? targetUserId; // ID
final int? senderUserId; // ID
final String? giftProductId; // ID final String? giftProductId; // ID
SvgaAnimationItem({ SvgaAnimationItem({

96
lib/network/home_api.g.dart

@ -1,96 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'home_api.dart';
// dart format off
// **************************************************************************
// RetrofitGenerator
// **************************************************************************
// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations,unused_element_parameter
class _HomeApi implements HomeApi {
_HomeApi(this._dio, {this.baseUrl, this.errorLogger});
final Dio _dio;
String? baseUrl;
final ParseErrorLogger? errorLogger;
@override
Future<HttpResponse<BaseResponse<PaginatedResponse<dynamic>>>>
getMarriageList({
required int pageNum,
required int pageSize,
required int type,
}) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'pageNum': pageNum,
r'pageSize': pageSize,
r'type': type,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<PaginatedResponse<dynamic>>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-service/user/page/dongwo/marriage-information',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl),
),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<PaginatedResponse<dynamic>> _value;
try {
_value = BaseResponse<PaginatedResponse<dynamic>>.fromJson(
_result.data!,
(json) => PaginatedResponse<dynamic>.fromJson(
json as Map<String, dynamic>,
(json) => json as dynamic,
),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||
requestOptions.responseType == ResponseType.stream)) {
if (T == String) {
requestOptions.responseType = ResponseType.plain;
} else {
requestOptions.responseType = ResponseType.json;
}
}
return requestOptions;
}
String _combineBaseUrls(String dioBaseUrl, String? baseUrl) {
if (baseUrl == null || baseUrl.trim().isEmpty) {
return dioBaseUrl;
}
final url = Uri.parse(baseUrl);
if (url.isAbsolute) {
return url.toString();
}
return Uri.parse(dioBaseUrl).resolveUri(url).toString();
}
}
// dart format on

464
lib/network/rtc_api.g.dart

@ -1,464 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'rtc_api.dart';
// dart format off
// **************************************************************************
// RetrofitGenerator
// **************************************************************************
// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers,unused_element,unnecessary_string_interpolations,unused_element_parameter
class _RtcApi implements RtcApi {
_RtcApi(this._dio, {this.baseUrl, this.errorLogger});
final Dio _dio;
String? baseUrl;
final ParseErrorLogger? errorLogger;
@override
Future<HttpResponse<BaseResponse<RtcChannelData>>> getSwRtcToken(
String channelId,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{r'channelId': channelId};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<RtcChannelData>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/get/sw/rtc/token',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<RtcChannelData> _value;
try {
_value = BaseResponse<RtcChannelData>.fromJson(
_result.data!,
(json) => RtcChannelData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<RtcChannelData>>> getSwRtmToken() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<RtcChannelData>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/get/sw/rtm/token',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<RtcChannelData> _value;
try {
_value = BaseResponse<RtcChannelData>.fromJson(
_result.data!,
(json) => RtcChannelData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<RtcChannelData>>> createRtcChannel() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<RtcChannelData>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/create/rtc-channel',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<RtcChannelData> _value;
try {
_value = BaseResponse<RtcChannelData>.fromJson(
_result.data!,
(json) => RtcChannelData.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<RtcChannelDetail>>> getRtcChannelDetail(
String channelId,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{r'channelId': channelId};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<RtcChannelDetail>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/get/dating-rtc-channel/detail',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl),
),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<RtcChannelDetail> _value;
try {
_value = BaseResponse<RtcChannelDetail>.fromJson(
_result.data!,
(json) => RtcChannelDetail.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<dynamic>>> connectRtcChannel(
Map<String, dynamic> data,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(data);
final _options = _setStreamType<HttpResponse<BaseResponse<dynamic>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/connect/rtc-channel',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<dynamic> _value;
try {
_value = BaseResponse<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<RtcSeatUserInfo>>>
getDatingRtcChannelUserDetail(String channelId, int uId) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'channelId': channelId,
r'uId': uId,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<RtcSeatUserInfo>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/get/dating-rtc-channel-user/detail',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<RtcSeatUserInfo> _value;
try {
_value = BaseResponse<RtcSeatUserInfo>.fromJson(
_result.data!,
(json) => RtcSeatUserInfo.fromJson(json as Map<String, dynamic>),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<dynamic>>> enableRtcChannelUserAudio(
Map<String, dynamic> data,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(data);
final _options = _setStreamType<HttpResponse<BaseResponse<dynamic>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/enable/rtc-channel-user/audio',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<dynamic> _value;
try {
_value = BaseResponse<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<dynamic>>> disconnectRtcChannel(
Map<String, dynamic> data,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(data);
final _options = _setStreamType<HttpResponse<BaseResponse<dynamic>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/disconnect/rtc-channel',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<dynamic> _value;
try {
_value = BaseResponse<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<dynamic>>> destroyRtcChannel() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options = _setStreamType<HttpResponse<BaseResponse<dynamic>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/destroy/rtc-channel',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<dynamic> _value;
try {
_value = BaseResponse<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<PaginatedResponse<RtcChannelModel>>>>
getRtcChannelPage() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<
HttpResponse<BaseResponse<PaginatedResponse<RtcChannelModel>>>
>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/page/rtc-channel',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl),
),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<PaginatedResponse<RtcChannelModel>> _value;
try {
_value = BaseResponse<PaginatedResponse<RtcChannelModel>>.fromJson(
_result.data!,
(json) => PaginatedResponse<RtcChannelModel>.fromJson(
json as Map<String, dynamic>,
(json) => RtcChannelModel.fromJson(json as Map<String, dynamic>),
),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<List<GiftProductModel>>>>
listGiftProduct() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _options =
_setStreamType<HttpResponse<BaseResponse<List<GiftProductModel>>>>(
Options(method: 'GET', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-mall/user/list/gift-product',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl),
),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<List<GiftProductModel>> _value;
try {
_value = BaseResponse<List<GiftProductModel>>.fromJson(
_result.data!,
(json) => json is List<dynamic>
? json
.map<GiftProductModel>(
(i) => GiftProductModel.fromJson(i as Map<String, dynamic>),
)
.toList()
: List.empty(),
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
@override
Future<HttpResponse<BaseResponse<dynamic>>> costChannelGift(
Map<String, dynamic> data,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(data);
final _options = _setStreamType<HttpResponse<BaseResponse<dynamic>>>(
Options(method: 'POST', headers: _headers, extra: _extra)
.compose(
_dio.options,
'dating-agency-chat-audio/user/cost/channel-gift',
queryParameters: queryParameters,
data: _data,
)
.copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
);
final _result = await _dio.fetch<Map<String, dynamic>>(_options);
late BaseResponse<dynamic> _value;
try {
_value = BaseResponse<dynamic>.fromJson(
_result.data!,
(json) => json as dynamic,
);
} on Object catch (e, s) {
errorLogger?.logError(e, s, _options, _result);
rethrow;
}
final httpResponse = HttpResponse(_value, _result);
return httpResponse;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||
requestOptions.responseType == ResponseType.stream)) {
if (T == String) {
requestOptions.responseType = ResponseType.plain;
} else {
requestOptions.responseType = ResponseType.json;
}
}
return requestOptions;
}
String _combineBaseUrls(String dioBaseUrl, String? baseUrl) {
if (baseUrl == null || baseUrl.trim().isEmpty) {
return dioBaseUrl;
}
final url = Uri.parse(baseUrl);
if (url.isAbsolute) {
return url.toString();
}
return Uri.parse(dioBaseUrl).resolveUri(url).toString();
}
}
// dart format on

1229
lib/network/user_api.g.dart
File diff suppressed because it is too large
View File

14
lib/widget/live/live_gift_popup.dart

@ -26,7 +26,7 @@ class LiveGiftPopup extends StatefulWidget {
final List<dynamic> giftList; // List<Map> List<GiftProductModel> final List<dynamic> giftList; // List<Map> List<GiftProductModel>
final void Function(int) changeActive; final void Function(int) changeActive;
final bool showHeader; // final bool showHeader; //
final String? targetUserId; // ID
final int? targetUserId; // ID
@override @override
State<LiveGiftPopup> createState() => _LiveGiftPopupState(); State<LiveGiftPopup> createState() => _LiveGiftPopupState();
@ -34,7 +34,7 @@ class LiveGiftPopup extends StatefulWidget {
class _LiveGiftPopupState extends State<LiveGiftPopup> { class _LiveGiftPopupState extends State<LiveGiftPopup> {
// ID // ID
String? _selectedUserId;
int? _selectedUserId;
@override @override
void initState() { void initState() {
@ -50,7 +50,7 @@ class _LiveGiftPopupState extends State<LiveGiftPopup> {
} }
// //
void _toggleUserSelection(String userId) {
void _toggleUserSelection(int userId) {
setState(() { setState(() {
if (_selectedUserId == userId) { if (_selectedUserId == userId) {
// //
@ -74,7 +74,7 @@ class _LiveGiftPopupState extends State<LiveGiftPopup> {
} }
// showHeader为falsetargetUserId // showHeader为falsetargetUserId
if (_selectedUserId == null || _selectedUserId!.isEmpty) {
if (_selectedUserId == 0) {
if (widget.showHeader) { if (widget.showHeader) {
SmartDialog.showToast('请先选择接收礼物的用户'); SmartDialog.showToast('请先选择接收礼物的用户');
} }
@ -107,7 +107,7 @@ class _LiveGiftPopupState extends State<LiveGiftPopup> {
} }
// //
await roomController.sendGift(gift: gift, targetUserId: _selectedUserId);
await roomController.sendGift(gift: gift, targetUserId: _selectedUserId ?? 0);
SmartDialog.dismiss(); SmartDialog.dismiss();
} }
@ -208,9 +208,9 @@ class _LiveGiftPopupState extends State<LiveGiftPopup> {
...displayUsers.asMap().entries.map((entry) { ...displayUsers.asMap().entries.map((entry) {
final index = entry.key; final index = entry.key;
final user = entry.value; final user = entry.value;
final isSelected = _selectedUserId == user.userId;
final isSelected = _selectedUserId == user.uid;
return GestureDetector( return GestureDetector(
onTap: () => _toggleUserSelection(user.userId),
onTap: () => _toggleUserSelection(user.uid ?? 0),
child: Padding( child: Padding(
padding: EdgeInsets.only(right: 10.w), padding: EdgeInsets.only(right: 10.w),
child: Stack( child: Stack(

6
lib/widget/live/live_room_anchor_showcase.dart

@ -361,11 +361,7 @@ class _LiveRoomAnchorShowcaseState extends State<LiveRoomAnchorShowcase> {
} }
// ID使userId使miId // ID使userId使miId
final targetUserId = userInfo.userId.isNotEmpty
? userInfo.userId
: userInfo.miId.isNotEmpty
? userInfo.miId
: null;
final targetUserId = userInfo.uid;
if (targetUserId == null) { if (targetUserId == null) {
SmartDialog.showToast('用户ID不存在'); SmartDialog.showToast('用户ID不存在');

436
pubspec.lock
File diff suppressed because it is too large
View File

Loading…
Cancel
Save