From d3615127da9412849b6d735041eab45881ca6b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Wed, 26 Nov 2025 17:29:20 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E5=A2=9E=E5=8A=A0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B7=B3=E8=BD=AC=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/mine/rose_controller.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controller/mine/rose_controller.dart b/lib/controller/mine/rose_controller.dart index 15a576f..f5f954f 100644 --- a/lib/controller/mine/rose_controller.dart +++ b/lib/controller/mine/rose_controller.dart @@ -83,6 +83,7 @@ class RoseController extends GetxController { } else { fluwx.open(target: MiniProgram( username: 'gh_9ea8d46add6f', + miniProgramType: WXMiniProgramType.preview, path:"pages/index/index?amount=0.01&paymentOrderId=${data!.paymentOrderId}&url=match-fee" )); } From be353b2f4b99020b29020f7075d5715fc5db2026 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Wed, 26 Nov 2025 18:15:36 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=A4=B4=E5=83=8F=E5=A2=9E=E5=8A=A0=E7=A4=BA?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=B7=B3=E8=BD=AC=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/controller/mine/mine_controller.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controller/mine/mine_controller.dart b/lib/controller/mine/mine_controller.dart index f6c8a59..184e4ae 100644 --- a/lib/controller/mine/mine_controller.dart +++ b/lib/controller/mine/mine_controller.dart @@ -23,6 +23,7 @@ class MineController extends GetxController { {"icon": Assets.imagesWallet, "title": "我的钱包", "subTitle": "提现无门槛", "path": () => MyWalletPage()}, {"icon": Assets.imagesShop, "title": "商城中心", "subTitle": "不定期更新商品", "path": () => Null}, {"icon": Assets.imagesCert, "title": "认证中心", "subTitle": "未认证", "path": () => AuthCenterPage()}, + {"icon": Assets.imagesShop, "title": "红娘等级", "subTitle": "实习红娘", "path": () => Null}, ].obs; List settingList = [ From 1c841ea4da9e2b24b76d3df39c7f061ddbb171cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E8=B4=A4?= Date: Wed, 26 Nov 2025 18:33:36 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BA=A2=E5=A8=98?= =?UTF-8?q?=E7=AD=89=E7=BA=A7=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=98=B5=E7=A7=B0?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E5=AE=BD=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/pages/mine/mine_page.dart | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/pages/mine/mine_page.dart b/lib/pages/mine/mine_page.dart index 9ff3512..cbfa843 100644 --- a/lib/pages/mine/mine_page.dart +++ b/lib/pages/mine/mine_page.dart @@ -99,12 +99,19 @@ class _MinePageState extends State with AutomaticKeepAliveClientMixin{ children: [ Row( children: [ - Text( - "${controller.userData.value?.nickName ?? ""}", - style: TextStyle( - fontSize: 18.w, - color: const Color.fromRGBO(51, 51, 51, 1), - fontWeight: FontWeight.w700 + ConstrainedBox( + constraints: BoxConstraints( + maxWidth: 120.w, // 最大宽度 + ), + child: Text( + "${controller.userData.value?.nickName ?? ""}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 18.w, + color: const Color.fromRGBO(51, 51, 51, 1), + fontWeight: FontWeight.w700 + ), ), ), SizedBox(width: 8.w,), From 540e152f14df224f7c2fdf0b041d2c72658924d8 Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Wed, 26 Nov 2025 21:42:44 +0800 Subject: [PATCH 4/8] =?UTF-8?q?feat(live):=20=E5=AE=9E=E7=8E=B0=E7=A4=BC?= =?UTF-8?q?=E7=89=A9=E5=BC=B9=E7=AA=97=E7=94=A8=E6=88=B7=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E4=B8=8E=E7=A4=BC=E7=89=A9=E5=B1=95=E7=A4=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 LiveGiftPopup 从 StatelessWidget 改为 StatefulWidget 以支持状态管理 - 新增用户选择逻辑,支持单个用户选中与全选/取消全选功能 - 使用 Obx 监听 RoomController 中的 RTC 频道详情动态构建用户列表 - 过滤掉当前用户自身,最多显示三个可送礼用户 - 用户头像使用 CachedNetworkImage 加载,支持加载占位与错误处理 - 礼物区域支持分页展示,每页最多 8 个礼物(2 行 4 列) - 支持 Map 和 GiftProductModel 两种数据结构的礼物列表渲染 - LiveRoomGiftItem 组件适配网络图片加载与文本截断显示 - 动态获取并显示礼物名称与价格(单位:支) - 优化空礼物列表提示与 UI 布局细节 --- lib/controller/discover/room_controller.dart | 70 +++++++- lib/widget/live/live_gift_popup.dart | 164 +++++++++---------- 2 files changed, 149 insertions(+), 85 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 7b57bbb..3819ea6 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -2,6 +2,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/controller/live/svga_player_manager.dart'; import 'package:dating_touchme_app/model/live/gift_product_model.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_data.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; @@ -331,9 +332,76 @@ class RoomController extends GetxController { } } + /// 赠送礼物 + Future sendGift({ + required GiftProductModel gift, + String? targetUserId, + }) async { + try { + // 添加到本地播放队列 + final svgaManager = SvgaPlayerManager.instance; + svgaManager.addToQueue( + SvgaAnimationItem( + svgaFile: gift.svgaFile, + targetUserId: targetUserId, + senderUserId: GlobalData().userId ?? GlobalData().userData?.id, + giftProductId: gift.productId, + ), + ); + print('✅ 礼物已添加到播放队列: ${gift.productTitle}'); + + // 发送 RTM 消息通知其他用户 + final channelId = RTCManager.instance.currentChannelId; + if (channelId != null && channelId.isNotEmpty) { + final messageData = { + 'type': 'gift', + 'svgaFile': gift.svgaFile, + 'giftProductId': gift.productId, + 'targetUserId': targetUserId, + 'senderUserId': GlobalData().userId ?? GlobalData().userData?.id, + 'senderNickName': GlobalData().userData?.nickName ?? '', + }; + + await RTMManager.instance.publishChannelMessage( + channelName: channelId, + message: json.encode(messageData), + ); + print('✅ 礼物消息已发送: ${gift.productTitle}'); + } + } catch (e) { + print('❌ 发送礼物失败: $e'); + SmartDialog.showToast('发送礼物失败'); + } + } + /// 接收RTC消息 Future receiveRTCMessage(Map message) async { - if (message['type'] == 'join_chat') { + if (message['type'] == 'gift') { + // 处理礼物消息 + try { + final svgaFile = message['svgaFile']?.toString() ?? ''; + final giftProductId = message['giftProductId']?.toString(); + final targetUserId = message['targetUserId']?.toString(); + final senderUserId = message['senderUserId']?.toString(); + final senderNickName = message['senderNickName']?.toString() ?? ''; + + if (svgaFile.isNotEmpty) { + // 添加到播放队列 + final svgaManager = SvgaPlayerManager.instance; + svgaManager.addToQueue( + SvgaAnimationItem( + svgaFile: svgaFile, + targetUserId: targetUserId, + senderUserId: senderUserId, + giftProductId: giftProductId, + ), + ); + print('✅ 收到礼物消息,已添加到播放队列: $senderNickName 赠送了礼物'); + } + } catch (e) { + print('❌ 处理礼物消息失败: $e'); + } + } else if (message['type'] == 'join_chat') { final response = await _networkService.rtcApi .getDatingRtcChannelUserDetail( rtcChannel.value!.channelId, diff --git a/lib/widget/live/live_gift_popup.dart b/lib/widget/live/live_gift_popup.dart index 0da1d71..73d23d8 100644 --- a/lib/widget/live/live_gift_popup.dart +++ b/lib/widget/live/live_gift_popup.dart @@ -2,10 +2,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:dating_touchme_app/model/live/gift_product_model.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; import 'package:dating_touchme_app/widget/live/live_room_gift_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart'; import 'package:get/get.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; @@ -29,34 +31,71 @@ class LiveGiftPopup extends StatefulWidget { } class _LiveGiftPopupState extends State { - // 选中的用户ID集合 - final Set _selectedUserIds = {}; + // 选中的用户ID(单选) + String? _selectedUserId; - // 切换用户选中状态 + // 切换用户选中状态(单选模式) void _toggleUserSelection(String userId) { setState(() { - if (_selectedUserIds.contains(userId)) { - _selectedUserIds.remove(userId); + if (_selectedUserId == userId) { + // 如果点击的是已选中的用户,则取消选中 + _selectedUserId = null; } else { - _selectedUserIds.add(userId); + // 否则选中该用户(自动取消之前的选中) + _selectedUserId = userId; } }); } - // 全选/取消全选 - void _toggleSelectAll(List users) { - setState(() { - if (_selectedUserIds.length == users.length) { - // 如果已全选,则取消全选 - _selectedUserIds.clear(); - } else { - // 否则全选 - _selectedUserIds.clear(); - for (var user in users) { - _selectedUserIds.add(user.userId); - } - } - }); + // 处理赠送礼物 + Future _handleSendGift() async { + // 检查是否选中了礼物 + final activeIndex = widget.activeGift.value; + if (activeIndex == null || + activeIndex < 0 || + activeIndex >= widget.giftList.length) { + SmartDialog.showToast('请先选择礼物'); + return; + } + + // 检查是否选中了接收用户 + if (_selectedUserId == null || _selectedUserId!.isEmpty) { + SmartDialog.showToast('请先选择接收礼物的用户'); + return; + } + + // 获取选中的礼物 + final giftItem = widget.giftList[activeIndex]; + GiftProductModel? gift; + + if (giftItem is GiftProductModel) { + gift = giftItem; + } else if (giftItem is Map) { + // 如果是 Map,需要从 RoomController 的 giftProducts 中查找 + SmartDialog.showToast('礼物数据格式错误'); + return; + } else { + SmartDialog.showToast('礼物数据格式错误'); + return; + } + + // 获取 RoomController + final roomController = Get.isRegistered() + ? Get.find() + : null; + + if (roomController == null) { + SmartDialog.showToast('房间控制器未初始化'); + return; + } + + // 发送礼物 + await roomController.sendGift(gift: gift, targetUserId: _selectedUserId); + + // 关闭弹窗 + SmartDialog.dismiss(); + + SmartDialog.showToast('礼物已送出'); } @override @@ -141,7 +180,7 @@ class _LiveGiftPopupState extends State { ...displayUsers.asMap().entries.map((entry) { final index = entry.key; final user = entry.value; - final isSelected = _selectedUserIds.contains(user.userId); + final isSelected = _selectedUserId == user.userId; return GestureDetector( onTap: () => _toggleUserSelection(user.userId), child: Padding( @@ -228,27 +267,6 @@ class _LiveGiftPopupState extends State { }), ], ), - // 如果列表为空,不显示全选按钮 - if (displayUsers.isNotEmpty) - GestureDetector( - onTap: () => _toggleSelectAll(displayUsers), - child: Container( - width: 63.w, - height: 30.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.w)), - color: const Color.fromRGBO(117, 98, 249, 1), - ), - child: Center( - child: Text( - _selectedUserIds.length == displayUsers.length - ? "取消全选" - : "全选", - style: TextStyle(fontSize: 13.w, color: Colors.white), - ), - ), - ), - ), ], ), ); @@ -371,49 +389,27 @@ class _LiveGiftPopupState extends State { builder: (context, num, _) { return Row( children: [ - _buildAdjustButton( - label: "-", - enabled: num > 1, - onTap: () { - if (widget.giftNum.value <= 1) return; - widget.giftNum.value -= 1; - }, - ), - SizedBox( - width: 23.w, - child: Center( - child: Text( - "$num", - style: TextStyle(fontSize: 13.w, color: Colors.white), + GestureDetector( + onTap: () => _handleSendGift(), + child: Container( + width: 63.w, + height: 30.w, + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(30.w)), + gradient: const LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + Color.fromRGBO(61, 138, 224, 1), + Color.fromRGBO(131, 89, 255, 1), + ], + ), ), - ), - ), - _buildAdjustButton( - label: "+", - enabled: true, - onTap: () { - widget.giftNum.value += 1; - }, - ), - SizedBox(width: 9.w), - Container( - width: 63.w, - height: 30.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(30.w)), - gradient: const LinearGradient( - begin: Alignment.centerLeft, - end: Alignment.centerRight, - colors: [ - Color.fromRGBO(61, 138, 224, 1), - Color.fromRGBO(131, 89, 255, 1), - ], - ), - ), - child: Center( - child: Text( - "赠送", - style: TextStyle(fontSize: 13.w, color: Colors.white), + child: Center( + child: Text( + "赠送", + style: TextStyle(fontSize: 13.w, color: Colors.white), + ), ), ), ), From d6e85c12207aae332bd268acefc5cdb07577991e Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Wed, 26 Nov 2025 21:44:18 +0800 Subject: [PATCH 5/8] =?UTF-8?q?feat(discover):=20=E5=AE=9E=E7=8E=B0SVGA?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=E6=92=AD=E6=94=BE=E7=AE=A1=E7=90=86=E5=99=A8?= =?UTF-8?q?=E5=92=8C=E6=92=AD=E6=94=BE=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 SvgaPlayerManager 管理SVGA动画播放队列 - 创建 SvgaPlayerWidget 用于实际播放SVGA动画 - 支持本地assets和网络URL两种SVGA文件加载方式 - 实现动画播放完成和错误处理回调机制 - 提供队列控制方法如添加、清空、停止播放等功能 - 修复房间控制器中SVGA播放器导入路径错误问题 --- lib/controller/discover/room_controller.dart | 2 +- .../discover/svga_player_manager.dart | 86 +++++++++++++++ lib/widget/live/svga_player_widget.dart | 104 ++++++++++++++++++ 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 lib/controller/discover/svga_player_manager.dart create mode 100644 lib/widget/live/svga_player_widget.dart diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 3819ea6..984dc77 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -2,7 +2,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/controller/live/svga_player_manager.dart'; +import 'package:dating_touchme_app/controller/discover/svga_player_manager.dart'; import 'package:dating_touchme_app/model/live/gift_product_model.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_data.dart'; import 'package:dating_touchme_app/model/rtc/rtc_channel_detail.dart'; diff --git a/lib/controller/discover/svga_player_manager.dart b/lib/controller/discover/svga_player_manager.dart new file mode 100644 index 0000000..ffb9ede --- /dev/null +++ b/lib/controller/discover/svga_player_manager.dart @@ -0,0 +1,86 @@ +import 'dart:collection'; +import 'package:flutter/material.dart'; +import 'package:flutter_svga/flutter_svga.dart'; +import 'package:get/get.dart'; + +/// SVGA 动画项 +class SvgaAnimationItem { + final String svgaFile; + final String? targetUserId; // 接收礼物的用户ID + final String? senderUserId; // 发送礼物的用户ID + final String? giftProductId; // 礼物产品ID + + SvgaAnimationItem({ + required this.svgaFile, + this.targetUserId, + this.senderUserId, + this.giftProductId, + }); +} + +/// SVGA 动画播放队列管理器 +/// 注意:由于 SVGAAnimationController 需要 vsync,实际播放需要在 Widget 中完成 +/// 这个管理器只负责管理队列,实际的播放需要通过回调通知外部 Widget +class SvgaPlayerManager extends GetxController { + static SvgaPlayerManager? _instance; + static SvgaPlayerManager get instance { + _instance ??= Get.put(SvgaPlayerManager()); + return _instance!; + } + + final Queue _animationQueue = Queue(); + final Rx currentItem = Rx(null); + final RxBool isPlaying = false.obs; + + /// 添加动画到队列 + void addToQueue(SvgaAnimationItem item) { + _animationQueue.add(item); + _playNext(); + } + + /// 播放下一个动画 + void _playNext() { + if (isPlaying.value || _animationQueue.isEmpty) { + return; + } + + final item = _animationQueue.removeFirst(); + currentItem.value = item; + isPlaying.value = true; + print('✅ SVGA 动画已添加到播放队列: ${item.svgaFile}'); + } + + /// 标记当前动画播放完成 + void onAnimationFinished() { + print('✅ SVGA 动画播放完成'); + isPlaying.value = false; + currentItem.value = null; + // 播放下一个 + _playNext(); + } + + /// 标记当前动画播放失败 + void onAnimationError(String error) { + print('❌ SVGA 动画播放失败: $error'); + isPlaying.value = false; + currentItem.value = null; + // 继续播放下一个 + _playNext(); + } + + /// 停止当前播放 + void stop() { + isPlaying.value = false; + currentItem.value = null; + } + + /// 清空队列 + void clearQueue() { + stop(); + _animationQueue.clear(); + } + + /// 获取队列长度 + int get queueLength => _animationQueue.length; +} + diff --git a/lib/widget/live/svga_player_widget.dart b/lib/widget/live/svga_player_widget.dart new file mode 100644 index 0000000..052f038 --- /dev/null +++ b/lib/widget/live/svga_player_widget.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svga/flutter_svga.dart'; +import 'package:get/get.dart'; +import 'package:dating_touchme_app/controller/discover/svga_player_manager.dart'; + +/// SVGA 动画播放 Widget +/// 监听 SvgaPlayerManager 的队列,自动播放 SVGA 动画 +class SvgaPlayerWidget extends StatefulWidget { + const SvgaPlayerWidget({super.key}); + + @override + State createState() => _SvgaPlayerWidgetState(); +} + +class _SvgaPlayerWidgetState extends State + with SingleTickerProviderStateMixin { + final SvgaPlayerManager _manager = SvgaPlayerManager.instance; + SVGAAnimationController? _controller; + SvgaAnimationItem? _currentItem; + + @override + void initState() { + super.initState(); + // 监听队列变化 + ever(_manager.currentItem, (item) { + if (item != null && item != _currentItem) { + _playAnimation(item); + } + }); + } + + @override + void dispose() { + _controller?.dispose(); + super.dispose(); + } + + /// 播放动画 + Future _playAnimation(SvgaAnimationItem item) async { + // 如果正在播放,先停止 + if (_controller != null) { + _controller!.dispose(); + _controller = null; + } + + _currentItem = item; + _controller = SVGAAnimationController(vsync: this); + + try { + // 判断是网络 URL 还是本地资源 + if (item.svgaFile.startsWith('http://') || + item.svgaFile.startsWith('https://')) { + // 网络 URL + SVGAParser.shared.decodeFromURL(item.svgaFile).then((video) { + if (mounted && _currentItem == item) { + _controller!.videoItem = video; + _controller!.repeat(); + print('✅ SVGA 动画加载成功(网络): ${item.svgaFile}'); + } + }).catchError((error) { + print('❌ SVGA 动画加载失败(网络): $error'); + _manager.onAnimationError(error.toString()); + }); + } else { + // 本地资源(assets) + SVGAParser.shared.decodeFromAssets(item.svgaFile).then((video) { + if (mounted && _currentItem == item) { + _controller!.videoItem = video; + _controller!.repeat(); + print('✅ SVGA 动画加载成功(本地): ${item.svgaFile}'); + } + }).catchError((error) { + print('❌ SVGA 动画加载失败(本地): $error'); + _manager.onAnimationError(error.toString()); + }); + } + + // 监听动画完成(repeat 模式不会自动完成,需要手动停止) + // 这里可以根据需要调整播放逻辑 + } catch (e) { + print('❌ SVGA 播放异常: $e'); + _manager.onAnimationError(e.toString()); + } + } + + @override + Widget build(BuildContext context) { + return Obx(() { + final currentItem = _manager.currentItem.value; + final isPlaying = _manager.isPlaying.value; + + if (!isPlaying || currentItem == null || _controller == null) { + return const SizedBox.shrink(); + } + + return Positioned.fill( + child: IgnorePointer( + child: SVGAImage(_controller!), + ), + ); + }); + } +} + From 835b703744ba6779615aadc2e629cc4abfc496e3 Mon Sep 17 00:00:00 2001 From: Jolie <> Date: Wed, 26 Nov 2025 23:35:48 +0800 Subject: [PATCH 6/8] no message --- ios/Podfile | 9 +- pubspec.lock | 450 +++++++++++++++++++++++++-------------------------- pubspec.yaml | 2 +- 3 files changed, 228 insertions(+), 233 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 0cbf306..5aa1473 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -27,7 +27,7 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup -platform :ios, '13.0' +platform :ios, '14.0' # 在 target 'Runner' do 之前添加 install! 'cocoapods', :deterministic_uuids => false @@ -37,11 +37,6 @@ target 'Runner' do flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) - - # 强制使用较新的 AgoraInfra_iOS 版本 - pod 'AgoraInfra_iOS', '1.2.13.1' - - target 'RunnerTests' do inherit! :search_paths @@ -53,7 +48,7 @@ post_install do |installer| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0' end end end diff --git a/pubspec.lock b/pubspec.lock index 83bf62a..0b8ee06 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "88.0.0" agora_rtc_engine: @@ -14,7 +14,7 @@ packages: description: name: agora_rtc_engine sha256: "6559294d18ce4445420e19dbdba10fb58cac955cd8f22dbceae26716e194d70e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.5.3" agora_rtm: @@ -22,7 +22,7 @@ packages: description: name: agora_rtm sha256: "3cd8e25ecfccbb2e8ca5a70b173bff080dab782e233f9b40f483adbd31dd38fb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.5" agora_token_generator: @@ -30,7 +30,7 @@ packages: description: name: agora_token_generator sha256: eeb53d753430b6d6227b05ace89655cd7990b3137a236937825699d528377904 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" analyzer: @@ -38,7 +38,7 @@ packages: description: name: analyzer sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.1.1" ansicolor: @@ -46,7 +46,7 @@ packages: description: name: ansicolor sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" app_settings: @@ -54,7 +54,7 @@ packages: description: name: app_settings sha256: "3e46c561441e5820d3a25339bf8b51b9e45a5f686873851a20c257a530917795" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.1" archive: @@ -62,7 +62,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.7" args: @@ -70,7 +70,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" async: @@ -78,7 +78,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.13.0" audioplayers: @@ -86,7 +86,7 @@ packages: description: name: audioplayers sha256: "5441fa0ceb8807a5ad701199806510e56afde2b4913d9d17c2f19f2902cf0ae4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.5.1" audioplayers_android: @@ -94,7 +94,7 @@ packages: description: name: audioplayers_android sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.2.1" audioplayers_darwin: @@ -102,7 +102,7 @@ packages: description: name: audioplayers_darwin sha256: "0811d6924904ca13f9ef90d19081e4a87f7297ddc19fc3d31f60af1aaafee333" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.3.0" audioplayers_linux: @@ -110,7 +110,7 @@ packages: description: name: audioplayers_linux sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.2.1" audioplayers_platform_interface: @@ -118,7 +118,7 @@ packages: description: name: audioplayers_platform_interface sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.1.1" audioplayers_web: @@ -126,7 +126,7 @@ packages: description: name: audioplayers_web sha256: "1c0f17cec68455556775f1e50ca85c40c05c714a99c5eb1d2d57cc17ba5522d7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" audioplayers_windows: @@ -134,7 +134,7 @@ packages: description: name: audioplayers_windows sha256: "4048797865105b26d47628e6abb49231ea5de84884160229251f37dfcbe52fd7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.2.1" boolean_selector: @@ -142,23 +142,23 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" build: dependency: transitive description: name: build - sha256: dfb67ccc9a78c642193e0c2d94cb9e48c2c818b3178a86097d644acdcde6a8d9 - url: "https://pub.flutter-io.cn" + sha256: c1668065e9ba04752570ad7e038288559d1e2ca5c6d0131c0f5f55e39e777413 + url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" build_config: dependency: transitive description: name: build_config sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" build_daemon: @@ -166,23 +166,23 @@ packages: description: name: build_daemon sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.1" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "7b5b569f3df370590a85029148d6fc66c7d0201fc6f1847c07dd85d365ae9fcd" - url: "https://pub.flutter-io.cn" + sha256: "110c56ef29b5eb367b4d17fc79375fa8c18a6cd7acd92c05bb3986c17a079057" + url: "https://pub.dev" source: hosted - version: "2.10.3" + version: "2.10.4" built_collection: dependency: transitive description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" built_value: @@ -190,7 +190,7 @@ packages: description: name: built_value sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "8.12.0" cached_network_image: @@ -198,7 +198,7 @@ packages: description: name: cached_network_image sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.1" cached_network_image_platform_interface: @@ -206,7 +206,7 @@ packages: description: name: cached_network_image_platform_interface sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.1" cached_network_image_web: @@ -214,7 +214,7 @@ packages: description: name: cached_network_image_web sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.1" camera: @@ -222,7 +222,7 @@ packages: description: name: camera sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.10.6" camera_android: @@ -230,7 +230,7 @@ packages: description: name: camera_android sha256: "292c96d986feda7ae5882abe633423c6e70ab4579c038ab78711010f5d7ecf5c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.10.10+13" camera_avfoundation: @@ -238,7 +238,7 @@ packages: description: name: camera_avfoundation sha256: "035b90c1e33c2efad7548f402572078f6e514d4f82be0a315cd6c6af7e855aa8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.22+6" camera_platform_interface: @@ -246,23 +246,23 @@ packages: description: name: camera_platform_interface sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.12.0" camera_web: dependency: transitive description: name: camera_web - sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" - url: "https://pub.flutter-io.cn" + sha256: "77e53acb64d9de8917424eeb32b5c7c73572d1e00954bbf54a1e609d79a751a2" + url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+1" characters: dependency: transitive description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" checked_yaml: @@ -270,7 +270,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.4" chewie: @@ -278,7 +278,7 @@ packages: description: name: chewie sha256: "44bcfc5f0dfd1de290c87c9d86a61308b3282a70b63435d5557cfd60f54a69ca" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.13.0" clock: @@ -286,7 +286,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" code_builder: @@ -294,7 +294,7 @@ packages: description: name: code_builder sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.11.0" collection: @@ -302,7 +302,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.19.1" common_utils: @@ -310,7 +310,7 @@ packages: description: name: common_utils sha256: c26884339b13ff99b0739e56f4b02090c84054ed9dd3a045435cd24e7b99c2c1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" convert: @@ -318,23 +318,23 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" cross_file: dependency: transitive description: name: cross_file - sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" - url: "https://pub.flutter-io.cn" + sha256: "701dcfc06da0882883a2657c445103380e53e647060ad8d9dfb710c100996608" + url: "https://pub.dev" source: hosted - version: "0.3.5" + version: "0.3.5+1" crypto: dependency: transitive description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.7" csslib: @@ -342,7 +342,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" cupertino_icons: @@ -350,7 +350,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.8" dart_style: @@ -358,7 +358,7 @@ packages: description: name: dart_style sha256: c87dfe3d56f183ffe9106a18aebc6db431fc7c98c31a54b952a77f3d54a85697 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" dbus: @@ -366,7 +366,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.11" decimal: @@ -374,7 +374,7 @@ packages: description: name: decimal sha256: fc706a5618b81e5b367b01dd62621def37abc096f2b46a9bd9068b64c1fa36d0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.4" dio: @@ -382,7 +382,7 @@ packages: description: name: dio sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.0" dio_web_adapter: @@ -390,7 +390,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" easy_localization: @@ -398,7 +398,7 @@ packages: description: name: easy_localization sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.8" easy_logger: @@ -406,7 +406,7 @@ packages: description: name: easy_logger sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.0.2" easy_refresh: @@ -414,7 +414,7 @@ packages: description: name: easy_refresh sha256: "486e30abfcaae66c0f2c2798a10de2298eb9dc5e0bb7e1dba9328308968cae0c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.0" event_bus: @@ -422,7 +422,7 @@ packages: description: name: event_bus sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" extended_image: @@ -430,7 +430,7 @@ packages: description: name: extended_image sha256: "85199f9233e03abc2ce2e68cbb2991648666af4a527ae4e6250935be8edfddae" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.1.0" extended_image_library: @@ -438,7 +438,7 @@ packages: description: name: extended_image_library sha256: e61dafd94400fff6ef7ed1523d445ff3af137f198f3228e4a3107bc5b4bec5d1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.6" fake_async: @@ -446,7 +446,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.3" ffi: @@ -454,7 +454,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" file: @@ -462,7 +462,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" file_selector_linux: @@ -470,7 +470,7 @@ packages: description: name: file_selector_linux sha256: "80a877f5ec570c4fb3b40720a70b6f31e8bb1315a464b4d3e92fe82754d4b21a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+3" file_selector_macos: @@ -478,7 +478,7 @@ packages: description: name: file_selector_macos sha256: "44f24d102e368370951b98ffe86c7325b38349e634578312976607d28cc6d747" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.4+6" file_selector_platform_interface: @@ -486,7 +486,7 @@ packages: description: name: file_selector_platform_interface sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.7.0" file_selector_windows: @@ -494,7 +494,7 @@ packages: description: name: file_selector_windows sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.9.3+5" fixnum: @@ -502,7 +502,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" flustars: @@ -510,7 +510,7 @@ packages: description: name: flustars sha256: "7019ab8d68c0d4759ee122644d91a165d450b0492717f9e7e9d0ce277dcf664b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" flutter: @@ -523,7 +523,7 @@ packages: description: name: flutter_cache_manager sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.1" flutter_lints: @@ -531,7 +531,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.0.0" flutter_localizations: @@ -544,7 +544,7 @@ packages: description: name: flutter_native_splash sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.7" flutter_oss_aliyun: @@ -552,7 +552,7 @@ packages: description: name: flutter_oss_aliyun sha256: "8280c1e8dfb792dec6449d1e6052e1d3492b3b3a1dfee456cc41d3f31b4cbc26" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.4.2" flutter_plugin_android_lifecycle: @@ -560,7 +560,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.32" flutter_screenutil: @@ -568,7 +568,7 @@ packages: description: name: flutter_screenutil sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.9.3" flutter_slidable: @@ -576,7 +576,7 @@ packages: description: name: flutter_slidable sha256: a857de7ea701f276fd6a6c4c67ae885b60729a3449e42766bb0e655171042801 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.2" flutter_smart_dialog: @@ -584,7 +584,7 @@ packages: description: name: flutter_smart_dialog sha256: "0852df132cb03fd8fc5144eb404c31eb7eb50c22aecb1cc2504f2f598090d756" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.8+9" flutter_swiper_null_safety: @@ -592,7 +592,7 @@ packages: description: name: flutter_swiper_null_safety sha256: "5a855e0080d035c08e82f8b7fd2f106344943a30c9ab483b2584860a2f22eaaf" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.2" flutter_test: @@ -610,7 +610,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" get: @@ -618,7 +618,7 @@ packages: description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.7.2" get_storage: @@ -626,7 +626,7 @@ packages: description: name: get_storage sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" glob: @@ -634,7 +634,7 @@ packages: description: name: glob sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.3" graphs: @@ -642,7 +642,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.2" hotreloader: @@ -650,7 +650,7 @@ packages: description: name: hotreloader sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" html: @@ -658,7 +658,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.15.6" http: @@ -666,7 +666,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.6.0" http_client_helper: @@ -674,7 +674,7 @@ packages: description: name: http_client_helper sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" http_multi_server: @@ -682,7 +682,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.2" http_parser: @@ -690,7 +690,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.1.2" im_flutter_sdk: @@ -698,7 +698,7 @@ packages: description: name: im_flutter_sdk sha256: "5f81988c5edf14a4e3868b9c47f01de2ee355e2203ae5bd95d7cacfe30e15d97" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.2" im_flutter_sdk_android: @@ -706,7 +706,7 @@ packages: description: name: im_flutter_sdk_android sha256: ce4e01f1374a6cf20bb46f6774e1effbde5c014fd1cd3003b6604813e4fe9e71 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.2" im_flutter_sdk_interface: @@ -714,7 +714,7 @@ packages: description: name: im_flutter_sdk_interface sha256: "08ad3ce9fc935e24272bce34aebfd9b3c3c30aab2b9e7d4b2e759acf4a4874f5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.2" im_flutter_sdk_ios: @@ -722,7 +722,7 @@ packages: description: name: im_flutter_sdk_ios sha256: "11300c086f5821730224932c28860198ef5d879f7941f9158dddee499f7bb60e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.15.2" image: @@ -730,7 +730,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.4" image_picker: @@ -738,7 +738,7 @@ packages: description: name: image_picker sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" image_picker_android: @@ -746,23 +746,23 @@ packages: description: name: image_picker_android sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.12+23" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" - url: "https://pub.flutter-io.cn" + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" image_picker_ios: dependency: transitive description: name: image_picker_ios sha256: "997d100ce1dda5b1ba4085194c5e36c9f8a1fb7987f6a36ab677a344cd2dc986" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.8.13+2" image_picker_linux: @@ -770,7 +770,7 @@ packages: description: name: image_picker_linux sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" image_picker_macos: @@ -778,7 +778,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2+1" image_picker_platform_interface: @@ -786,7 +786,7 @@ packages: description: name: image_picker_platform_interface sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.11.1" image_picker_windows: @@ -794,7 +794,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.2" intl: @@ -802,7 +802,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.20.2" io: @@ -810,7 +810,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.5" iris_method_channel: @@ -818,7 +818,7 @@ packages: description: name: iris_method_channel sha256: bfb5cfc6c6eae42da8cd1b35977a72d8b8881848a5dfc3d672e4760a907d11a0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.4" js: @@ -826,7 +826,7 @@ packages: description: name: js sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.2" json_annotation: @@ -834,7 +834,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" json_serializable: @@ -842,7 +842,7 @@ packages: description: name: json_serializable sha256: "33a040668b31b320aafa4822b7b1e177e163fc3c1e835c6750319d4ab23aa6fe" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.11.1" leak_tracker: @@ -850,7 +850,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -858,7 +858,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.10" leak_tracker_testing: @@ -866,7 +866,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.2" lean_builder: @@ -874,7 +874,7 @@ packages: description: name: lean_builder sha256: ef5cd5f907157eb7aa87d1704504b5a6386d2cbff88a3c2b3344477bab323ee9 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.2" lints: @@ -882,7 +882,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.1" location_plugin: @@ -897,7 +897,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" matcher: @@ -905,7 +905,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.12.17" material_color_utilities: @@ -913,7 +913,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.11.1" meta: @@ -921,7 +921,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.16.0" mime: @@ -929,7 +929,7 @@ packages: description: name: mime sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.6" nested: @@ -937,7 +937,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.0" octo_image: @@ -945,7 +945,7 @@ packages: description: name: octo_image sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.0" package_config: @@ -953,7 +953,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" package_info_plus: @@ -961,7 +961,7 @@ packages: description: name: package_info_plus sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.0.0" package_info_plus_platform_interface: @@ -969,7 +969,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.2.1" path: @@ -977,7 +977,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.9.1" path_drawing: @@ -985,7 +985,7 @@ packages: description: name: path_drawing sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" path_parsing: @@ -993,7 +993,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" path_provider: @@ -1001,7 +1001,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_android: @@ -1009,7 +1009,7 @@ packages: description: name: path_provider_android sha256: "95c68a74d3cab950fd0ed8073d9fab15c1c06eb1f3eec68676e87aabc9ecee5a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.21" path_provider_foundation: @@ -1017,7 +1017,7 @@ packages: description: name: path_provider_foundation sha256: "97390a0719146c7c3e71b6866c34f1cde92685933165c1c671984390d2aca776" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.4" path_provider_linux: @@ -1025,7 +1025,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -1033,7 +1033,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.2" path_provider_windows: @@ -1041,7 +1041,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.0" permission_handler: @@ -1049,7 +1049,7 @@ packages: description: name: permission_handler sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "12.0.1" permission_handler_android: @@ -1057,7 +1057,7 @@ packages: description: name: permission_handler_android sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "13.0.1" permission_handler_apple: @@ -1065,7 +1065,7 @@ packages: description: name: permission_handler_apple sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.4.7" permission_handler_html: @@ -1073,7 +1073,7 @@ packages: description: name: permission_handler_html sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.1.3+5" permission_handler_platform_interface: @@ -1081,7 +1081,7 @@ packages: description: name: permission_handler_platform_interface sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.3.0" permission_handler_windows: @@ -1089,7 +1089,7 @@ packages: description: name: permission_handler_windows sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.1" petitparser: @@ -1097,7 +1097,7 @@ packages: description: name: petitparser sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "7.0.1" photo_manager: @@ -1105,7 +1105,7 @@ packages: description: name: photo_manager sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.7.1" photo_manager_image_provider: @@ -1113,7 +1113,7 @@ packages: description: name: photo_manager_image_provider sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" platform: @@ -1121,7 +1121,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.6" plugin_platform_interface: @@ -1129,7 +1129,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.8" pointycastle: @@ -1137,7 +1137,7 @@ packages: description: name: pointycastle sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.0.0" pool: @@ -1145,7 +1145,7 @@ packages: description: name: pool sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.2" posix: @@ -1153,7 +1153,7 @@ packages: description: name: posix sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.0.3" protobuf: @@ -1161,7 +1161,7 @@ packages: description: name: protobuf sha256: "2fcc8a202ca7ec17dab7c97d6b6d91cf03aa07fe6f65f8afbb6dfa52cc5bd902" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.1.0" provider: @@ -1169,7 +1169,7 @@ packages: description: name: provider sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.5+1" pub_semver: @@ -1177,7 +1177,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" pubspec_parse: @@ -1185,7 +1185,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.5.0" pull_to_refresh: @@ -1193,7 +1193,7 @@ packages: description: name: pull_to_refresh sha256: bbadd5a931837b57739cf08736bea63167e284e71fb23b218c8c9a6e042aad12 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.0" rational: @@ -1201,7 +1201,7 @@ packages: description: name: rational sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.3" record: @@ -1209,7 +1209,7 @@ packages: description: name: record sha256: "6bad72fb3ea6708d724cf8b6c97c4e236cf9f43a52259b654efeb6fd9b737f1f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.2" record_android: @@ -1217,7 +1217,7 @@ packages: description: name: record_android sha256: fb54ee4e28f6829b8c580252a9ef49d9c549cfd263b0660ad7eeac0908658e9f - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.4" record_ios: @@ -1225,7 +1225,7 @@ packages: description: name: record_ios sha256: "765b42ac1be019b1674ddd809b811fc721fe5a93f7bb1da7803f0d16772fd6d7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.4" record_linux: @@ -1233,7 +1233,7 @@ packages: description: name: record_linux sha256: "235b1f1fb84e810f8149cc0c2c731d7d697f8d1c333b32cb820c449bf7bb72d8" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" record_macos: @@ -1241,7 +1241,7 @@ packages: description: name: record_macos sha256: "842ea4b7e95f4dd237aacffc686d1b0ff4277e3e5357865f8d28cd28bc18ed95" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.2" record_platform_interface: @@ -1249,7 +1249,7 @@ packages: description: name: record_platform_interface sha256: b0065fdf1ec28f5a634d676724d388a77e43ce7646fb049949f58c69f3fcb4ed - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" record_web: @@ -1257,7 +1257,7 @@ packages: description: name: record_web sha256: "20ac10d56514cb9f8cecc8f3579383084fdfb43b0d04e05a95244d0d76091d90" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.1" record_windows: @@ -1265,7 +1265,7 @@ packages: description: name: record_windows sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.7" retrofit: @@ -1273,7 +1273,7 @@ packages: description: name: retrofit sha256: "7d78824afa6eeeaf6ac58220910ee7a97597b39e93360d4bda230b7c6df45089" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.9.0" retrofit_generator: @@ -1281,7 +1281,7 @@ packages: description: name: retrofit_generator sha256: "56df50afab95199dada9e1afbfe5ec228612d03859b250e5e4846c3ebfe50bf7" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "10.1.4" rxdart: @@ -1289,7 +1289,7 @@ packages: description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.28.0" sensors_plus: @@ -1297,7 +1297,7 @@ packages: description: name: sensors_plus sha256: "89e2bfc3d883743539ce5774a2b93df61effde40ff958ecad78cd66b1a8b8d52" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.1.2" sensors_plus_platform_interface: @@ -1305,7 +1305,7 @@ packages: description: name: sensors_plus_platform_interface sha256: "58815d2f5e46c0c41c40fb39375d3f127306f7742efe3b891c0b1c87e2b5cd5d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.1" shared_preferences: @@ -1313,7 +1313,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.3" shared_preferences_android: @@ -1321,7 +1321,7 @@ packages: description: name: shared_preferences_android sha256: "07d552dbe8e71ed720e5205e760438ff4ecfb76ec3b32ea664350e2ca4b0c43b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.16" shared_preferences_foundation: @@ -1329,7 +1329,7 @@ packages: description: name: shared_preferences_foundation sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.6" shared_preferences_linux: @@ -1337,7 +1337,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -1345,7 +1345,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shared_preferences_web: @@ -1353,7 +1353,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.3" shared_preferences_windows: @@ -1361,7 +1361,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.1" shelf: @@ -1369,7 +1369,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.2" shelf_web_socket: @@ -1377,7 +1377,7 @@ packages: description: name: shelf_web_socket sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.0" sky_engine: @@ -1389,16 +1389,16 @@ packages: dependency: transitive description: name: source_gen - sha256: "9098ab86015c4f1d8af6486b547b11100e73b193e1899015033cb3e14ad20243" - url: "https://pub.flutter-io.cn" + sha256: "07b277b67e0096c45196cbddddf2d8c6ffc49342e88bf31d460ce04605ddac75" + url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.1" source_helper: dependency: transitive description: name: source_helper sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.8" source_span: @@ -1406,7 +1406,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.10.1" sp_util: @@ -1414,7 +1414,7 @@ packages: description: name: sp_util sha256: "9da43dce5de79c17a787d0626bf01538d63090ca32521200d22a232171c495dc" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.0.3" sqflite: @@ -1422,7 +1422,7 @@ packages: description: name: sqflite sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2" sqflite_android: @@ -1430,7 +1430,7 @@ packages: description: name: sqflite_android sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2+2" sqflite_common: @@ -1438,7 +1438,7 @@ packages: description: name: sqflite_common sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.5.6" sqflite_darwin: @@ -1446,7 +1446,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -1454,7 +1454,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.0" stack_trace: @@ -1462,7 +1462,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.12.1" stream_channel: @@ -1470,7 +1470,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.4" stream_transform: @@ -1478,7 +1478,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.1.1" string_scanner: @@ -1486,7 +1486,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.1" synchronized: @@ -1494,7 +1494,7 @@ packages: description: name: synchronized sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.4.0" tdesign_flutter: @@ -1502,7 +1502,7 @@ packages: description: name: tdesign_flutter sha256: cf166a5fdbbfd9129305d2c2906633c8d0151bbb2d0a6fbcf901bdd76726a555 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.2.6" tdesign_flutter_adaptation: @@ -1510,7 +1510,7 @@ packages: description: name: tdesign_flutter_adaptation sha256: "707bbc52ec8b5872ea808500200f402007acf24c03a1cc823a3be2113c1d813a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.32.0" term_glyph: @@ -1518,7 +1518,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.2" test_api: @@ -1526,7 +1526,7 @@ packages: description: name: test_api sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.7.6" typed_data: @@ -1534,7 +1534,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" universal_io: @@ -1542,7 +1542,7 @@ packages: description: name: universal_io sha256: f63cbc48103236abf48e345e07a03ce5757ea86285ed313a6a032596ed9301e2 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.3.1" uuid: @@ -1550,7 +1550,7 @@ packages: description: name: uuid sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.5.2" vector_math: @@ -1558,7 +1558,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.2.0" video_player: @@ -1566,7 +1566,7 @@ packages: description: name: video_player sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.10.1" video_player_android: @@ -1574,7 +1574,7 @@ packages: description: name: video_player_android sha256: "36913f94430b474c4a9033d59b7552b800e736a8521e7166e84895ddcedd0b03" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.8.19" video_player_avfoundation: @@ -1582,7 +1582,7 @@ packages: description: name: video_player_avfoundation sha256: "6bced1739cf1f96f03058118adb8ac0dd6f96aa1a1a6e526424ab92fd2a6a77d" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.8.7" video_player_platform_interface: @@ -1590,7 +1590,7 @@ packages: description: name: video_player_platform_interface sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.6.0" video_player_web: @@ -1598,7 +1598,7 @@ packages: description: name: video_player_web sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "2.4.0" video_thumbnail: @@ -1606,7 +1606,7 @@ packages: description: name: video_thumbnail sha256: "181a0c205b353918954a881f53a3441476b9e301641688a581e0c13f00dc588b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.5.6" visibility_detector: @@ -1614,7 +1614,7 @@ packages: description: name: visibility_detector sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "0.4.0+2" vm_service: @@ -1622,7 +1622,7 @@ packages: description: name: vm_service sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "15.0.2" wakelock_plus: @@ -1630,7 +1630,7 @@ packages: description: name: wakelock_plus sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.4.0" wakelock_plus_platform_interface: @@ -1638,7 +1638,7 @@ packages: description: name: wakelock_plus_platform_interface sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.3.0" watcher: @@ -1646,7 +1646,7 @@ packages: description: name: watcher sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.4" web: @@ -1654,7 +1654,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.1" web_socket: @@ -1662,7 +1662,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.1" web_socket_channel: @@ -1670,7 +1670,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.0.3" wechat_assets_picker: @@ -1678,7 +1678,7 @@ packages: description: name: wechat_assets_picker sha256: c307e50394c1e6dfcd5c4701e84efb549fce71444fedcf2e671c50d809b3e2a1 - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "9.8.0" wechat_camera_picker: @@ -1686,7 +1686,7 @@ packages: description: name: wechat_camera_picker sha256: "776ce32feda72d84b63425533a27d3b822bfb93cc063d2aef3cc6d788769f36b" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "4.4.0" wechat_picker_library: @@ -1694,7 +1694,7 @@ packages: description: name: wechat_picker_library sha256: "5cb61b9aa935b60da5b043f8446fbb9c5077419f20ccc4856bf444aec4f44bc1" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.0.7" win32: @@ -1702,7 +1702,7 @@ packages: description: name: win32 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "5.15.0" xdg_directories: @@ -1710,7 +1710,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.1.0" xml: @@ -1718,7 +1718,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "6.6.1" xxh3: @@ -1726,7 +1726,7 @@ packages: description: name: xxh3 sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "1.2.0" yaml: @@ -1734,7 +1734,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.flutter-io.cn" + url: "https://pub.dev" source: hosted version: "3.1.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index a0b33f7..078fddf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,7 +67,7 @@ dependencies: video_thumbnail: ^0.5.3 # 视频缩略图生成 # fluwx: ^5.7.5 # tobias: ^5.3.1 - agora_rtc_engine: ^6.5.3 + agora_rtc_engine: ^6.4.0 pull_to_refresh: ^2.0.0 agora_rtm: ^2.2.5 agora_token_generator: ^1.0.0 From 5302a5252b7a045d161e0f8cf7082f80535b4019 Mon Sep 17 00:00:00 2001 From: Jolie <> Date: Wed, 26 Nov 2025 23:42:24 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=A1=B5=E9=9D=A2=E8=B7=B3=E8=BD=AC=E5=88=B0?= =?UTF-8?q?=E8=81=8A=E5=A4=A9=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/model/home/marriage_data.dart | 28 +++++++++++++++++++++++ lib/pages/home/user_information_page.dart | 14 ++++++++---- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/lib/model/home/marriage_data.dart b/lib/model/home/marriage_data.dart index 1405b89..6a8acf9 100644 --- a/lib/model/home/marriage_data.dart +++ b/lib/model/home/marriage_data.dart @@ -1,4 +1,6 @@ // 数据模型类 - 根据真实API返回格式调整 +import 'user_info_data.dart'; + class MarriageData { final String miId; final String userId; @@ -66,6 +68,32 @@ class MarriageData { photoList: (json['photoList'] as List?)?.map((e) => PhotoItem.fromJson(e as Map)).toList() ?? [], ); } + + /// 从 UserInfoData 转换为 MarriageData + factory MarriageData.fromUserInfoData(UserInfoData userInfo) { + return MarriageData( + miId: userInfo.miId ?? '', + userId: userInfo.userId ?? '', + profilePhoto: userInfo.profilePhoto ?? '', + nickName: userInfo.nickName ?? '', + isRealNameCertified: userInfo.identityCard != null && userInfo.identityCard!.isNotEmpty, + birthYear: userInfo.birthYear ?? '', + birthDate: userInfo.birthDate ?? '', + age: userInfo.age?.toInt() ?? 0, + provinceCode: userInfo.provinceCode?.toInt() ?? 0, + provinceName: userInfo.provinceName ?? '', + cityCode: userInfo.cityCode?.toInt() ?? 0, + cityName: userInfo.cityName ?? '', + districtCode: userInfo.districtCode?.toInt() ?? 0, + districtName: userInfo.districtName ?? '', + describeInfo: userInfo.describeInfo ?? '', + createTime: userInfo.createTime ?? '', + photoList: (userInfo.photoList ?? []).map((photo) => PhotoItem( + photoUrl: photo.photoUrl ?? '', + auditStatus: photo.auditStatus, + )).toList(), + ); + } } // 照片项数据模型 diff --git a/lib/pages/home/user_information_page.dart b/lib/pages/home/user_information_page.dart index c1342fb..68cd53c 100644 --- a/lib/pages/home/user_information_page.dart +++ b/lib/pages/home/user_information_page.dart @@ -1,5 +1,4 @@ import 'package:cached_network_image/cached_network_image.dart'; -import 'package:dating_touchme_app/controller/global.dart'; import 'package:dating_touchme_app/controller/home/user_information_controller.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:dating_touchme_app/model/home/marriage_data.dart'; @@ -383,10 +382,15 @@ class UserInformationPage extends StatelessWidget { backgroundColor: Color(0xC3333333), ), onTap: (){ - // Get.to(() => ChatPage( - // userId: controller.userData.value.userId ?? "", - // userData: widget.userData, - // )); + final userInfo = controller.userData.value; + if (userInfo.userId != null && userInfo.userId!.isNotEmpty) { + // 使用工厂方法将 UserInfoData 转换为 MarriageData + final marriageData = MarriageData.fromUserInfoData(userInfo); + Get.to(() => ChatPage( + userId: userInfo.userId ?? "", + userData: marriageData, + )); + } }, ), const SizedBox(width: 10), From 833be0f04bfe997d5278a05ca2f183cc9b5e515c Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Thu, 27 Nov 2025 00:40:57 +0800 Subject: [PATCH 8/8] =?UTF-8?q?feat(live):=20=E5=AE=9E=E7=8E=B0=E5=AE=9E?= =?UTF-8?q?=E5=90=8D=E8=AE=A4=E8=AF=81=E5=8C=B9=E9=85=8D=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E7=9B=B4=E6=92=AD=E9=97=B4=E5=8A=A8?= =?UTF-8?q?=E6=95=88=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增销毁 RTC 频道接口及对应网络请求实现 - 优化直播间礼物弹窗界面,替换为 GridView 并设置默认选中项 - 完善 SVGA 动画播放逻辑,支持队列播放和播放完成回调 - 调整直播间用户展示逻辑,区分左右侧观众身份判断 - 移除无用日志打印和冗余依赖包引用 - 修复主播离线时频道销毁流程,确保先调用销毁接口再发送结束消息 - 引入 SvgaPlayerWidget 组件用于直播间动效展示 - 优化实名认证判断逻辑,增强代码可读性 --- lib/controller/discover/room_controller.dart | 46 +++-- lib/network/api_urls.dart | 2 + lib/network/rtc_api.dart | 4 + lib/network/rtc_api.g.dart | 31 +++ lib/pages/discover/live_room_page.dart | 4 +- lib/widget/live/live_gift_popup.dart | 108 +++------- .../live/live_room_anchor_showcase.dart | 6 +- lib/widget/live/svga_player_widget.dart | 185 +++++++++++++++--- 8 files changed, 252 insertions(+), 134 deletions(-) diff --git a/lib/controller/discover/room_controller.dart b/lib/controller/discover/room_controller.dart index 984dc77..6cc90d7 100644 --- a/lib/controller/discover/room_controller.dart +++ b/lib/controller/discover/room_controller.dart @@ -36,6 +36,7 @@ class RoomController extends GetxController { CurrentRole currentRole = CurrentRole.normalUser; var isLive = false.obs; var matchmakerFlag = false.obs; + /// 当前频道信息 final Rxn rtcChannel = Rxn(); final Rxn rtcChannelDetail = Rxn(); @@ -47,7 +48,8 @@ class RoomController extends GetxController { final RxList giftProducts = [].obs; /// 消息服务实例 - final LiveChatMessageService _messageService = LiveChatMessageService.instance; + final LiveChatMessageService _messageService = + LiveChatMessageService.instance; // matchmakerFlag @@ -107,7 +109,7 @@ class RoomController extends GetxController { /// 调用接口创建 RTC 频道 Future createRtcChannel() async { - if(isLive.value){ + if (isLive.value) { return; } final granted = await _ensureRtcPermissions(); @@ -213,8 +215,12 @@ class RoomController extends GetxController { final newDetail = RtcChannelDetail( channelId: rtcChannelDetail.value!.channelId, anchorInfo: rtcChannelDetail.value!.anchorInfo, - maleInfo: role == CurrentRole.maleAudience ? userInfo : null, - femaleInfo: role == CurrentRole.femaleAudience ? userInfo : null, + maleInfo: role == CurrentRole.maleAudience + ? userInfo + : rtcChannelDetail.value?.maleInfo, + femaleInfo: role == CurrentRole.femaleAudience + ? userInfo + : rtcChannelDetail.value?.femaleInfo, ); rtcChannelDetail.value = newDetail; isLive.value = true; @@ -296,15 +302,27 @@ class RoomController extends GetxController { } Future leaveChannel() async { - // 如果是主播,发送结束直播消息 + // 如果是主播,先销毁 RTC 频道,然后发送结束直播消息 if (currentRole == CurrentRole.broadcaster) { - final channelId = RTCManager.instance.currentChannelId; - if (channelId != null && channelId.isNotEmpty) { - await RTMManager.instance.publishChannelMessage( - channelName: channelId, - message: json.encode({'type': 'end_live'}), - ); + try { + // 先调用销毁 RTC 频道 API + final destroyResponse = await _networkService.rtcApi + .destroyRtcChannel(); + if (destroyResponse.data.isSuccess) { + // 然后发送结束直播消息 + final channelId = RTCManager.instance.currentChannelId; + if (channelId != null && channelId.isNotEmpty) { + await RTMManager.instance.publishChannelMessage( + channelName: channelId, + message: json.encode({'type': 'end_live'}), + ); + } + } + } catch (e) { + print('❌ 销毁 RTC 频道异常: $e'); } + + } isLive.value = false; @@ -486,13 +504,13 @@ class RoomController extends GetxController { } } - void registerMatch(){ - if(GlobalData().userData!.identityCard != null && GlobalData().userData!.identityCard!.isNotEmpty){ + void registerMatch() { + if (GlobalData().userData!.identityCard != null && + GlobalData().userData!.identityCard!.isNotEmpty) { Get.to(() => MatchLeaguePage()); } else { SmartDialog.showToast('请先进行实名认证'); Get.to(() => RealNamePage(type: 1)); } } - } diff --git a/lib/network/api_urls.dart b/lib/network/api_urls.dart index 003242f..39f32e4 100644 --- a/lib/network/api_urls.dart +++ b/lib/network/api_urls.dart @@ -56,6 +56,8 @@ class ApiUrls { 'dating-agency-chat-audio/user/enable/rtc-channel-user/audio'; static const String disconnectRtcChannel = 'dating-agency-chat-audio/user/disconnect/rtc-channel'; + static const String destroyRtcChannel = + 'dating-agency-chat-audio/user/destroy/rtc-channel'; static const String getRtcChannelPage = 'dating-agency-chat-audio/user/page/rtc-channel'; static const String listGiftProduct = diff --git a/lib/network/rtc_api.dart b/lib/network/rtc_api.dart index 6ec1931..7c2e928 100644 --- a/lib/network/rtc_api.dart +++ b/lib/network/rtc_api.dart @@ -59,6 +59,10 @@ abstract class RtcApi { @Body() Map data, ); + /// 销毁 RTC 频道 + @POST(ApiUrls.destroyRtcChannel) + Future>> destroyRtcChannel(); + /// 获取 RTC 频道分页列表 @GET(ApiUrls.getRtcChannelPage) Future>>> getRtcChannelPage(); diff --git a/lib/network/rtc_api.g.dart b/lib/network/rtc_api.g.dart index e9ee003..52bbfcb 100644 --- a/lib/network/rtc_api.g.dart +++ b/lib/network/rtc_api.g.dart @@ -287,6 +287,37 @@ class _RtcApi implements RtcApi { return httpResponse; } + @override + Future>> destroyRtcChannel() async { + final _extra = {}; + final queryParameters = {}; + final _headers = {}; + const Map? _data = null; + final _options = _setStreamType>>( + 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>(_options); + late BaseResponse _value; + try { + _value = BaseResponse.fromJson( + _result.data!, + (json) => json as dynamic, + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + final httpResponse = HttpResponse(_value, _result); + return httpResponse; + } + @override Future>>> getRtcChannelPage() async { diff --git a/lib/pages/discover/live_room_page.dart b/lib/pages/discover/live_room_page.dart index 29c566c..b4fb318 100644 --- a/lib/pages/discover/live_room_page.dart +++ b/lib/pages/discover/live_room_page.dart @@ -1,6 +1,5 @@ import 'package:dating_touchme_app/controller/discover/room_controller.dart'; import 'package:dating_touchme_app/controller/overlay_controller.dart'; -import 'package:dating_touchme_app/generated/assets.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:tdesign_flutter/tdesign_flutter.dart'; @@ -13,6 +12,7 @@ import 'package:dating_touchme_app/widget/live/live_room_notice_chat_panel.dart' import 'package:dating_touchme_app/widget/live/live_room_action_bar.dart'; import 'package:dating_touchme_app/widget/live/live_gift_popup.dart'; import 'package:dating_touchme_app/widget/live/live_recharge_popup.dart'; +import 'package:dating_touchme_app/widget/live/svga_player_widget.dart'; class LiveRoomPage extends StatefulWidget { final int id; @@ -207,6 +207,8 @@ class _LiveRoomPageState extends State { ], ), ), + // SVGA 动画播放组件 + const SvgaPlayerWidget(), ], ), ), diff --git a/lib/widget/live/live_gift_popup.dart b/lib/widget/live/live_gift_popup.dart index 73d23d8..2e4daab 100644 --- a/lib/widget/live/live_gift_popup.dart +++ b/lib/widget/live/live_gift_popup.dart @@ -8,9 +8,7 @@ import 'package:dating_touchme_app/widget/live/live_room_gift_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:flutter_swiper_null_safety/flutter_swiper_null_safety.dart'; import 'package:get/get.dart'; -import 'package:tdesign_flutter/tdesign_flutter.dart'; class LiveGiftPopup extends StatefulWidget { const LiveGiftPopup({ @@ -34,6 +32,15 @@ class _LiveGiftPopupState extends State { // 选中的用户ID(单选) String? _selectedUserId; + @override + void initState() { + super.initState(); + // 默认选择第一个礼物 + if (widget.giftList.isNotEmpty && widget.activeGift.value == null) { + widget.activeGift.value = 0; + } + } + // 切换用户选中状态(单选模式) void _toggleUserSelection(String userId) { setState(() { @@ -91,11 +98,7 @@ class _LiveGiftPopupState extends State { // 发送礼物 await roomController.sendGift(gift: gift, targetUserId: _selectedUserId); - - // 关闭弹窗 SmartDialog.dismiss(); - - SmartDialog.showToast('礼物已送出'); } @override @@ -312,52 +315,25 @@ class _LiveGiftPopupState extends State { ); } - // 计算需要多少页,每页显示8个礼物(2行4列) - final itemsPerPage = 8; - final totalPages = (widget.giftList.length / itemsPerPage).ceil(); - return Expanded( child: ValueListenableBuilder( valueListenable: widget.activeGift, builder: (context, active, _) { - return Swiper( - autoplay: false, - itemCount: totalPages, - loop: false, - pagination: totalPages > 1 - ? const SwiperPagination( - alignment: Alignment.bottomCenter, - builder: TDSwiperDotsPagination( - color: Color.fromRGBO(144, 144, 144, 1), - activeColor: Color.fromRGBO(77, 77, 77, 1), - ), - ) - : null, - itemBuilder: (context, pageIndex) { - final startIndex = pageIndex * itemsPerPage; - final endIndex = (startIndex + itemsPerPage).clamp( - 0, - widget.giftList.length, - ); - final pageItems = widget.giftList.sublist(startIndex, endIndex); - - return Align( - alignment: Alignment.topCenter, - child: Wrap( - spacing: 7.w, - runSpacing: 7.w, - children: [ - ...pageItems.asMap().entries.map((entry) { - final globalIndex = startIndex + entry.key; - return LiveRoomGiftItem( - item: entry.value, - active: active ?? 0, - index: globalIndex, - changeActive: widget.changeActive, - ); - }), - ], - ), + return GridView.builder( + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 10.w), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, // 每行4个 + crossAxisSpacing: 7.w, + mainAxisSpacing: 7.w, + childAspectRatio: 0.85, // 调整宽高比 + ), + itemCount: widget.giftList.length, + itemBuilder: (context, index) { + return LiveRoomGiftItem( + item: widget.giftList[index], + active: active ?? 0, + index: index, + changeActive: widget.changeActive, ); }, ); @@ -421,40 +397,4 @@ class _LiveGiftPopupState extends State { ), ); } - - Widget _buildAdjustButton({ - required String label, - required bool enabled, - required VoidCallback onTap, - }) { - return InkWell( - onTap: enabled ? onTap : null, - child: Container( - width: 14.w, - height: 14.w, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(14.w)), - color: enabled - ? const Color.fromRGBO(117, 98, 249, 1) - : Colors.transparent, - border: Border.all( - width: 1, - color: const Color.fromRGBO(117, 98, 249, 1), - ), - ), - child: Center( - child: Text( - label, - style: TextStyle( - fontSize: 13.w, - color: enabled - ? Colors.white - : const Color.fromRGBO(117, 98, 249, 1), - height: 1, - ), - ), - ), - ), - ); - } } diff --git a/lib/widget/live/live_room_anchor_showcase.dart b/lib/widget/live/live_room_anchor_showcase.dart index 00acd48..68f74aa 100644 --- a/lib/widget/live/live_room_anchor_showcase.dart +++ b/lib/widget/live/live_room_anchor_showcase.dart @@ -158,7 +158,6 @@ class _LiveRoomAnchorShowcaseState extends State { } Widget _buildWaitingPlaceholder() { - Get.log("buildWaitingPlaceholder"); return Container( width: 177.w, height: 175.w, @@ -185,11 +184,10 @@ class _LiveRoomAnchorShowcaseState extends State { }) { final engine = _rtcManager.engine; final joined = _rtcManager.channelJoinedNotifier.value; - // 判断是否是当前用户 final bool isCurrentUser = - _roomController.currentRole == CurrentRole.maleAudience || - _roomController.currentRole == CurrentRole.femaleAudience; + _roomController.currentRole == CurrentRole.maleAudience && isLeft || + _roomController.currentRole == CurrentRole.femaleAudience && !isLeft; return Stack( children: [ ClipRRect( diff --git a/lib/widget/live/svga_player_widget.dart b/lib/widget/live/svga_player_widget.dart index 052f038..7d71124 100644 --- a/lib/widget/live/svga_player_widget.dart +++ b/lib/widget/live/svga_player_widget.dart @@ -13,7 +13,7 @@ class SvgaPlayerWidget extends StatefulWidget { } class _SvgaPlayerWidgetState extends State - with SingleTickerProviderStateMixin { + with TickerProviderStateMixin { final SvgaPlayerManager _manager = SvgaPlayerManager.instance; SVGAAnimationController? _controller; SvgaAnimationItem? _currentItem; @@ -23,8 +23,20 @@ class _SvgaPlayerWidgetState extends State super.initState(); // 监听队列变化 ever(_manager.currentItem, (item) { - if (item != null && item != _currentItem) { - _playAnimation(item); + print( + '📢 currentItem 变化: ${item?.svgaFile ?? "null"}, 当前 _currentItem: ${_currentItem?.svgaFile ?? "null"}', + ); + if (item != null) { + // 如果当前没有播放,或者新的 item 与当前不同,则播放 + if (_currentItem == null || item.svgaFile != _currentItem!.svgaFile) { + print('🎯 准备播放新动画: ${item.svgaFile}'); + _playAnimation(item); + } else { + print('⚠️ 相同的动画,跳过播放'); + } + } else { + // currentItem 变为 null,但不立即清理,等待播放完成回调 + print('📢 currentItem 变为 null,等待播放完成回调'); } }); } @@ -37,48 +49,162 @@ class _SvgaPlayerWidgetState extends State /// 播放动画 Future _playAnimation(SvgaAnimationItem item) async { - // 如果正在播放,先停止 + print( + '🎬 开始播放动画: ${item.svgaFile}, 当前状态: _controller=${_controller != null}, _currentItem=${_currentItem?.svgaFile ?? "null"}', + ); + + // 如果正在播放,先停止并清理 if (_controller != null) { + print('🛑 停止当前播放'); + _controller!.stop(); _controller!.dispose(); _controller = null; } + // 设置当前项并创建新的 controller _currentItem = item; _controller = SVGAAnimationController(vsync: this); + print('✅ 创建新的 controller,准备加载动画'); try { // 判断是网络 URL 还是本地资源 if (item.svgaFile.startsWith('http://') || item.svgaFile.startsWith('https://')) { // 网络 URL - SVGAParser.shared.decodeFromURL(item.svgaFile).then((video) { - if (mounted && _currentItem == item) { - _controller!.videoItem = video; - _controller!.repeat(); - print('✅ SVGA 动画加载成功(网络): ${item.svgaFile}'); - } - }).catchError((error) { - print('❌ SVGA 动画加载失败(网络): $error'); - _manager.onAnimationError(error.toString()); - }); + SVGAParser.shared + .decodeFromURL(item.svgaFile) + .then((video) { + if (!mounted) return; + + // 检查是否还是当前要播放的动画 + if (_currentItem != item || _controller == null) { + print('⚠️ 动画已变更,取消播放: ${item.svgaFile}'); + return; + } + + _controller!.videoItem = video; + // 播放动画(repeat 会循环播放,我们需要监听完成) + _controller!.repeat(); + + // 获取动画时长,如果为 null 则使用默认值 3 秒 + final duration = _controller!.duration; + final playDuration = duration != null && duration > Duration.zero + ? duration + : const Duration(seconds: 3); + + print( + '✅ SVGA 动画加载成功(网络): ${item.svgaFile}, 播放时长: ${playDuration.inMilliseconds}ms', + ); + + // 在动画时长后停止并通知完成 + Future.delayed(playDuration, () { + if (!mounted) { + print('⚠️ Widget 已卸载,取消完成回调'); + return; + } + + // 再次检查是否还是当前动画 + if (_currentItem == item && _controller != null) { + print('✅ SVGA 动画播放完成(网络): ${item.svgaFile}'); + + // 先停止动画 + _controller!.stop(); + + // 清理当前项和 controller + final wasCurrentItem = _currentItem; + _currentItem = null; + _controller?.dispose(); + _controller = null; + + // 通知管理器播放完成(这会触发下一个动画) + if (wasCurrentItem == item) { + _manager.onAnimationFinished(); + } + } else { + print( + '⚠️ 动画已变更,跳过完成回调: _currentItem=${_currentItem?.svgaFile ?? "null"}, item=${item.svgaFile}', + ); + } + }); + }) + .catchError((error) { + print('❌ SVGA 动画加载失败(网络): $error'); + _currentItem = null; + _controller?.dispose(); + _controller = null; + _manager.onAnimationError(error.toString()); + }); } else { // 本地资源(assets) - SVGAParser.shared.decodeFromAssets(item.svgaFile).then((video) { - if (mounted && _currentItem == item) { - _controller!.videoItem = video; - _controller!.repeat(); - print('✅ SVGA 动画加载成功(本地): ${item.svgaFile}'); - } - }).catchError((error) { - print('❌ SVGA 动画加载失败(本地): $error'); - _manager.onAnimationError(error.toString()); - }); - } + SVGAParser.shared + .decodeFromAssets(item.svgaFile) + .then((video) { + if (!mounted) return; + + // 检查是否还是当前要播放的动画 + if (_currentItem != item || _controller == null) { + print('⚠️ 动画已变更,取消播放: ${item.svgaFile}'); + return; + } + + _controller!.videoItem = video; + // 播放动画(repeat 会循环播放,我们需要监听完成) + _controller!.repeat(); + + // 获取动画时长,如果为 null 则使用默认值 3 秒 + final duration = _controller!.duration; + final playDuration = duration != null && duration > Duration.zero + ? duration + : const Duration(seconds: 3); + + print( + '✅ SVGA 动画加载成功(本地): ${item.svgaFile}, 播放时长: ${playDuration.inMilliseconds}ms', + ); + + // 在动画时长后停止并通知完成 + Future.delayed(playDuration, () { + if (!mounted) { + print('⚠️ Widget 已卸载,取消完成回调'); + return; + } - // 监听动画完成(repeat 模式不会自动完成,需要手动停止) - // 这里可以根据需要调整播放逻辑 + // 再次检查是否还是当前动画 + if (_currentItem == item && _controller != null) { + print('✅ SVGA 动画播放完成(本地): ${item.svgaFile}'); + + // 先停止动画 + _controller!.stop(); + + // 清理当前项和 controller + final wasCurrentItem = _currentItem; + _currentItem = null; + _controller?.dispose(); + _controller = null; + + // 通知管理器播放完成(这会触发下一个动画) + if (wasCurrentItem == item) { + _manager.onAnimationFinished(); + } + } else { + print( + '⚠️ 动画已变更,跳过完成回调: _currentItem=${_currentItem?.svgaFile ?? "null"}, item=${item.svgaFile}', + ); + } + }); + }) + .catchError((error) { + print('❌ SVGA 动画加载失败(本地): $error'); + _currentItem = null; + _controller?.dispose(); + _controller = null; + _manager.onAnimationError(error.toString()); + }); + } } catch (e) { print('❌ SVGA 播放异常: $e'); + _currentItem = null; + _controller?.dispose(); + _controller = null; _manager.onAnimationError(e.toString()); } } @@ -94,11 +220,8 @@ class _SvgaPlayerWidgetState extends State } return Positioned.fill( - child: IgnorePointer( - child: SVGAImage(_controller!), - ), + child: IgnorePointer(child: SVGAImage(_controller!)), ); }); } } -