From cab0719a6df555eda22762888367e7e6f3cf38bf Mon Sep 17 00:00:00 2001 From: Jolie <412895109@qq.com> Date: Thu, 13 Nov 2025 16:39:23 +0800 Subject: [PATCH] =?UTF-8?q?refactor(home):=20=E9=87=8D=E6=9E=84=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E5=86=85=E5=AE=B9=E5=8D=A1=E7=89=87=E5=92=8C=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E9=A1=B5=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将内容卡片拆分为独立的 ContentCard 和 _CardHeader 组件- 新增 _NetworkImageWidget 优化图片加载与显示 - 抽离推荐和同城列表为独立的 RecommendTab 和 NearbyTab 页面 - 移除原 HomePage 中的列表构建逻辑,提升代码可维护性 -优化图片展示逻辑,统一处理单张及多张图片显示样式 - 增加用户状态标签(在线、实名认证、直播中)的灵活展示 - 实现点击卡片跳转至用户信息页的功能 -保留原有下拉刷新与上拉加载交互逻辑 - 修复可能因图片加载引起的界面闪退问题- 提升组件复用性和页面渲染性能 --- lib/pages/home/content_card.dart | 520 ++++++++++++++++-------- lib/pages/home/home_page.dart | 638 ++---------------------------- lib/pages/home/nearby_tab.dart | 140 +++++++ lib/pages/home/recommend_tab.dart | 140 +++++++ pubspec.lock | 418 ++++++++++---------- 5 files changed, 877 insertions(+), 979 deletions(-) create mode 100644 lib/pages/home/nearby_tab.dart create mode 100644 lib/pages/home/recommend_tab.dart diff --git a/lib/pages/home/content_card.dart b/lib/pages/home/content_card.dart index e4fe7de..ec8b384 100644 --- a/lib/pages/home/content_card.dart +++ b/lib/pages/home/content_card.dart @@ -1,193 +1,399 @@ -import 'package:flutter/material.dart'; +import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/generated/assets.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:dating_touchme_app/model/home/marriage_data.dart'; +import 'package:dating_touchme_app/pages/home/user_information_page.dart'; -class ContentCard extends StatelessWidget { +// 通用头部组件:头像/昵称/在线/认证/Hi/直播中徽标 +class _CardHeader extends StatelessWidget { final MarriageData item; - - const ContentCard({ - Key? key, - required this.item, - }) : super(key: key); + const _CardHeader({required this.item}); @override Widget build(BuildContext context) { - return Card( - margin: EdgeInsets.only(bottom: 12), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(12), - ), - elevation: 2, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 用户信息头部 - _buildUserHeader(), - - // 个人描述 - if (item.description.isNotEmpty) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - child: Text( - item.description, - style: TextStyle( - fontSize: 14, - color: Colors.black87 + final bool isLive = true; //item.isLive ?? false; + final bool isOnline = true; //item.isOnline ?? false; + + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 头像 + 状态小圆点 + Stack( + children: [ + // 头像 + 可选紫色描边 + Container( + padding: isLive ? const EdgeInsets.all(2) : EdgeInsets.zero, + decoration: isLive + ? BoxDecoration( + borderRadius: BorderRadius.circular(32), + border: Border.all( + color: const Color(0xFFB58BFF), + width: 2, + ), + ) + : null, + child: ClipRRect( + borderRadius: BorderRadius.circular(30), + child: CachedNetworkImage( + imageUrl: item.avatar, + width: 60, + height: 60, + imageBuilder: (context, imageProvider) => Container( + decoration: BoxDecoration( + image: DecorationImage( + image: imageProvider, + fit: BoxFit.cover, + ), + ), + ), + errorWidget: (context, url, error) => Image.asset( + Assets.imagesAvatarsExample, + width: 60, + height: 60, + fit: BoxFit.cover, + ), ), - strutStyle: const StrutStyle(height: 1.5), - maxLines: 3, - overflow: TextOverflow.ellipsis, - ) + ), ), - - // 照片列表 - if (item.photoList.isNotEmpty) - _buildImageGrid(), - - ], - ), - ); - } - - Widget _buildUserHeader() { - return Padding( - padding: const EdgeInsets.all(12), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // 用户头像 - CircleAvatar( - radius: 30, - backgroundImage: NetworkImage(_cleanImageUrl(item.avatar)), - backgroundColor: Colors.grey[200], - ), - - // 用户信息 - Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 12), - child: Column( + if (isOnline) + Positioned( + right: 6, + bottom: 1, + child: Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: isOnline + ? const Color(0xFF2ED573) + : const Color(0xFFCCCCCC), // 在线绿色,离线灰色 + shape: BoxShape.circle, + boxShadow: isOnline + ? const [ + BoxShadow( + color: Color(0x332ED573), + blurRadius: 4, + offset: Offset(0, 2), + ), + ] + : [], + ), + ), + ), + if (isLive) + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + width: 37, + height: 14, + alignment: Alignment.center, // 关键:让子内容居中 + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(Assets.imagesBtnBgIcon), + ), + ), + child: const Text( + '直播中', + style: TextStyle( + color: Colors.white, + fontSize: 8, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ], + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Row( + // 使用Wrap组件让所有标签在空间允许时显示在一行,空间不足时自动换行 + Wrap( + spacing: 6, + runSpacing: 2, children: [ + // 用户名 Text( - item.nickName, + item.name ?? '用户', style: TextStyle( fontSize: 16, - fontWeight: FontWeight.bold, - color: Colors.black + fontWeight: FontWeight.w500, + color: Color.fromRGBO(51, 51, 51, 1), ), + maxLines: 1, + overflow: TextOverflow.ellipsis, ), - SizedBox(width: 6), - Text( - '${item.age}岁', - style: TextStyle( - fontSize: 14, - color: Colors.grey[600] - ), - ), + // 在线徽标 + if (isOnline == true) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: Color.fromRGBO(234, 255, 219, 1), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + isOnline ? '在线' : '', + style: TextStyle( + fontSize: 9, + color: Color.fromRGBO(38, 199, 124, 1), + ), + ), + ), + // 实名徽标 + if (item.isRealNameCertified == true) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: const Color(0xFFF3E9FF), + borderRadius: BorderRadius.circular(12), + ), + constraints: BoxConstraints( + minWidth: 40, // 设置最小宽度以保证视觉效果 + ), + child: Row( + mainAxisSize: MainAxisSize.min, // 确保Row只占用必要的宽度 + children: [ + Image.asset( + Assets.imagesVerifiedIcon, + width: 14, + height: 12, + ), + const SizedBox(width: 4), + const Text( + '实名', + style: TextStyle( + fontSize: 9, + color: Color.fromRGBO(160, 92, 255, 1), + ), + ), + ], + ), + ), + // 直播状态下显示视频相亲中标签 + if (isLive) + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, + vertical: 2, + ), + decoration: BoxDecoration( + color: Color.fromRGBO(234, 255, 219, 1), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + '视频相亲中', + style: TextStyle( + fontSize: 9, + color: Color.fromRGBO(38, 199, 124, 1), + ), + ), + ), ], ), - Text( - item.city, - style: TextStyle( - fontSize: 12, - color: Colors.grey[500] - ), - strutStyle: const StrutStyle(height: 1.2), - ) ], ), - ), - ), - - // 打招呼按钮 - GestureDetector( - onTap: () { - // 打招呼功能 - }, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6), - decoration: BoxDecoration( - color: Color(0xFFFF6B6B), - borderRadius: BorderRadius.circular(16), - ), - child: Row( - children: [ - Image.asset( - Assets.imagesHiIcon, - width: 16, - height: 16, + const SizedBox(height: 6), + SizedBox( + height: 16, + child: Text( + '${item.age ?? 0}岁 · ${item.cityName ?? ''}${item.districtName != null ? item.districtName : ''}', + style: TextStyle( + fontSize: 12, + color: Color.fromRGBO(51, 51, 51, 1), ), - ], + overflow: TextOverflow.ellipsis, + ), ), - ), + ], ), - ], - ), + ), + // 根据不同状态显示不同按钮 - 都放在HI按钮相同位置 + InkWell( + onTap: () { + // 点击事件处理 + if (isLive) { + // 进入直播间逻辑 + print('进入直播间'); + } else if (isOnline) { + // HI按钮点击逻辑 + print('HI点击'); + } else { + // 发消息按钮点击逻辑 + print('发送消息'); + } + }, + child: Image.asset( + _getButtonImage(), + // width: (item.isLive ?? false) ? 60 : 40, + width: (true) ? 60 : 40, + height: 20, + ), + ), + ], ); } - Widget _buildImageGrid() { - int imageCount = item.photoList.length; - - if (imageCount == 0) return SizedBox(); - - // 单张图片 - if (imageCount == 1) { - return Container( - width: double.infinity, - height: 200, + String _getButtonImage() { + // if (item.isLive ?? false) { + // return Assets.imagesLiveIcon; // 直播显示直播间按钮(放在HI位置) + // } else if (item.isOnline ?? false) { + // return Assets.imagesHiIcon; // 在线显示HI按钮 + // } else { + // return Assets.imagesSendMessageIcon; // 下线显示发消息按钮(放在HI位置) + // } + // } + + return Assets.imagesLiveIcon; // 直播显示直播间按钮(放在HI位置) + } +} + +// 统一的内容卡片组件,根据接口数据显示不同状态 +class ContentCard extends StatelessWidget { + final MarriageData item; + const ContentCard({required this.item}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + // 点击卡片跳转到用户信息页面,传递用户数据 + Get.to(() => UserInformationPage(userData: item)); + }, + child: Container( decoration: BoxDecoration( - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(12), - bottomRight: Radius.circular(12), - ), + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 8, + offset: Offset(0, 4), + ), + ], ), - child: Image.network( - _cleanImageUrl(item.photoList[0].photoUrl), - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Image.asset( - Assets.imagesExampleContent, - fit: BoxFit.cover, - ); - }, + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 头部:头像、昵称、在线状态、按钮等 - 所有按钮都放在HI位置 + _CardHeader(item: item), + const SizedBox(height: 8), + + // 内容区域 - 根据类型显示不同内容 + _buildContent(), + ], ), - ); - } - - // 多张图片网格布局 - return GridView.builder( - shrinkWrap: true, - physics: NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 2, - crossAxisSpacing: 2, ), - itemCount: imageCount, - itemBuilder: (context, index) { - return Container( - height: 100, - child: Image.network( - _cleanImageUrl(item.photoList[index].photoUrl), - fit: BoxFit.cover, - errorBuilder: (context, error, stackTrace) { - return Image.asset( - Assets.imagesExampleContent, - fit: BoxFit.cover, - ); - }, - ), + ); + } + + Widget _buildContent() { + return Builder( + builder: (context) { + final List contentWidgets = []; + // 内容文本 + if (item.describeInfo != null && item.describeInfo!.isNotEmpty) { + contentWidgets.add( + SizedBox( + // height: 20, // 固定高度20 + child: Text( + item.describeInfo!, + style: TextStyle( + fontSize: 13, + color: Color.fromRGBO(51, 51, 51, 0.6), + ), + overflow: TextOverflow.ellipsis, // 文本超出显示... + maxLines: 1, // 限制为单行 + ), + ), + ); + } + + // 根据接口返回的图片列表动态显示图片 + if (item.photoList != null && item.photoList!.isNotEmpty) { + contentWidgets.add(const SizedBox(height: 16)); + + // 计算固定宽度:每张图片的宽度 = (屏幕宽度 - 卡片左右padding - ListView左右padding - 图片间距) / 3 + // 卡片左右padding: 12 * 2 = 24 + // ListView左右padding: 12 * 2 = 24 + // 3张图片时,间距: 12 * 2 = 24 (第2张和第3张左边各12) + final screenWidth = MediaQuery.of(context).size.width; + final cardPadding = 12.0 * 2; // 卡片左右padding + final listPadding = 12.0 * 2; // ListView左右padding + final imageSpacing = 12.0 * 2; // 3张图片时的总间距 + final imageWidth = + (screenWidth - cardPadding - listPadding - imageSpacing) / 3; + final imageHeight = imageWidth * 1.05; // aspectRatio 1.05 + + // 统一使用相同的布局:无论1张、2张还是3张,都使用相同的显示方式和大小 + // 最多显示3张,按顺序排列 + final displayPhotos = item.photoList!.take(3).toList(); + contentWidgets.add( + Row( + children: displayPhotos.asMap().entries.map((entry) { + int index = entry.key; + String imageUrl = entry.value.photoUrl ?? ''; + return Padding( + padding: EdgeInsets.only(left: index > 0 ? 12 : 0), + child: SizedBox( + width: imageWidth, + height: imageHeight, + child: _NetworkImageWidget( + imageUrl: imageUrl, + aspectRatio: 1.05, + ), + ), + ); + }).toList(), + ), + ); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: contentWidgets, ); }, ); } - - // 清理图片URL中的空格和多余字符 - String _cleanImageUrl(String url) { - return url.trim(); +} + +// 网络图片组件,支持加载网络图片并显示占位图 - 修复可能的闪退问题 +class _NetworkImageWidget extends StatelessWidget { + final String imageUrl; + final double aspectRatio; + const _NetworkImageWidget({ + required this.imageUrl, + required this.aspectRatio, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + image: DecorationImage( + image: imageUrl.isNotEmpty + ? NetworkImage(imageUrl) + : AssetImage(Assets.imagesAvatarsExample) as ImageProvider, + fit: BoxFit.cover, + ), + ), + width: double.infinity, + height: double.infinity, + ); } -} \ No newline at end of file +} diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index c8e9a7f..32c58a9 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -1,48 +1,26 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:dating_touchme_app/generated/assets.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:easy_refresh/easy_refresh.dart'; import 'package:dating_touchme_app/controller/home/home_controller.dart'; -import 'package:dating_touchme_app/model/home/marriage_data.dart'; -import 'package:dating_touchme_app/pages/home/user_information_page.dart'; +import 'package:dating_touchme_app/pages/home/recommend_tab.dart'; +import 'package:dating_touchme_app/pages/home/nearby_tab.dart'; class HomePage extends StatefulWidget { - const HomePage({super.key}); - - @override - State createState() => _HomePageState(); - } + const HomePage({super.key}); + @override + State createState() => _HomePageState(); +} -class _HomePageState extends State with AutomaticKeepAliveClientMixin { - // 使用GetX注入HomeController - final HomeController ctrl = Get.put(HomeController()); - // 推荐列表的刷新控制器 - late final EasyRefreshController _recommendRefreshController; - // 同城列表的刷新控制器 - late final EasyRefreshController _nearbyRefreshController; - +class _HomePageState extends State + with AutomaticKeepAliveClientMixin { @override void initState() { super.initState(); - // 初始化推荐列表刷新控制器 - _recommendRefreshController = EasyRefreshController( - controlFinishRefresh: true, - controlFinishLoad: true, - ); - // 初始化同城列表刷新控制器 - _nearbyRefreshController = EasyRefreshController( - controlFinishRefresh: true, - controlFinishLoad: true, - ); - } - - @override - void dispose() { - _recommendRefreshController.dispose(); - _nearbyRefreshController.dispose(); - super.dispose(); + // 确保 HomeController 已注册 + if (!Get.isRegistered()) { + Get.put(HomeController()); + } } @override @@ -50,11 +28,6 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin super.build(context); return GetBuilder( builder: (controller) { - // 获取底部安全区域高度和 tabbar 高度(约64) - final bottomPadding = MediaQuery.of(context).padding.bottom; - final tabBarHeight = 64.0; - final totalBottomPadding = bottomPadding + tabBarHeight; - return Stack( children: [ // 背景图 - 覆盖整个屏幕包括状态栏和导航栏 @@ -71,18 +44,18 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin // 使用 IndexedStack 保持两个列表的状态,根据当前选中的标签显示对应的列表 return IndexedStack( index: controller.selectedTabIndex.value, - children: [ + children: const [ // 推荐列表 - _buildRecommendList(controller, totalBottomPadding), + RecommendTab(), // 同城列表 - _buildNearbyList(controller, totalBottomPadding), + NearbyTab(), ], ); }), ), ], ); - } + }, ); } @@ -102,16 +75,6 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin _buildTabButton(title: '同城', index: 1, controller: controller), ], ), - // actions: [ - // Padding( - // padding: const EdgeInsets.only(right: 16), - // child: Image.asset( - // Assets.imagesOnlineIcon, - // width: 20, - // height: 20, - // ), - // ), - // ], bottom: const PreferredSize( preferredSize: Size.fromHeight(4), child: SizedBox(height: 4), @@ -119,7 +82,11 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin ); } - Widget _buildTabButton({required String title, required int index, required HomeController controller}) { + Widget _buildTabButton({ + required String title, + required int index, + required HomeController controller, + }) { final bool selected = controller.selectedTabIndex.value == index; return GestureDetector( onTap: () { @@ -139,575 +106,20 @@ class _HomePageState extends State with AutomaticKeepAliveClientMixin style: TextStyle( fontSize: selected ? 19 : 17, fontWeight: selected ? FontWeight.w700 : FontWeight.w400, - color: selected ? const Color(0xFF333333) : const Color(0xFF999999), + color: selected + ? const Color(0xFF333333) + : const Color(0xFF999999), ), ), const SizedBox(height: 6), selected - ? Image.asset( - Assets.imagesTabChangeIcon, - width: 32, - height: 8, - ) + ? Image.asset(Assets.imagesTabChangeIcon, width: 32, height: 8) : const SizedBox(height: 8), ], ), ); } - // 构建推荐列表 - Widget _buildRecommendList(HomeController controller, double totalBottomPadding) { - return Obx(() { - final List dataSource = controller.recommendFeed; - final bool isLoading = controller.recommendIsLoading.value; - final bool hasMore = controller.recommendHasMore.value; - - return EasyRefresh( - controller: _recommendRefreshController, - header: MaterialHeader( - backgroundColor: Colors.red.withOpacity(0.9), - ), - footer: MaterialFooter( - backgroundColor: Colors.red.withOpacity(0.9), - ), - // 下拉刷新 - onRefresh: () async { - print('推荐列表下拉刷新被触发'); - try { - await controller.refreshRecommendData(); - _recommendRefreshController.finishRefresh(IndicatorResult.success); - print('推荐列表刷新完成'); - } catch (e) { - print('推荐列表刷新失败: $e'); - _recommendRefreshController.finishRefresh(IndicatorResult.fail); - } - }, - // 上拉加载更多 - onLoad: () async { - print('推荐列表上拉加载被触发, hasMore: $hasMore'); - if (hasMore && controller.recommendHasMore.value) { - try { - await controller.loadRecommendMoreData(); - // 完成加载,根据是否有更多数据决定 - if (controller.recommendHasMore.value) { - _recommendRefreshController.finishLoad(IndicatorResult.success); - print('推荐列表加载更多成功'); - } else { - _recommendRefreshController.finishLoad(IndicatorResult.noMore); - print('推荐列表没有更多数据了'); - } - } catch (e) { - print('推荐列表加载更多失败: $e'); - _recommendRefreshController.finishLoad(IndicatorResult.fail); - } - } else { - _recommendRefreshController.finishLoad(IndicatorResult.noMore); - print('推荐列表没有更多数据'); - } - }, - // EasyRefresh 的 child 必须始终是可滚动的 Widget - child: ListView.separated( - // 关键:始终允许滚动,即使内容不足 - physics: const AlwaysScrollableScrollPhysics( - parent: BouncingScrollPhysics(), - ), - // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 - padding: EdgeInsets.only( - left: 12, - right: 12, - bottom: totalBottomPadding + 12, - ), - itemBuilder: (context, index) { - // 加载状态 - if (isLoading && dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height * 1.2, - child: const Center( - child: CircularProgressIndicator(), - ), - ); - } - // 空数据状态 - if (!isLoading && dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height * 1.2, - child: const Center( - child: Text( - "暂无数据", - style: TextStyle( - fontSize: 14, - color: Color(0xFF999999), - ), - ), - ), - ); - } - // 数据项 - final item = dataSource[index]; - return ContentCard(item: item); - }, - separatorBuilder: (context, index) { - // 空状态或加载状态时不显示分隔符 - if (dataSource.isEmpty) return const SizedBox.shrink(); - return const SizedBox(height: 12); - }, - // 至少显示一个 item(用于显示加载或空状态) - itemCount: dataSource.isEmpty ? 1 : dataSource.length, - ), - ); - }); - } - - // 构建同城列表 - Widget _buildNearbyList(HomeController controller, double totalBottomPadding) { - return Obx(() { - final List dataSource = controller.nearbyFeed; - final bool isLoading = controller.nearbyIsLoading.value; - final bool hasMore = controller.nearbyHasMore.value; - - return EasyRefresh( - controller: _nearbyRefreshController, - header: MaterialHeader( - backgroundColor: Colors.red.withOpacity(0.9), - ), - footer: MaterialFooter( - backgroundColor: Colors.red.withOpacity(0.9), - ), - // 下拉刷新 - onRefresh: () async { - print('同城列表下拉刷新被触发'); - try { - await controller.refreshNearbyData(); - _nearbyRefreshController.finishRefresh(IndicatorResult.success); - print('同城列表刷新完成'); - } catch (e) { - print('同城列表刷新失败: $e'); - _nearbyRefreshController.finishRefresh(IndicatorResult.fail); - } - }, - // 上拉加载更多 - onLoad: () async { - print('同城列表上拉加载被触发, hasMore: $hasMore'); - if (hasMore && controller.nearbyHasMore.value) { - try { - await controller.loadNearbyMoreData(); - // 完成加载,根据是否有更多数据决定 - if (controller.nearbyHasMore.value) { - _nearbyRefreshController.finishLoad(IndicatorResult.success); - print('同城列表加载更多成功'); - } else { - _nearbyRefreshController.finishLoad(IndicatorResult.noMore); - print('同城列表没有更多数据了'); - } - } catch (e) { - print('同城列表加载更多失败: $e'); - _nearbyRefreshController.finishLoad(IndicatorResult.fail); - } - } else { - _nearbyRefreshController.finishLoad(IndicatorResult.noMore); - print('同城列表没有更多数据'); - } - }, - // EasyRefresh 的 child 必须始终是可滚动的 Widget - child: ListView.separated( - // 关键:始终允许滚动,即使内容不足 - physics: const AlwaysScrollableScrollPhysics( - parent: BouncingScrollPhysics(), - ), - // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 - padding: EdgeInsets.only( - left: 12, - right: 12, - bottom: totalBottomPadding + 12, - ), - itemBuilder: (context, index) { - // 加载状态 - if (isLoading && dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height * 1.2, - child: const Center( - child: CircularProgressIndicator(), - ), - ); - } - // 空数据状态 - if (!isLoading && dataSource.isEmpty && index == 0) { - // 使用足够的高度确保可以滚动 - return SizedBox( - height: MediaQuery.of(context).size.height * 1.2, - child: const Center( - child: Text( - "暂无数据", - style: TextStyle( - fontSize: 14, - color: Color(0xFF999999), - ), - ), - ), - ); - } - // 数据项 - final item = dataSource[index]; - return ContentCard(item: item); - }, - separatorBuilder: (context, index) { - // 空状态或加载状态时不显示分隔符 - if (dataSource.isEmpty) return const SizedBox.shrink(); - return const SizedBox(height: 12); - }, - // 至少显示一个 item(用于显示加载或空状态) - itemCount: dataSource.isEmpty ? 1 : dataSource.length, - ), - ); - }); - } - @override bool get wantKeepAlive => true; } - -// 通用头部组件:头像/昵称/在线/认证/Hi/直播中徽标 -class _CardHeader extends StatelessWidget { - final MarriageData item; - const _CardHeader({required this.item}); - - @override - Widget build(BuildContext context) { - final bool isLive = true;//item.isLive ?? false; - final bool isOnline = true;//item.isOnline ?? false; - - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - // 头像 + 状态小圆点 - Stack( - children: [ - // 头像 + 可选紫色描边 - Container( - padding: isLive ? const EdgeInsets.all(2) : EdgeInsets.zero, - decoration: isLive - ? BoxDecoration( - borderRadius: BorderRadius.circular(32), - border: Border.all(color: const Color(0xFFB58BFF), width: 2), - ) - : null, - child: ClipRRect( - borderRadius: BorderRadius.circular(30), - child: CachedNetworkImage( - imageUrl: item.avatar, - width: 60, - height: 60, - imageBuilder: (context, imageProvider) => Container( - decoration: BoxDecoration( - image: DecorationImage( - image: imageProvider, - fit: BoxFit.cover, - ), - ), - ), - errorWidget: (context, url, error) => Image.asset(Assets.imagesAvatarsExample, width: 60, height: 60, fit: BoxFit.cover), - ), - ), - ), - if (isOnline) - Positioned( - right: 6, - bottom: 1, - child: Container( - width: 12, - height: 12, - decoration: BoxDecoration( - color: isOnline ? const Color(0xFF2ED573) : const Color(0xFFCCCCCC), // 在线绿色,离线灰色 - shape: BoxShape.circle, - boxShadow: isOnline ? const [ - BoxShadow(color: Color(0x332ED573), blurRadius: 4, offset: Offset(0, 2)), - ] : [], - ), - ), - ), - if (isLive) - Positioned( - bottom: 0, - left: 0, - right: 0, - child: Container( - width: 37, - height: 14, - alignment: Alignment.center, // 关键:让子内容居中 - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage(Assets.imagesBtnBgIcon), - ), - ), - child: const Text( - '直播中', - style: TextStyle(color: Colors.white, fontSize: 8, fontWeight: FontWeight.w600), - ), - ), - ), - ], - ), - const SizedBox(width: 10), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 使用Wrap组件让所有标签在空间允许时显示在一行,空间不足时自动换行 - Wrap( - spacing: 6, - runSpacing: 2, - children: [ - // 用户名 - Text( - item.name ?? '用户', - style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500, color: Color.fromRGBO(51, 51, 51, 1)), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - // 在线徽标 - if (isOnline == true) - Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - decoration: BoxDecoration( - color: Color.fromRGBO(234, 255, 219, 1), - borderRadius: BorderRadius.circular(12), - ), - child: Text( - isOnline ? '在线' : '', - style: TextStyle(fontSize: 9, color: Color.fromRGBO(38, 199, 124, 1) ), - ), - ), - // 实名徽标 - if (item.isRealNameCertified == true) - Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - decoration: BoxDecoration( - color: const Color(0xFFF3E9FF), - borderRadius: BorderRadius.circular(12), - ), - constraints: BoxConstraints( - minWidth: 40, // 设置最小宽度以保证视觉效果 - ), - child: Row( - mainAxisSize: MainAxisSize.min, // 确保Row只占用必要的宽度 - children: [ - Image.asset(Assets.imagesVerifiedIcon, width: 14, height: 12), - const SizedBox(width: 4), - const Text( - '实名', - style: TextStyle(fontSize: 9, color: Color.fromRGBO(160, 92, 255, 1)), - ), - ], - ), - ), - // 直播状态下显示视频相亲中标签 - if (isLive) - Container( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), - decoration: BoxDecoration( - color: Color.fromRGBO(234, 255, 219, 1), - borderRadius: BorderRadius.circular(12), - ), - child: Text( - '视频相亲中', - style: TextStyle(fontSize: 9, color: Color.fromRGBO(38, 199, 124, 1)), - ), - ), - ], - ), - ], - ), - const SizedBox(height: 6), - SizedBox( - height: 16, - child: Text( - '${item.age ?? 0}岁 · ${item.cityName ?? ''}${item.districtName != null ? item.districtName : ''}', - style: TextStyle(fontSize: 12, color: Color.fromRGBO(51, 51, 51, 1)), - overflow: TextOverflow.ellipsis, - ), - ) - ], - ), - ), - // 根据不同状态显示不同按钮 - 都放在HI按钮相同位置 - InkWell( - onTap: () { - // 点击事件处理 - if (isLive) { - // 进入直播间逻辑 - print('进入直播间'); - } else if (isOnline) { - // HI按钮点击逻辑 - print('HI点击'); - } else { - // 发消息按钮点击逻辑 - print('发送消息'); - } - }, - child: Image.asset( - _getButtonImage(), - // width: (item.isLive ?? false) ? 60 : 40, - width: (true) ? 60 : 40, - height: 20, - ), - ), - ], - ); - } - - String _getButtonImage() { - // if (item.isLive ?? false) { - // return Assets.imagesLiveIcon; // 直播显示直播间按钮(放在HI位置) - // } else if (item.isOnline ?? false) { - // return Assets.imagesHiIcon; // 在线显示HI按钮 - // } else { - // return Assets.imagesSendMessageIcon; // 下线显示发消息按钮(放在HI位置) - // } - // } - - return Assets.imagesLiveIcon; // 直播显示直播间按钮(放在HI位置) - } - -} - -// 统一的内容卡片组件,根据接口数据显示不同状态 -class ContentCard extends StatelessWidget { - final MarriageData item; - const ContentCard({required this.item}); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () { - // 点击卡片跳转到用户信息页面,传递用户数据 - Get.to(() => UserInformationPage(userData: item)); - }, - child: Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(12), - boxShadow: const [ - BoxShadow( - color: Color(0x14000000), - blurRadius: 8, - offset: Offset(0, 4), - ), - ], - ), - padding: const EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 头部:头像、昵称、在线状态、按钮等 - 所有按钮都放在HI位置 - _CardHeader(item: item), - const SizedBox(height: 8), - - // 内容区域 - 根据类型显示不同内容 - _buildContent(), - ], - ), - ), - ); - } - - Widget _buildContent() { - return Builder( - builder: (context) { - final List contentWidgets = []; - // 内容文本 - if (item.describeInfo != null && item.describeInfo!.isNotEmpty) { - contentWidgets.add( - SizedBox( - // height: 20, // 固定高度20 - child: Text( - item.describeInfo!, - style: TextStyle( - fontSize: 13, - color: Color.fromRGBO(51, 51, 51, 0.6), - ), - overflow: TextOverflow.ellipsis, // 文本超出显示... - maxLines: 1, // 限制为单行 - ), - ), - ); - } - - // 根据接口返回的图片列表动态显示图片 - if (item.photoList != null && item.photoList!.isNotEmpty) { - contentWidgets.add(const SizedBox(height: 16)); - - // 计算固定宽度:每张图片的宽度 = (屏幕宽度 - 卡片左右padding - ListView左右padding - 图片间距) / 3 - // 卡片左右padding: 12 * 2 = 24 - // ListView左右padding: 12 * 2 = 24 - // 3张图片时,间距: 12 * 2 = 24 (第2张和第3张左边各12) - final screenWidth = MediaQuery.of(context).size.width; - final cardPadding = 12.0 * 2; // 卡片左右padding - final listPadding = 12.0 * 2; // ListView左右padding - final imageSpacing = 12.0 * 2; // 3张图片时的总间距 - final imageWidth = (screenWidth - cardPadding - listPadding - imageSpacing) / 3; - final imageHeight = imageWidth * 1.05; // aspectRatio 1.05 - - // 统一使用相同的布局:无论1张、2张还是3张,都使用相同的显示方式和大小 - // 最多显示3张,按顺序排列 - final displayPhotos = item.photoList!.take(3).toList(); - contentWidgets.add( - Row( - children: displayPhotos.asMap().entries.map((entry) { - int index = entry.key; - String imageUrl = entry.value.photoUrl ?? ''; - return Padding( - padding: EdgeInsets.only(left: index > 0 ? 12 : 0), - child: SizedBox( - width: imageWidth, - height: imageHeight, - child: _NetworkImageWidget(imageUrl: imageUrl, aspectRatio: 1.05), - // child: CachedNetworkImage( - // imageUrl: imageUrl, - // height: imageWidth, - // width: imageWidth, - // ), - ), - ); - }).toList(), - ), - ); - } - - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: contentWidgets, - ); - }, - ); - } -} - -// 占位组件已被带描边版本替代,保留空实现会触发未使用告警,故移除 - -// 网络图片组件,支持加载网络图片并显示占位图 - 修复可能的闪退问题 -class _NetworkImageWidget extends StatelessWidget { - final String imageUrl; - final double aspectRatio; - const _NetworkImageWidget({required this.imageUrl, required this.aspectRatio}); - - @override - Widget build(BuildContext context) { - return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - image: DecorationImage( - image: imageUrl.isNotEmpty ? NetworkImage(imageUrl) : AssetImage(Assets.imagesAvatarsExample) as ImageProvider, - fit: BoxFit.cover, - ), - ), - width: double.infinity, - height: double.infinity, - ); - } -} diff --git a/lib/pages/home/nearby_tab.dart b/lib/pages/home/nearby_tab.dart new file mode 100644 index 0000000..e0d0464 --- /dev/null +++ b/lib/pages/home/nearby_tab.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:easy_refresh/easy_refresh.dart'; +import 'package:dating_touchme_app/controller/home/home_controller.dart'; +import 'package:dating_touchme_app/model/home/marriage_data.dart'; +import 'package:dating_touchme_app/pages/home/content_card.dart'; + +/// 同城列表 Tab +class NearbyTab extends StatefulWidget { + const NearbyTab({super.key}); + + @override + State createState() => _NearbyTabState(); +} + +class _NearbyTabState extends State + with AutomaticKeepAliveClientMixin { + final HomeController controller = Get.find(); + late final EasyRefreshController _refreshController; + + @override + void initState() { + super.initState(); + _refreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); + } + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + // 获取底部安全区域高度和 tabbar 高度(约64) + final bottomPadding = MediaQuery.of(context).padding.bottom; + final tabBarHeight = 64.0; + final totalBottomPadding = bottomPadding + tabBarHeight; + + return Obx(() { + final List dataSource = controller.nearbyFeed; + final bool isLoading = controller.nearbyIsLoading.value; + final bool hasMore = controller.nearbyHasMore.value; + + return EasyRefresh( + controller: _refreshController, + header: MaterialHeader(backgroundColor: Colors.red.withOpacity(0.9)), + footer: MaterialFooter(backgroundColor: Colors.red.withOpacity(0.9)), + // 下拉刷新 + onRefresh: () async { + print('同城列表下拉刷新被触发'); + try { + await controller.refreshNearbyData(); + _refreshController.finishRefresh(IndicatorResult.success); + print('同城列表刷新完成'); + } catch (e) { + print('同城列表刷新失败: $e'); + _refreshController.finishRefresh(IndicatorResult.fail); + } + }, + // 上拉加载更多 + onLoad: () async { + print('同城列表上拉加载被触发, hasMore: $hasMore'); + if (hasMore && controller.nearbyHasMore.value) { + try { + await controller.loadNearbyMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.nearbyHasMore.value) { + _refreshController.finishLoad(IndicatorResult.success); + print('同城列表加载更多成功'); + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('同城列表没有更多数据了'); + } + } catch (e) { + print('同城列表加载更多失败: $e'); + _refreshController.finishLoad(IndicatorResult.fail); + } + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('同城列表没有更多数据'); + } + }, + // EasyRefresh 的 child 必须始终是可滚动的 Widget + child: ListView.separated( + // 关键:始终允许滚动,即使内容不足 + physics: const AlwaysScrollableScrollPhysics( + parent: BouncingScrollPhysics(), + ), + // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 + padding: EdgeInsets.only( + left: 12, + right: 12, + bottom: totalBottomPadding + 12, + ), + itemBuilder: (context, index) { + // 加载状态 + if (isLoading && dataSource.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + return SizedBox( + height: MediaQuery.of(context).size.height * 1.2, + child: const Center(child: CircularProgressIndicator()), + ); + } + // 空数据状态 + if (!isLoading && dataSource.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + return SizedBox( + height: MediaQuery.of(context).size.height * 1.2, + child: const Center( + child: Text( + "暂无数据", + style: TextStyle(fontSize: 14, color: Color(0xFF999999)), + ), + ), + ); + } + // 数据项 + final item = dataSource[index]; + return ContentCard(item: item); + }, + separatorBuilder: (context, index) { + // 空状态或加载状态时不显示分隔符 + if (dataSource.isEmpty) return const SizedBox.shrink(); + return const SizedBox(height: 12); + }, + // 至少显示一个 item(用于显示加载或空状态) + itemCount: dataSource.isEmpty ? 1 : dataSource.length, + ), + ); + }); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/lib/pages/home/recommend_tab.dart b/lib/pages/home/recommend_tab.dart new file mode 100644 index 0000000..20b05b3 --- /dev/null +++ b/lib/pages/home/recommend_tab.dart @@ -0,0 +1,140 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:easy_refresh/easy_refresh.dart'; +import 'package:dating_touchme_app/controller/home/home_controller.dart'; +import 'package:dating_touchme_app/model/home/marriage_data.dart'; +import 'package:dating_touchme_app/pages/home/content_card.dart'; + +/// 推荐列表 Tab +class RecommendTab extends StatefulWidget { + const RecommendTab({super.key}); + + @override + State createState() => _RecommendTabState(); +} + +class _RecommendTabState extends State + with AutomaticKeepAliveClientMixin { + final HomeController controller = Get.find(); + late final EasyRefreshController _refreshController; + + @override + void initState() { + super.initState(); + _refreshController = EasyRefreshController( + controlFinishRefresh: true, + controlFinishLoad: true, + ); + } + + @override + void dispose() { + _refreshController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + // 获取底部安全区域高度和 tabbar 高度(约64) + final bottomPadding = MediaQuery.of(context).padding.bottom; + final tabBarHeight = 64.0; + final totalBottomPadding = bottomPadding + tabBarHeight; + + return Obx(() { + final List dataSource = controller.recommendFeed; + final bool isLoading = controller.recommendIsLoading.value; + final bool hasMore = controller.recommendHasMore.value; + + return EasyRefresh( + controller: _refreshController, + header: MaterialHeader(backgroundColor: Colors.red.withOpacity(0.9)), + footer: MaterialFooter(backgroundColor: Colors.red.withOpacity(0.9)), + // 下拉刷新 + onRefresh: () async { + print('推荐列表下拉刷新被触发'); + try { + await controller.refreshRecommendData(); + _refreshController.finishRefresh(IndicatorResult.success); + print('推荐列表刷新完成'); + } catch (e) { + print('推荐列表刷新失败: $e'); + _refreshController.finishRefresh(IndicatorResult.fail); + } + }, + // 上拉加载更多 + onLoad: () async { + print('推荐列表上拉加载被触发, hasMore: $hasMore'); + if (hasMore && controller.recommendHasMore.value) { + try { + await controller.loadRecommendMoreData(); + // 完成加载,根据是否有更多数据决定 + if (controller.recommendHasMore.value) { + _refreshController.finishLoad(IndicatorResult.success); + print('推荐列表加载更多成功'); + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('推荐列表没有更多数据了'); + } + } catch (e) { + print('推荐列表加载更多失败: $e'); + _refreshController.finishLoad(IndicatorResult.fail); + } + } else { + _refreshController.finishLoad(IndicatorResult.noMore); + print('推荐列表没有更多数据'); + } + }, + // EasyRefresh 的 child 必须始终是可滚动的 Widget + child: ListView.separated( + // 关键:始终允许滚动,即使内容不足 + physics: const AlwaysScrollableScrollPhysics( + parent: BouncingScrollPhysics(), + ), + // 移除顶部 padding,让刷新指示器可以正确显示在 AppBar 下方 + padding: EdgeInsets.only( + left: 12, + right: 12, + bottom: totalBottomPadding + 12, + ), + itemBuilder: (context, index) { + // 加载状态 + if (isLoading && dataSource.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + return SizedBox( + height: MediaQuery.of(context).size.height * 1.2, + child: const Center(child: CircularProgressIndicator()), + ); + } + // 空数据状态 + if (!isLoading && dataSource.isEmpty && index == 0) { + // 使用足够的高度确保可以滚动 + return SizedBox( + height: MediaQuery.of(context).size.height * 1.2, + child: const Center( + child: Text( + "暂无数据", + style: TextStyle(fontSize: 14, color: Color(0xFF999999)), + ), + ), + ); + } + // 数据项 + final item = dataSource[index]; + return ContentCard(item: item); + }, + separatorBuilder: (context, index) { + // 空状态或加载状态时不显示分隔符 + if (dataSource.isEmpty) return const SizedBox.shrink(); + return const SizedBox(height: 12); + }, + // 至少显示一个 item(用于显示加载或空状态) + itemCount: dataSource.isEmpty ? 1 : dataSource.length, + ), + ); + }); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/pubspec.lock b/pubspec.lock index 3389ecc..ec6bd42 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "88.0.0" agora_rtc_engine: @@ -14,7 +14,7 @@ packages: description: name: agora_rtc_engine sha256: "6559294d18ce4445420e19dbdba10fb58cac955cd8f22dbceae26716e194d70e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.3" analyzer: @@ -22,7 +22,7 @@ packages: description: name: analyzer sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.1.1" ansicolor: @@ -30,7 +30,7 @@ packages: description: name: ansicolor sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" archive: @@ -38,7 +38,7 @@ packages: description: name: archive sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.7" args: @@ -46,7 +46,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" async: @@ -54,7 +54,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.13.0" audioplayers: @@ -62,7 +62,7 @@ packages: description: name: audioplayers sha256: "5441fa0ceb8807a5ad701199806510e56afde2b4913d9d17c2f19f2902cf0ae4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.1" audioplayers_android: @@ -70,7 +70,7 @@ packages: description: name: audioplayers_android sha256: "60a6728277228413a85755bd3ffd6fab98f6555608923813ce383b190a360605" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.2.1" audioplayers_darwin: @@ -78,7 +78,7 @@ packages: description: name: audioplayers_darwin sha256: "0811d6924904ca13f9ef90d19081e4a87f7297ddc19fc3d31f60af1aaafee333" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.3.0" audioplayers_linux: @@ -86,7 +86,7 @@ packages: description: name: audioplayers_linux sha256: f75bce1ce864170ef5e6a2c6a61cd3339e1a17ce11e99a25bae4474ea491d001 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.1" audioplayers_platform_interface: @@ -94,7 +94,7 @@ packages: description: name: audioplayers_platform_interface sha256: "0e2f6a919ab56d0fec272e801abc07b26ae7f31980f912f24af4748763e5a656" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.1.1" audioplayers_web: @@ -102,7 +102,7 @@ packages: description: name: audioplayers_web sha256: "1c0f17cec68455556775f1e50ca85c40c05c714a99c5eb1d2d57cc17ba5522d7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" audioplayers_windows: @@ -110,7 +110,7 @@ packages: description: name: audioplayers_windows sha256: "4048797865105b26d47628e6abb49231ea5de84884160229251f37dfcbe52fd7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.1" boolean_selector: @@ -118,7 +118,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" build: @@ -126,7 +126,7 @@ packages: description: name: build sha256: dfb67ccc9a78c642193e0c2d94cb9e48c2c818b3178a86097d644acdcde6a8d9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" build_config: @@ -134,7 +134,7 @@ packages: description: name: build_config sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.0" build_daemon: @@ -142,7 +142,7 @@ packages: description: name: build_daemon sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.1" build_runner: @@ -150,7 +150,7 @@ packages: description: name: build_runner sha256: "04f69b1502f66e22ae7990bbd01eb552b7f12793c4d3ea6e715d0ac5e98bcdac" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.10.2" built_collection: @@ -158,7 +158,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: @@ -166,7 +166,7 @@ packages: description: name: built_value sha256: a30f0a0e38671e89a492c44d005b5545b830a961575bbd8336d42869ff71066d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.12.0" cached_network_image: @@ -174,7 +174,7 @@ packages: description: name: cached_network_image sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.1" cached_network_image_platform_interface: @@ -182,7 +182,7 @@ packages: description: name: cached_network_image_platform_interface sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.1" cached_network_image_web: @@ -190,7 +190,7 @@ packages: description: name: cached_network_image_web sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" camera: @@ -198,7 +198,7 @@ packages: description: name: camera sha256: dfa8fc5a1adaeb95e7a54d86a5bd56f4bb0e035515354c8ac6d262e35cec2ec8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.10.6" camera_android: @@ -206,7 +206,7 @@ packages: description: name: camera_android sha256: "8397c4fcec4f4dbafdeff994adc6ed16dcaa4a25f02e70e3b8fbe59c9a88807f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.10.10+11" camera_avfoundation: @@ -214,7 +214,7 @@ packages: description: name: camera_avfoundation sha256: "34bcd5db30e52414f1f0783c5e3f566909fab14141a21b3b576c78bd35382bf6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.22+4" camera_platform_interface: @@ -222,7 +222,7 @@ packages: description: name: camera_platform_interface sha256: "98cfc9357e04bad617671b4c1f78a597f25f08003089dd94050709ae54effc63" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.12.0" camera_web: @@ -230,7 +230,7 @@ packages: description: name: camera_web sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5" characters: @@ -238,7 +238,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" checked_yaml: @@ -246,7 +246,7 @@ packages: description: name: checked_yaml sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.4" chewie: @@ -254,7 +254,7 @@ packages: description: name: chewie sha256: "44bcfc5f0dfd1de290c87c9d86a61308b3282a70b63435d5557cfd60f54a69ca" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.13.0" clock: @@ -262,7 +262,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" code_builder: @@ -270,7 +270,7 @@ packages: description: name: code_builder sha256: "11654819532ba94c34de52ff5feb52bd81cba1de00ef2ed622fd50295f9d4243" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.11.0" collection: @@ -278,7 +278,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.1" common_utils: @@ -286,7 +286,7 @@ packages: description: name: common_utils sha256: c26884339b13ff99b0739e56f4b02090c84054ed9dd3a045435cd24e7b99c2c1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" convert: @@ -294,7 +294,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" cross_file: @@ -302,7 +302,7 @@ packages: description: name: cross_file sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.3.5" crypto: @@ -310,7 +310,7 @@ packages: description: name: crypto sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.7" csslib: @@ -318,7 +318,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" cupertino_icons: @@ -326,7 +326,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" dart_style: @@ -334,7 +334,7 @@ packages: description: name: dart_style sha256: c87dfe3d56f183ffe9106a18aebc6db431fc7c98c31a54b952a77f3d54a85697 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" dbus: @@ -342,7 +342,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.11" decimal: @@ -350,7 +350,7 @@ packages: description: name: decimal sha256: fc706a5618b81e5b367b01dd62621def37abc096f2b46a9bd9068b64c1fa36d0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.4" dio: @@ -358,7 +358,7 @@ packages: description: name: dio sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.9.0" dio_web_adapter: @@ -366,7 +366,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" easy_localization: @@ -374,7 +374,7 @@ packages: description: name: easy_localization sha256: "2ccdf9db8fe4d9c5a75c122e6275674508fd0f0d49c827354967b8afcc56bbed" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.8" easy_logger: @@ -382,7 +382,7 @@ packages: description: name: easy_logger sha256: c764a6e024846f33405a2342caf91c62e357c24b02c04dbc712ef232bf30ffb7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.0.2" easy_refresh: @@ -390,7 +390,7 @@ packages: description: name: easy_refresh sha256: "486e30abfcaae66c0f2c2798a10de2298eb9dc5e0bb7e1dba9328308968cae0c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.0" event_bus: @@ -398,7 +398,7 @@ packages: description: name: event_bus sha256: "1a55e97923769c286d295240048fc180e7b0768902c3c2e869fe059aafa15304" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" extended_image: @@ -406,7 +406,7 @@ packages: description: name: extended_image sha256: "85199f9233e03abc2ce2e68cbb2991648666af4a527ae4e6250935be8edfddae" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.1.0" extended_image_library: @@ -414,7 +414,7 @@ packages: description: name: extended_image_library sha256: e61dafd94400fff6ef7ed1523d445ff3af137f198f3228e4a3107bc5b4bec5d1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.6" fake_async: @@ -422,7 +422,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.3" ffi: @@ -430,7 +430,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" file: @@ -438,7 +438,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" file_selector_linux: @@ -446,7 +446,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.3+2" file_selector_macos: @@ -454,7 +454,7 @@ packages: description: name: file_selector_macos sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.4+5" file_selector_platform_interface: @@ -462,7 +462,7 @@ packages: description: name: file_selector_platform_interface sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.7.0" file_selector_windows: @@ -470,7 +470,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.9.3+4" fixnum: @@ -478,7 +478,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" flustars: @@ -486,7 +486,7 @@ packages: description: name: flustars sha256: "7019ab8d68c0d4759ee122644d91a165d450b0492717f9e7e9d0ce277dcf664b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" flutter: @@ -499,7 +499,7 @@ packages: description: name: flutter_cache_manager sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.1" flutter_lints: @@ -507,7 +507,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.0" flutter_localizations: @@ -520,7 +520,7 @@ packages: description: name: flutter_native_splash sha256: "4fb9f4113350d3a80841ce05ebf1976a36de622af7d19aca0ca9a9911c7ff002" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.7" flutter_oss_aliyun: @@ -528,7 +528,7 @@ packages: description: name: flutter_oss_aliyun sha256: "8280c1e8dfb792dec6449d1e6052e1d3492b3b3a1dfee456cc41d3f31b4cbc26" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.4.2" flutter_plugin_android_lifecycle: @@ -536,7 +536,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.32" flutter_screenutil: @@ -544,7 +544,7 @@ packages: description: name: flutter_screenutil sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.9.3" flutter_slidable: @@ -552,7 +552,7 @@ packages: description: name: flutter_slidable sha256: a857de7ea701f276fd6a6c4c67ae885b60729a3449e42766bb0e655171042801 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" flutter_smart_dialog: @@ -560,7 +560,7 @@ packages: description: name: flutter_smart_dialog sha256: "0852df132cb03fd8fc5144eb404c31eb7eb50c22aecb1cc2504f2f598090d756" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.8+9" flutter_swiper_null_safety: @@ -568,7 +568,7 @@ packages: description: name: flutter_swiper_null_safety sha256: "5a855e0080d035c08e82f8b7fd2f106344943a30c9ab483b2584860a2f22eaaf" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" flutter_test: @@ -586,7 +586,7 @@ packages: description: name: fluwx sha256: "7e92d2000ee49c5262a88c51ea2d22b91a753d5b29df27cc264bb0a115d65373" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.7.5" frontend_server_client: @@ -594,7 +594,7 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" get: @@ -602,7 +602,7 @@ packages: description: name: get sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.7.2" get_storage: @@ -610,7 +610,7 @@ packages: description: name: get_storage sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" glob: @@ -618,7 +618,7 @@ packages: description: name: glob sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" graphs: @@ -626,7 +626,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" hotreloader: @@ -634,7 +634,7 @@ packages: description: name: hotreloader sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" html: @@ -642,7 +642,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.15.6" http: @@ -650,7 +650,7 @@ packages: description: name: http sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.6.0" http_client_helper: @@ -658,7 +658,7 @@ packages: description: name: http_client_helper sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" http_multi_server: @@ -666,7 +666,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" http_parser: @@ -674,7 +674,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" im_flutter_sdk: @@ -682,7 +682,7 @@ packages: description: name: im_flutter_sdk sha256: "5f81988c5edf14a4e3868b9c47f01de2ee355e2203ae5bd95d7cacfe30e15d97" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.15.2" im_flutter_sdk_android: @@ -690,7 +690,7 @@ packages: description: name: im_flutter_sdk_android sha256: ce4e01f1374a6cf20bb46f6774e1effbde5c014fd1cd3003b6604813e4fe9e71 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.15.2" im_flutter_sdk_interface: @@ -698,7 +698,7 @@ packages: description: name: im_flutter_sdk_interface sha256: "08ad3ce9fc935e24272bce34aebfd9b3c3c30aab2b9e7d4b2e759acf4a4874f5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.15.2" im_flutter_sdk_ios: @@ -706,7 +706,7 @@ packages: description: name: im_flutter_sdk_ios sha256: "11300c086f5821730224932c28860198ef5d879f7941f9158dddee499f7bb60e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.15.2" image: @@ -714,7 +714,7 @@ packages: description: name: image sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.5.4" image_picker: @@ -722,7 +722,7 @@ packages: description: name: image_picker sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" image_picker_android: @@ -730,7 +730,7 @@ packages: description: name: image_picker_android sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.12+23" image_picker_for_web: @@ -738,7 +738,7 @@ packages: description: name: image_picker_for_web sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" image_picker_ios: @@ -746,7 +746,7 @@ packages: description: name: image_picker_ios sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.8.13+1" image_picker_linux: @@ -754,7 +754,7 @@ packages: description: name: image_picker_linux sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" image_picker_macos: @@ -762,7 +762,7 @@ packages: description: name: image_picker_macos sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2+1" image_picker_platform_interface: @@ -770,7 +770,7 @@ packages: description: name: image_picker_platform_interface sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.1" image_picker_windows: @@ -778,7 +778,7 @@ packages: description: name: image_picker_windows sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.2" intl: @@ -786,7 +786,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.20.2" io: @@ -794,7 +794,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" iris_method_channel: @@ -802,7 +802,7 @@ packages: description: name: iris_method_channel sha256: bfb5cfc6c6eae42da8cd1b35977a72d8b8881848a5dfc3d672e4760a907d11a0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.4" js: @@ -810,7 +810,7 @@ packages: description: name: js sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.2" json_annotation: @@ -818,7 +818,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" json_serializable: @@ -826,7 +826,7 @@ packages: description: name: json_serializable sha256: "33a040668b31b320aafa4822b7b1e177e163fc3c1e835c6750319d4ab23aa6fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.11.1" leak_tracker: @@ -834,7 +834,7 @@ packages: description: name: leak_tracker sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "11.0.2" leak_tracker_flutter_testing: @@ -842,7 +842,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.10" leak_tracker_testing: @@ -850,7 +850,7 @@ packages: description: name: leak_tracker_testing sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" lean_builder: @@ -858,7 +858,7 @@ packages: description: name: lean_builder sha256: ef5cd5f907157eb7aa87d1704504b5a6386d2cbff88a3c2b3344477bab323ee9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.2" lints: @@ -866,7 +866,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" logging: @@ -874,7 +874,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" matcher: @@ -882,7 +882,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.17" material_color_utilities: @@ -890,7 +890,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -898,7 +898,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.16.0" mime: @@ -906,7 +906,7 @@ packages: description: name: mime sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.6" nested: @@ -914,7 +914,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" octo_image: @@ -922,7 +922,7 @@ packages: description: name: octo_image sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" package_config: @@ -930,7 +930,7 @@ packages: description: name: package_config sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" package_info_plus: @@ -938,7 +938,7 @@ packages: description: name: package_info_plus sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.0.0" package_info_plus_platform_interface: @@ -946,7 +946,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" path: @@ -954,7 +954,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.1" path_drawing: @@ -962,7 +962,7 @@ packages: description: name: path_drawing sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" path_parsing: @@ -970,7 +970,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" path_provider: @@ -978,7 +978,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" path_provider_android: @@ -986,7 +986,7 @@ packages: description: name: path_provider_android sha256: e122c5ea805bb6773bb12ce667611265980940145be920cd09a4b0ec0285cb16 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.20" path_provider_foundation: @@ -994,7 +994,7 @@ packages: description: name: path_provider_foundation sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" path_provider_linux: @@ -1002,7 +1002,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -1010,7 +1010,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -1018,7 +1018,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" permission_handler: @@ -1026,7 +1026,7 @@ packages: description: name: permission_handler sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "12.0.1" permission_handler_android: @@ -1034,7 +1034,7 @@ packages: description: name: permission_handler_android sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "13.0.1" permission_handler_apple: @@ -1042,7 +1042,7 @@ packages: description: name: permission_handler_apple sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.4.7" permission_handler_html: @@ -1050,7 +1050,7 @@ packages: description: name: permission_handler_html sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.3+5" permission_handler_platform_interface: @@ -1058,7 +1058,7 @@ packages: description: name: permission_handler_platform_interface sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" permission_handler_windows: @@ -1066,7 +1066,7 @@ packages: description: name: permission_handler_windows sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.1" petitparser: @@ -1074,7 +1074,7 @@ packages: description: name: petitparser sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" photo_manager: @@ -1082,7 +1082,7 @@ packages: description: name: photo_manager sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.7.1" photo_manager_image_provider: @@ -1090,7 +1090,7 @@ packages: description: name: photo_manager_image_provider sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" platform: @@ -1098,7 +1098,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -1106,7 +1106,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" pool: @@ -1114,7 +1114,7 @@ packages: description: name: pool sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.2" posix: @@ -1122,7 +1122,7 @@ packages: description: name: posix sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.3" protobuf: @@ -1130,7 +1130,7 @@ packages: description: name: protobuf sha256: "2fcc8a202ca7ec17dab7c97d6b6d91cf03aa07fe6f65f8afbb6dfa52cc5bd902" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.0" provider: @@ -1138,7 +1138,7 @@ packages: description: name: provider sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.5+1" pub_semver: @@ -1146,7 +1146,7 @@ packages: description: name: pub_semver sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" pubspec_parse: @@ -1154,7 +1154,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" rational: @@ -1162,7 +1162,7 @@ packages: description: name: rational sha256: cb808fb6f1a839e6fc5f7d8cb3b0a10e1db48b3be102de73938c627f0b636336 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.3" record: @@ -1170,7 +1170,7 @@ packages: description: name: record sha256: "6bad72fb3ea6708d724cf8b6c97c4e236cf9f43a52259b654efeb6fd9b737f1f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.2" record_android: @@ -1178,7 +1178,7 @@ packages: description: name: record_android sha256: fb54ee4e28f6829b8c580252a9ef49d9c549cfd263b0660ad7eeac0908658e9f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.4" record_ios: @@ -1186,7 +1186,7 @@ packages: description: name: record_ios sha256: "765b42ac1be019b1674ddd809b811fc721fe5a93f7bb1da7803f0d16772fd6d7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.4" record_linux: @@ -1194,7 +1194,7 @@ packages: description: name: record_linux sha256: "235b1f1fb84e810f8149cc0c2c731d7d697f8d1c333b32cb820c449bf7bb72d8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" record_macos: @@ -1202,7 +1202,7 @@ packages: description: name: record_macos sha256: "842ea4b7e95f4dd237aacffc686d1b0ff4277e3e5357865f8d28cd28bc18ed95" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" record_platform_interface: @@ -1210,7 +1210,7 @@ packages: description: name: record_platform_interface sha256: b0065fdf1ec28f5a634d676724d388a77e43ce7646fb049949f58c69f3fcb4ed - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" record_web: @@ -1218,7 +1218,7 @@ packages: description: name: record_web sha256: "20ac10d56514cb9f8cecc8f3579383084fdfb43b0d04e05a95244d0d76091d90" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" record_windows: @@ -1226,7 +1226,7 @@ packages: description: name: record_windows sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.7" retrofit: @@ -1234,7 +1234,7 @@ packages: description: name: retrofit sha256: "7d78824afa6eeeaf6ac58220910ee7a97597b39e93360d4bda230b7c6df45089" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" retrofit_generator: @@ -1242,7 +1242,7 @@ packages: description: name: retrofit_generator sha256: "56df50afab95199dada9e1afbfe5ec228612d03859b250e5e4846c3ebfe50bf7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.1.4" rxdart: @@ -1250,7 +1250,7 @@ packages: description: name: rxdart sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.28.0" sensors_plus: @@ -1258,7 +1258,7 @@ packages: description: name: sensors_plus sha256: "89e2bfc3d883743539ce5774a2b93df61effde40ff958ecad78cd66b1a8b8d52" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.2" sensors_plus_platform_interface: @@ -1266,7 +1266,7 @@ packages: description: name: sensors_plus_platform_interface sha256: "58815d2f5e46c0c41c40fb39375d3f127306f7742efe3b891c0b1c87e2b5cd5d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" shared_preferences: @@ -1274,7 +1274,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.3" shared_preferences_android: @@ -1282,7 +1282,7 @@ packages: description: name: shared_preferences_android sha256: "34266009473bf71d748912da4bf62d439185226c03e01e2d9687bc65bbfcb713" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.15" shared_preferences_foundation: @@ -1290,7 +1290,7 @@ packages: description: name: shared_preferences_foundation sha256: "1c33a907142607c40a7542768ec9badfd16293bac51da3a4482623d15845f88b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.5" shared_preferences_linux: @@ -1298,7 +1298,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -1306,7 +1306,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shared_preferences_web: @@ -1314,7 +1314,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.3" shared_preferences_windows: @@ -1322,7 +1322,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" shelf: @@ -1330,7 +1330,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.2" shelf_web_socket: @@ -1338,7 +1338,7 @@ packages: description: name: shelf_web_socket sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" sky_engine: @@ -1351,7 +1351,7 @@ packages: description: name: source_gen sha256: "9098ab86015c4f1d8af6486b547b11100e73b193e1899015033cb3e14ad20243" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" source_helper: @@ -1359,7 +1359,7 @@ packages: description: name: source_helper sha256: "6a3c6cc82073a8797f8c4dc4572146114a39652851c157db37e964d9c7038723" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.8" source_span: @@ -1367,7 +1367,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.1" sp_util: @@ -1375,7 +1375,7 @@ packages: description: name: sp_util sha256: "9da43dce5de79c17a787d0626bf01538d63090ca32521200d22a232171c495dc" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" sqflite: @@ -1383,7 +1383,7 @@ packages: description: name: sqflite sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" sqflite_android: @@ -1391,7 +1391,7 @@ packages: description: name: sqflite_android sha256: ecd684501ebc2ae9a83536e8b15731642b9570dc8623e0073d227d0ee2bfea88 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2+2" sqflite_common: @@ -1399,7 +1399,7 @@ packages: description: name: sqflite_common sha256: "6ef422a4525ecc601db6c0a2233ff448c731307906e92cabc9ba292afaae16a6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.5.6" sqflite_darwin: @@ -1407,7 +1407,7 @@ packages: description: name: sqflite_darwin sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" sqflite_platform_interface: @@ -1415,7 +1415,7 @@ packages: description: name: sqflite_platform_interface sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" stack_trace: @@ -1423,7 +1423,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.1" stream_channel: @@ -1431,7 +1431,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" stream_transform: @@ -1439,7 +1439,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" string_scanner: @@ -1447,7 +1447,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.1" synchronized: @@ -1455,7 +1455,7 @@ packages: description: name: synchronized sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.4.0" tdesign_flutter: @@ -1463,7 +1463,7 @@ packages: description: name: tdesign_flutter sha256: "6c95cd746d7ff3ee5e3c9c4dd0e202f69c8c6e04cf53f29ace4da16f5cfbc7e4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.2.5" tdesign_flutter_adaptation: @@ -1471,7 +1471,7 @@ packages: description: name: tdesign_flutter_adaptation sha256: "707bbc52ec8b5872ea808500200f402007acf24c03a1cc823a3be2113c1d813a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.32.0" term_glyph: @@ -1479,7 +1479,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" test_api: @@ -1487,7 +1487,7 @@ packages: description: name: test_api sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.6" tobias: @@ -1495,7 +1495,7 @@ packages: description: name: tobias sha256: "2b5520e622c0d6f04cfb5c9619211f923c97a602e1a3a8954e113e3e0e685c41" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.3.1" typed_data: @@ -1503,7 +1503,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" universal_io: @@ -1511,7 +1511,7 @@ packages: description: name: universal_io sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.2" uuid: @@ -1519,7 +1519,7 @@ packages: description: name: uuid sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.5.2" vector_math: @@ -1527,7 +1527,7 @@ packages: description: name: vector_math sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" video_player: @@ -1535,7 +1535,7 @@ packages: description: name: video_player sha256: "096bc28ce10d131be80dfb00c223024eb0fba301315a406728ab43dd99c45bdf" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.10.1" video_player_android: @@ -1543,7 +1543,7 @@ packages: description: name: video_player_android sha256: cf768d02924b91e333e2bc1ff928528f57d686445874f383bafab12d0bdfc340 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.8.17" video_player_avfoundation: @@ -1551,7 +1551,7 @@ packages: description: name: video_player_avfoundation sha256: "03fc6d07dba2499588d30887329b399c1fe2d68ce4b7fcff0db79f44a2603f69" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.8.6" video_player_platform_interface: @@ -1559,7 +1559,7 @@ packages: description: name: video_player_platform_interface sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.6.0" video_player_web: @@ -1567,7 +1567,7 @@ packages: description: name: video_player_web sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" visibility_detector: @@ -1575,7 +1575,7 @@ packages: description: name: visibility_detector sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.4.0+2" vm_service: @@ -1583,7 +1583,7 @@ packages: description: name: vm_service sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "15.0.2" wakelock_plus: @@ -1591,7 +1591,7 @@ packages: description: name: wakelock_plus sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" wakelock_plus_platform_interface: @@ -1599,7 +1599,7 @@ packages: description: name: wakelock_plus_platform_interface sha256: "036deb14cd62f558ca3b73006d52ce049fabcdcb2eddfe0bf0fe4e8a943b5cf2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" watcher: @@ -1607,7 +1607,7 @@ packages: description: name: watcher sha256: "592ab6e2892f67760543fb712ff0177f4ec76c031f02f5b4ff8d3fc5eb9fb61a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.4" web: @@ -1615,7 +1615,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" web_socket: @@ -1623,7 +1623,7 @@ packages: description: name: web_socket sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" web_socket_channel: @@ -1631,7 +1631,7 @@ packages: description: name: web_socket_channel sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.3" wechat_assets_picker: @@ -1639,7 +1639,7 @@ packages: description: name: wechat_assets_picker sha256: c307e50394c1e6dfcd5c4701e84efb549fce71444fedcf2e671c50d809b3e2a1 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "9.8.0" wechat_camera_picker: @@ -1647,7 +1647,7 @@ packages: description: name: wechat_camera_picker sha256: "776ce32feda72d84b63425533a27d3b822bfb93cc063d2aef3cc6d788769f36b" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.4.0" wechat_picker_library: @@ -1655,7 +1655,7 @@ packages: description: name: wechat_picker_library sha256: "5cb61b9aa935b60da5b043f8446fbb9c5077419f20ccc4856bf444aec4f44bc1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.7" win32: @@ -1663,7 +1663,7 @@ packages: description: name: win32 sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.15.0" xdg_directories: @@ -1671,7 +1671,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -1679,7 +1679,7 @@ packages: description: name: xml sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.6.1" xxh3: @@ -1687,7 +1687,7 @@ packages: description: name: xxh3 sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.0" yaml: @@ -1695,7 +1695,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" sdks: