diff --git a/lib/customWidget/ItemWidgetFactory.dart b/lib/customWidget/ItemWidgetFactory.dart index 5e869b9..77a668a 100644 --- a/lib/customWidget/ItemWidgetFactory.dart +++ b/lib/customWidget/ItemWidgetFactory.dart @@ -249,10 +249,13 @@ class ListItemFactory { required String title, String yesLabel = '是', String noLabel = '否', - required bool groupValue, + required bool? groupValue, required ValueChanged onChanged, double verticalPadding = 15, double horizontalPadding = 10, + bool isEdit = true, + String text = '', + }) { return Padding( padding: EdgeInsets.only( @@ -279,33 +282,36 @@ class ListItemFactory { ), ), ), - Row( - children: [ - Row( - children: [ - Radio( - activeColor: Colors.blue, - value: true, - groupValue: groupValue, - onChanged: (val) => onChanged(val!), - ), - Text(yesLabel), - ], - ), - const SizedBox(width: 16), - Row( - children: [ - Radio( - activeColor: Colors.blue, - value: false, - groupValue: groupValue, - onChanged: (val) => onChanged(val!), - ), - Text(noLabel), - ], - ), - ], - ), + if (isEdit) + Row( + children: [ + Row( + children: [ + Radio( + activeColor: Colors.blue, + value: true, + groupValue: groupValue, + onChanged: (val) => onChanged(val!), + ), + Text(yesLabel), + ], + ), + const SizedBox(width: 16), + Row( + children: [ + Radio( + activeColor: Colors.blue, + value: false, + groupValue: groupValue, + onChanged: (val) => onChanged(val!), + ), + Text(noLabel), + ], + ), + ], + ), + if (!isEdit) + Text(text, style: TextStyle(),) ], ), ), @@ -313,8 +319,10 @@ class ListItemFactory { } /// 列表标题头(蓝色标识+文字) - static Widget createBuildSimpleSection(String title, {double horPadding = 10}) { - + static Widget createBuildSimpleSection( + String title, { + double horPadding = 10, + }) { return Container( decoration: BoxDecoration( color: Colors.white, diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart index fb854c7..0ec6b58 100644 --- a/lib/http/ApiService.dart +++ b/lib/http/ApiService.dart @@ -929,6 +929,138 @@ U6Hzm1ninpWeE+awIDAQAB ); } + ///TODO -------------–-------------------- 重点工程管理 -------------–-------------------- + static Future> getKeyProjectCount() { + return HttpManager().request( + basePath, + '/app/keyprojectcheck/keyProjectCount', + method: Method.post, + data: { + "CORPINFO_ID":SessionService.instance.corpinfoId, + "loginUserId":SessionService.instance.loginUserId, + }, + ); + } + /// 重点工程筛选列表 + static Future> getKeyProjectList(Map data, String url) { + return HttpManager().request( + basePath, + url, + method: Method.post, + data: { + "CORPINFO_ID":SessionService.instance.corpinfoId, + "UserId":SessionService.instance.loginUserId, + ...data + }, + ); + } + /// 重点工程详情 + static Future> getKeyProjectDeatail(String OUTSOURCED_ID) { + return HttpManager().request( + basePath, + '/app/keyProjects/getOutsourced', + method: Method.post, + data: { + "OUTSOURCED_ID":OUTSOURCED_ID, + + }, + ); + } + /// 工程开始结束 + static Future> sureKeyProjectState(String OUTSOURCED_ID, String State) { + return HttpManager().request( + basePath, + '/app/keyProjects/updateState', + method: Method.post, + data: { + "OUTSOURCED_ID":OUTSOURCED_ID, + 'OPERATOR' : SessionService.instance.loginUserId, + 'STATE':State + }, + ); + } + + /// 安全检查管理列表 + static Future> getSafeCheckList(Map data, String url) { + return HttpManager().request( + basePath, + url, + method: Method.post, + data: { + "CORPINFO_ID":SessionService.instance.corpinfoId, + "UserId":SessionService.instance.loginUserId, + ...data + }, + ); + } + /// 安全检查记录 + static Future> getSafeCheckReciordList(Map data, String url) { + return HttpManager().request( + basePath, + url, + method: Method.post, + data: { + "CORPINFO_ID":SessionService.instance.corpinfoId, + "UserId":SessionService.instance.loginUserId, + ...data + }, + ); + } + /// 安全检查发起 + static Future> addSafeCheckReciord(String OUTSOURCED_ID) { + return HttpManager().request( + basePath, + '/app/keyProjects/goEdit', + method: Method.post, + data: { + "OUTSOURCED_ID":OUTSOURCED_ID, + "tm":DateTime.now().millisecondsSinceEpoch.toString(), + }, + ); + } + /// 安全检查单位现场负责人列表 + static Future> getSafeCheckPersonList(String UNITS_ID, String NOMAIN) { + return HttpManager().request( + basePath, + '/app/keyProjects/listAllPersonnel', + method: Method.post, + data: { + "UNITS_ID":UNITS_ID, + 'NOMAIN':NOMAIN, + "tm":DateTime.now().millisecondsSinceEpoch.toString(), + }, + ); + } + /// 安全检查检查类型 + static Future> getSafeCheckTypeList() { + return HttpManager().request( + basePath, + '/dictionaries/listSelectTreeByTkiTree?tm=${DateTime.now().millisecondsSinceEpoch.toString()}', + method: Method.post, + data: { + "DICTIONARIES_ID":'60e6481d96e44a5390ff5c347c4d1ffe', + "tm":DateTime.now().millisecondsSinceEpoch.toString(), + }, + ); + } + /// 安全检查被检查单位 + static Future> getSafeCheckToUnitList(String OUTSOURCED_ID) { + return HttpManager().request( + basePath, + '/app/keyProjects/listAllUnits', + method: Method.post, + data: { + "CORPINFO_ID": SessionService.instance.corpinfoId, + "OUTSOURCED_ID":OUTSOURCED_ID, + }, + ); + } + + + + + + ///TODO -------------–-------------------- 我的 -------------–-------------------- /// 问题反馈 diff --git a/lib/main.dart b/lib/main.dart index 2211da6..23b1401 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -39,7 +39,7 @@ void main() async { ..indicatorSize = 36.0 // 接近系统默认大小 ..radius = 0 // 无圆角 ..progressColor = Colors.blue // 进度条颜色为系统蓝色 - ..backgroundColor = Colors.grey.shade100 + ..backgroundColor = Colors.grey.shade300 ..indicatorColor = Colors.blue // 指示器颜色为系统蓝色 ..textColor = Colors.black // 隐藏文字 ..userInteractions = false // 允许用户交互(系统指示器不阻止交互) diff --git a/lib/pages/KeyProjects/KeyProject/keyProject_detail.dart b/lib/pages/KeyProjects/KeyProject/keyProject_detail.dart new file mode 100644 index 0000000..3c97a4f --- /dev/null +++ b/lib/pages/KeyProjects/KeyProject/keyProject_detail.dart @@ -0,0 +1,212 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + +class KeyprojectDetail extends StatefulWidget { + const KeyprojectDetail({super.key, required this.OUTSOURCED_ID}); + + final String OUTSOURCED_ID; + + @override + State createState() => _KeyprojectDetailState(); +} + +class _KeyprojectDetailState extends State { + late Map info = {}; + + @override + void initState() { + // TODO: implement initState + super.initState(); + _getData(); + } + + Future _getData() async { + LoadingDialogHelper.show(); + final result = await ApiService.getKeyProjectDeatail(widget.OUTSOURCED_ID); + try { + setState(() { + info = result['pd'] ?? {}; + }); + } catch (e) { + print('加载数据失败:$e'); + ToastUtil.showNormal(context, '加载数据失败:$e'); + } + LoadingDialogHelper.hide(); + } + + Future onUpdateState(String state) async { + // 提示文案 + String content = ''; + if (state == '1') { + content = '确定同意开工吗?'; + } else if (state == '2') { + content = '确定同意结束吗?'; + } else { + content = '确定操作吗?'; + } + final bool confirmed = + await showDialog( + context: context, + builder: + (ctx) => CustomAlertDialog( + title: '提示', + content: content, + onConfirm: () => Navigator.of(ctx).pop(false), + ), + ) ?? + false; + + if (!confirmed) return; + LoadingDialogHelper.show(); + try { + final response = await ApiService.sureKeyProjectState( + widget.OUTSOURCED_ID, + state, + ); + LoadingDialogHelper.hide(); + if (response['result'] == 'success') { + Navigator.of(context).pop(); + } else { + ToastUtil.showNormal(context, '请求失败'); + } + } catch (e) { + ToastUtil.showNormal(context, '请求异常:$e'); + } + } + + Widget lineItem({ + required String label, + required bool isEditable, + String? text, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ItemListWidget.singleLineTitleText( + label: label, + isEditable: isEditable, + text: text ?? '', + ), + const Divider(height: 1, thickness: 1), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: "重点工程信息"), + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Column( + children: [ + ItemListWidget.itemContainer( + Column( + children: [ + ItemListWidget.singleLineTitleText( + label: '重点工程名称:', + isEditable: false, + text: info['OUTSOURCED_NAME'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '计划工期:', + isEditable: false, + text: + '${info['STARTTIME'] ?? ''}至${info['ENDTIME'] ?? ''}', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '合同号:', + isEditable: false, + text: info['CONTRACT_NUM'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '施工相关方:', + isEditable: false, + text: info['UNITS_NAME'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '相关方单位工程负责人:', + isEditable: false, + text: info['UNITS_PIC_NAME'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '相关方单位负责人手机:', + isEditable: false, + text: info['UNITS_PHONE'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '经度:', + isEditable: false, + text: info['WORK_LONGITUDE'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '纬度:', + isEditable: false, + text: info['WORK_LATITUDE'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '具体位置:', + isEditable: false, + text: info['LOCATION'] ?? '', + ), + ], + ), + ), + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (info['STATE'] == '-1') ...[ + SizedBox( + width: 140, + child: CustomButton( + text: '工程开始', + backgroundColor: Colors.blue, + onPressed: () => onUpdateState('1'), + ), + ), + const SizedBox(width: 12), + ], + if (info['STATE'] == '-2') ...[ + SizedBox( + width: 140, + child: CustomButton( + text: '工程结束', + backgroundColor: Colors.blue, + onPressed: () => onUpdateState('2'), + ), + ), + const SizedBox(width: 12), + ], + SizedBox( + width: 140, + child: CustomButton( + text: '返回', + backgroundColor: Colors.blue, + onPressed: () => Navigator.pop(context), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/KeyProjects/KeyProject/keyProject_list_page.dart b/lib/pages/KeyProjects/KeyProject/keyProject_list_page.dart new file mode 100644 index 0000000..4878efd --- /dev/null +++ b/lib/pages/KeyProjects/KeyProject/keyProject_list_page.dart @@ -0,0 +1,291 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/pages/KeyProjects/KeyProject/keyProject_detail.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; + +class KeyprojectListPage extends StatefulWidget { + final String flow; + + const KeyprojectListPage({Key? key, required this.flow}) : super(key: key); + + @override + _KeyprojectListPageState createState() => _KeyprojectListPageState(); +} + +class _KeyprojectListPageState extends State { + // Data and state variables + List list = []; + int currentPage = 1; + int rows = 10; + int totalPage = 1; + bool isLoading = false; + final TextEditingController _searchController = TextEditingController(); + + List> stepList = []; + int sindex = 0; + String searchKeywords = ''; + + final GlobalKey _scaffoldKey = GlobalKey(); + + final ScrollController _scrollController = ScrollController(); + + @override + void initState() { + super.initState(); + _fetchData(); + _scrollController.addListener(_onScroll); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + void _onScroll() { + if (_scrollController.position.pixels >= + _scrollController.position.maxScrollExtent && + !isLoading) { + if (currentPage < totalPage) { + currentPage++; + _fetchData(); + } + } + } + + Future _fetchData() async { + if (isLoading) return; + setState(() => isLoading = true); + + try { + final data = {'KEYWORDS': searchKeywords}; + final url = + '/app/keyProjects/outSouceslistPage?showCount=10¤tPage=$currentPage'; + final response = await ApiService.getKeyProjectList(data, url); + + setState(() { + if (currentPage == 1) { + list = response['varList']; + } else { + list.addAll(response['varList']); + } + Map page = response['page']; + totalPage = page['totalPage'] ?? 1; + isLoading = false; + }); + } catch (e) { + print('Error fetching data: $e'); + setState(() => isLoading = false); + } + } + + void _search() { + searchKeywords = _searchController.text.trim(); + currentPage = 1; + list.clear(); + _fetchData(); + } + + void _goToDetail(Map item) async { + pushPage(KeyprojectDetail(OUTSOURCED_ID: item['OUTSOURCED_ID']), context); + } + + Widget _buildListItem(Map item) { + bool showBadge = + (item['STATE'] == '-1' || item['STATE'] == '-2') && + (item['CREATOR'] != null && + item['CREATOR'].toString() == SessionService.instance.loginUserId); + + return Card( + color: Colors.white, + margin: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () => _goToDetail(item), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + 红点 + Row( + children: [ + Expanded( + child: Text( + "${item['OUTSOURCED_NAME'] ?? ''}", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + if (showBadge) + Container( + margin: const EdgeInsets.only(left: 8.0), + padding: const EdgeInsets.symmetric( + horizontal: 8.0, + vertical: 2.0, + ), + height: 18, + alignment: Alignment.center, + decoration: BoxDecoration( + color: const Color(0xFFdd514c), + borderRadius: BorderRadius.circular(96), + ), + child: const Text( + '1', + style: TextStyle(color: Colors.white, fontSize: 10), + ), + ), + ], + ), + const SizedBox(height: 8), + + // 根据 IS_CORP_TYPE 显示不同的主管/监管信息(对应 vue 逻辑) + if (item['IS_CORP_TYPE'] == '1') ...[ + Text("主管部门:${item['Q_COMPETENT_DEPT_NAME'] ?? ''}"), + const SizedBox(height: 6), + Text("监督部门:${item['DEPARTMENT_NAME'] ?? ''}"), + ] else if (item['IS_CORP_TYPE'] == '0') ...[ + Text("主管部门:${item['MANAGER_DEPARTMENT_NAME'] ?? ''}"), + const SizedBox(height: 6), + Text("监管部门:${item['DEPARTMENT_NAME'] ?? ''}"), + ], + const SizedBox(height: 8), + + // 相关方单位负责人 + 电话(两列) + Row( + children: [ + Expanded( + child: Text( + "相关方单位负责人:${item['UNITS_PIC_NAME'] ?? ''}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + "电话:${item['UNITS_PHONE'] ?? ''}", + textAlign: TextAlign.right, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 8), + + // 定位坐标(可点击,调用回调) + Text( + "定位坐标:${(item['WORK_LONGITUDE'] != null && item['WORK_LATITUDE'] != null && item['WORK_LONGITUDE'].toString().isNotEmpty) ? '${item['WORK_LONGITUDE']}*${item['WORK_LATITUDE']}' : ''}", + ), + const SizedBox(height: 6), + + // 状态(可点击,调用同一回调以和 vue 行为一致) + InkWell( + onTap: () {}, + child: Text( + "状态:${item['STATE'] == '-1' + ? '开工申请中' + : item['STATE'] == '-2' + ? '结束申请中' + : item['STATE'] == '0' + ? '未开工' + : item['STATE'] == '1' + ? '进行中' + : '已结束'}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + CustomButton( + onPressed: () { _goToDetail(item);}, + text: '查看', + height: 30, + padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15), + textStyle: TextStyle(fontSize: 13, color: Colors.white), + backgroundColor: Colors.blue, + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _buildListContent() { + if (isLoading && list.isEmpty) { + // 初始加载时显示居中的加载指示器 + return Center(child: CircularProgressIndicator()); + } else if (list.isEmpty) { + // 没有数据 + return NoDataWidget.show(); + } else { + // 有数据或加载更多 + return ListView.builder( + padding: EdgeInsets.zero, + + controller: _scrollController, + itemCount: list.length + (isLoading ? 1 : 0), + itemBuilder: (context, index) { + if (index >= list.length) { + // 加载更多时在列表底部显示加载指示器 + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Center(child: CircularProgressIndicator()), + ); + } + return _buildListItem(list[index]); + }, + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + appBar: MyAppbar(title: widget.flow), + + body: Column( + children: [ + // Filter bar + Container( + color: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: Row( + children: [ + Expanded( + flex: 2, + child: SearchBarWidget( + showResetButton: false, + hintText: "请输入关键字", + // isClickableOnly: true, + onSearch: (text) { + _search(); + }, + controller: _searchController, + ), + ), + ], + ), + ), + const Divider(height: 1), + // List + Expanded(child: _buildListContent()), + ], + ), + ); + } +} diff --git a/lib/pages/KeyProjects/SafeCheck/check_list_page.dart b/lib/pages/KeyProjects/SafeCheck/check_list_page.dart new file mode 100644 index 0000000..ffa289f --- /dev/null +++ b/lib/pages/KeyProjects/SafeCheck/check_list_page.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/pages/KeyProjects/KeyProject/keyProject_detail.dart'; +import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/safeCheck_detail.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; + +class CheckListPage extends StatefulWidget { + const CheckListPage({super.key, required this.OUTSOURCED_ID}); + + final String OUTSOURCED_ID; + @override + _CheckListPageState createState() => _CheckListPageState(); +} + +class _CheckListPageState extends State { + // Data and state variables + List list = []; + int currentPage = 1; + int rows = 10; + int totalPage = 1; + bool isLoading = false; + final TextEditingController _searchController = TextEditingController(); + + List> stepList = []; + int sindex = 0; + String searchKeywords = ''; + + final GlobalKey _scaffoldKey = GlobalKey(); + + final ScrollController _scrollController = ScrollController(); + + @override + void initState() { + super.initState(); + _fetchData(); + _scrollController.addListener(_onScroll); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + void _onScroll() { + if (_scrollController.position.pixels >= + _scrollController.position.maxScrollExtent && + !isLoading) { + if (currentPage < totalPage) { + currentPage++; + _fetchData(); + } + } + } + + Future _fetchData() async { + if (isLoading) return; + setState(() => isLoading = true); + + try { + final data = {'KEYWORDS': searchKeywords, 'OUTSOURCED_ID':widget.OUTSOURCED_ID}; + final url = + '/app/keyprojectcheck/list?showCount=10¤tPage=$currentPage'; + final response = await ApiService.getSafeCheckReciordList(data, url); + + setState(() { + if (currentPage == 1) { + list = response['varList']; + } else { + list.addAll(response['varList']); + } + Map page = response['page']; + totalPage = page['totalPage'] ?? 1; + isLoading = false; + }); + } catch (e) { + print('Error fetching data: $e'); + setState(() => isLoading = false); + } + } + + void _search() { + searchKeywords = _searchController.text.trim(); + currentPage = 1; + list.clear(); + _fetchData(); + } + + void _goToDetail(Map item) async { + pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: item['KEYPROJECTCHECK_ID'], isEdit: false,), context); + } + + Widget _buildListItem(Map item) { + bool showBadge = + (item['STATE'] == '-1' || item['STATE'] == '-2') && + (item['CREATOR'] != null && + item['CREATOR'].toString() == SessionService.instance.loginUserId); + + return Card( + color: Colors.white, + margin: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () => _goToDetail(item), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + 红点 + Row( + children: [ + Expanded( + child: Text( + "${item['INSPECTION_PLACE'] ?? ''}", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 8), + Text( + "检查状态:${item['INSPECTION_STATUS']}", + ), + Text( + "检查类型:${item['INSPECTION_TYPE_NAME']}", + ), + Text( + "检查人:${item['INSPECTION_USERS']}", + ), + Text( + "被检查人:${item['PERSON_NAME']}", + ), + Text( + "检查时间:${item['INSPECTION_TIME_START']}-${item['INSPECTION_TIME_END']}", + ), + Text( + "检查隐患数:${item['HIDDEN_COUNT']}", + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + CustomButton( + onPressed: () { _goToDetail(item);}, + text: '查看', + height: 30, + padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15), + textStyle: TextStyle(fontSize: 13, color: Colors.white), + backgroundColor: Colors.blue, + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _buildListContent() { + if (isLoading && list.isEmpty) { + // 初始加载时显示居中的加载指示器 + return Center(child: CircularProgressIndicator()); + } else if (list.isEmpty) { + // 没有数据 + return NoDataWidget.show(); + } else { + // 有数据或加载更多 + return ListView.builder( + padding: EdgeInsets.zero, + + controller: _scrollController, + itemCount: list.length + (isLoading ? 1 : 0), + itemBuilder: (context, index) { + if (index >= list.length) { + // 加载更多时在列表底部显示加载指示器 + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Center(child: CircularProgressIndicator()), + ); + } + return _buildListItem(list[index]); + }, + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + appBar: MyAppbar(title: '安全检查记录', actions: [ + TextButton(onPressed: () { + pushPage(SafecheckDetail(OUTSOURCED_ID: widget.OUTSOURCED_ID,KEYPROJECTCHECK_ID: '', isEdit: true,), context); + }, child: Text('发起', style: TextStyle(color: Colors.white, fontSize: 16),)) + ],), + + body: Column( + children: [ + // Filter bar + Container( + color: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: Row( + children: [ + Expanded( + flex: 2, + child: SearchBarWidget( + showResetButton: false, + hintText: "请输入关键字", + // isClickableOnly: true, + onSearch: (text) { + _search(); + }, + controller: _searchController, + ), + ), + ], + ), + ), + const Divider(height: 1), + // List + Expanded(child: _buildListContent()), + ], + ), + ); + } +} diff --git a/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart b/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart new file mode 100644 index 0000000..f069e7f --- /dev/null +++ b/lib/pages/KeyProjects/SafeCheck/safeCheck_detail.dart @@ -0,0 +1,246 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/bottom_picker.dart'; +import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + +class SafecheckDetail extends StatefulWidget { + const SafecheckDetail({ + super.key, + required this.OUTSOURCED_ID, + required this.KEYPROJECTCHECK_ID, + required this.isEdit, + }); + + final String OUTSOURCED_ID; + final String KEYPROJECTCHECK_ID; + final bool isEdit; + + @override + State createState() => _SafecheckDetailState(); +} + +class _SafecheckDetailState extends State { + late Map info = {}; + /// 被检查单位负责人 + late List personList = []; + /// 检查类型 + late List typeList = []; + /// 被检查单位 + late List toCheckUnitList = []; + + bool? chooseTitleType = null; + + final TextEditingController _unitController = TextEditingController(); + final TextEditingController _locationController = TextEditingController(); + + final TextEditingController _personController = TextEditingController(); + + @override + void initState() { + // TODO: implement initState + super.initState(); + _getData(); + } + + Future _getData() async { + LoadingDialogHelper.show(); + final result = await ApiService.addSafeCheckReciord(widget.OUTSOURCED_ID); + final personData = await ApiService.getSafeCheckPersonList(info['UNITS_ID']??'', '1'); + final typeListData = await ApiService.getSafeCheckTypeList(); + final toUnitListData = await ApiService.getSafeCheckToUnitList(widget.OUTSOURCED_ID); + try { + setState(() { + info = result['pd'] ?? {}; + personList = personData['varList']; + typeList = jsonDecode(typeListData['zTreeNodes']); + toCheckUnitList = toUnitListData['varList']; + if (!FormUtils.hasValue(info, 'UNITS_NAME') && toCheckUnitList.isNotEmpty) { + info['UNITS_NAME'] = toCheckUnitList.first['UNITS_NAME']; + } + if (!FormUtils.hasValue(info, 'UNITS_ID') && toCheckUnitList.isNotEmpty) { + info['UNITS_ID'] = toCheckUnitList.first['UNITS_ID']; + } + + }); + } catch (e) { + print('加载数据失败:$e'); + ToastUtil.showNormal(context, '加载数据失败:$e'); + } + + + LoadingDialogHelper.hide(); + } + + Future onUpdateState(String state) async { + // 提示文案 + String content = ''; + if (state == '1') { + content = '确定同意开工吗?'; + } else if (state == '2') { + content = '确定同意结束吗?'; + } else { + content = '确定操作吗?'; + } + final bool confirmed = + await showDialog( + context: context, + builder: + (ctx) => CustomAlertDialog( + title: '提示', + content: content, + onConfirm: () => Navigator.of(ctx).pop(false), + ), + ) ?? + false; + + if (!confirmed) return; + LoadingDialogHelper.show(); + try { + final response = await ApiService.sureKeyProjectState( + widget.OUTSOURCED_ID, + state, + ); + LoadingDialogHelper.hide(); + if (response['result'] == 'success') { + Navigator.of(context).pop(); + } else { + ToastUtil.showNormal(context, '请求失败'); + } + } catch (e) { + ToastUtil.showNormal(context, '请求异常:$e'); + } + } + + Widget lineItem({ + required String label, + required bool isEditable, + String? text, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ItemListWidget.singleLineTitleText( + label: label, + isEditable: isEditable, + text: text ?? '', + ), + const Divider(height: 1, thickness: 1), + ], + ); + } + Future _choosePerson() async { + final choice = await BottomPicker.show( + context, + items: personList.map((val) => val['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + // 用户点击确定并选择了 choice + setState(() { + info['PERSON_NAME'] = choice; + FocusHelper.clearFocus(context); + }); + } + } + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: "安全检查发起"), + body: SafeArea( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 12, vertical: 12), + child: Column( + children: [ + ItemListWidget.itemContainer( + horizontal: 0, + Column( + children: [ + ListItemFactory.createYesNoSection( + title: '检查题目:', + groupValue: chooseTitleType, + yesLabel: '安全', + noLabel: '综合', + horizontalPadding: 5, + verticalPadding: 0, + onChanged: (val) { + setState(() { + chooseTitleType = val; + }); + }, + isEdit: true, + text: info['INSPECTION_CATEGORY'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '被检查单位:', + isEditable: false, + text: info['UNITS_NAME'], + controller: _unitController, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '被检查单位现场负责人:', + isEditable: widget.isEdit, + onTap: () { + _choosePerson(); + }, + text: info['PERSON_NAME'] ?? '', + ), + const Divider(), + + ItemListWidget.singleLineTitleText( + label: '检查场所:', + isEditable: widget.isEdit, + text: info['INSPECTION_PLACE'], + hintText: '请输入检查场所', + controller: _locationController, + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '检查类型:', + isEditable: widget.isEdit, + text: info['INSPECTION_TYPE_NAME'] ?? '', + ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '检查开始时间:', + isEditable: widget.isEdit, + text: info['INSPECTION_TIME_START'] ?? '', + ), + ], + ), + ), + SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 200, + child: CustomButton( + text: '提交', + textStyle: TextStyle(color: Colors.white, fontSize: 17), + backgroundColor: Colors.blue, + onPressed: () => Navigator.pop(context), + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/KeyProjects/SafeCheck/safeCheck_list_page.dart b/lib/pages/KeyProjects/SafeCheck/safeCheck_list_page.dart new file mode 100644 index 0000000..bfcdd40 --- /dev/null +++ b/lib/pages/KeyProjects/SafeCheck/safeCheck_list_page.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/pages/KeyProjects/KeyProject/keyProject_detail.dart'; +import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/check_list_page.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/search_bar_widget.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; + +class SafecheckListPage extends StatefulWidget { + final String flow; + + const SafecheckListPage({Key? key, required this.flow}) : super(key: key); + + @override + _SafecheckListPageState createState() => _SafecheckListPageState(); +} + +class _SafecheckListPageState extends State { + // Data and state variables + List list = []; + int currentPage = 1; + int rows = 10; + int totalPage = 1; + bool isLoading = false; + final TextEditingController _searchController = TextEditingController(); + + List> stepList = []; + int sindex = 0; + String searchKeywords = ''; + + final GlobalKey _scaffoldKey = GlobalKey(); + + final ScrollController _scrollController = ScrollController(); + + @override + void initState() { + super.initState(); + _fetchData(); + _scrollController.addListener(_onScroll); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + void _onScroll() { + if (_scrollController.position.pixels >= + _scrollController.position.maxScrollExtent && + !isLoading) { + if (currentPage < totalPage) { + currentPage++; + _fetchData(); + } + } + } + + Future _fetchData() async { + if (isLoading) return; + setState(() => isLoading = true); + + try { + final data = {'KEYWORDS': searchKeywords}; + final url = + '/app/keyProjects/listOutsourced?showCount=10¤tPage=$currentPage'; + final response = await ApiService.getKeyProjectList(data, url); + + setState(() { + if (currentPage == 1) { + list = response['varList']; + } else { + list.addAll(response['varList']); + } + Map page = response['page']; + totalPage = page['totalPage'] ?? 1; + isLoading = false; + }); + } catch (e) { + print('Error fetching data: $e'); + setState(() => isLoading = false); + } + } + + void _search() { + searchKeywords = _searchController.text.trim(); + currentPage = 1; + list.clear(); + _fetchData(); + } + + void _goToDetail(Map item) async { + pushPage(CheckListPage(OUTSOURCED_ID: item['OUTSOURCED_ID']), context); + } + + Widget _buildListItem(Map item) { + bool showBadge = + (item['STATE'] == '-1' || item['STATE'] == '-2') && + (item['CREATOR'] != null && + item['CREATOR'].toString() == SessionService.instance.loginUserId); + + return Card( + color: Colors.white, + margin: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () => _goToDetail(item), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 标题 + 红点 + Row( + children: [ + Expanded( + child: Text( + "${item['OUTSOURCED_NAME'] ?? ''}", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 8), + + // 根据 IS_CORP_TYPE 显示不同的主管/监管信息(对应 vue 逻辑) + if (item['IS_CORP_TYPE'] == '1') ...[ + Text("主管部门:${item['Q_COMPETENT_DEPT_NAME'] ?? ''}"), + const SizedBox(height: 6), + Text("监督部门:${item['DEPARTMENT_NAME'] ?? ''}"), + ] else if (item['IS_CORP_TYPE'] == '0') ...[ + Text("主管部门:${item['MANAGER_DEPARTMENT_NAME'] ?? ''}"), + const SizedBox(height: 6), + Text("监管部门:${item['DEPARTMENT_NAME'] ?? ''}"), + ], + const SizedBox(height: 8), + + // 相关方单位负责人 + 电话(两列) + Row( + children: [ + Expanded( + child: Text( + "相关方单位负责人:${item['UNITS_PIC_NAME'] ?? ''}", + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + "电话:${item['UNITS_PHONE'] ?? ''}", + textAlign: TextAlign.right, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 8), + + // 定位坐标(可点击,调用回调) + Text( + "安全检查次数:${item['CHECK_COUNT']}", + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + CustomButton( + onPressed: () { _goToDetail(item);}, + text: '进入', + height: 30, + padding: EdgeInsets.symmetric(vertical: 5, horizontal: 15), + textStyle: TextStyle(fontSize: 13, color: Colors.white), + backgroundColor: Colors.blue, + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _buildListContent() { + if (isLoading && list.isEmpty) { + // 初始加载时显示居中的加载指示器 + return Center(child: CircularProgressIndicator()); + } else if (list.isEmpty) { + // 没有数据 + return NoDataWidget.show(); + } else { + // 有数据或加载更多 + return ListView.builder( + padding: EdgeInsets.zero, + + controller: _scrollController, + itemCount: list.length + (isLoading ? 1 : 0), + itemBuilder: (context, index) { + if (index >= list.length) { + // 加载更多时在列表底部显示加载指示器 + return Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: Center(child: CircularProgressIndicator()), + ); + } + return _buildListItem(list[index]); + }, + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + appBar: MyAppbar(title: widget.flow), + + body: Column( + children: [ + // Filter bar + Container( + color: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), + child: Row( + children: [ + Expanded( + flex: 2, + child: SearchBarWidget( + showResetButton: false, + hintText: "请输入关键字", + // isClickableOnly: true, + onSearch: (text) { + _search(); + }, + controller: _searchController, + ), + ), + ], + ), + ), + const Divider(height: 1), + // List + Expanded(child: _buildListContent()), + ], + ), + ); + } +} diff --git a/lib/pages/KeyProjects/keyProjects_tab_list.dart b/lib/pages/KeyProjects/keyProjects_tab_list.dart new file mode 100644 index 0000000..6035d52 --- /dev/null +++ b/lib/pages/KeyProjects/keyProjects_tab_list.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/KeyProjects/KeyProject/keyProject_list_page.dart'; +import 'package:qhd_prevention/pages/KeyProjects/SafeCheck/safeCheck_list_page.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/work_tab_icon_grid.dart'; +import 'package:qhd_prevention/pages/my_appbar.dart'; +import 'package:qhd_prevention/tools/tools.dart'; + + +class KeyprojectsTabList extends StatefulWidget { + const KeyprojectsTabList({super.key}); + + @override + State createState() => _KeyprojectsTabListState(); +} + +class _KeyprojectsTabListState extends State { + late List> buttonInfos = [ + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "重点工程管理", + "unreadCount": '0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "安全检查管理", + "unreadCount": '0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "隐患管理", + "unreadCount":'0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "处罚管理", + "unreadCount":'0', + }, + + ]; + + @override + void initState() { + super.initState(); + _getData(); + } + Future _getData() async { + LoadingDialogHelper.show(); + final data = await ApiService.getKeyProjectCount(); + LoadingDialogHelper.hide(); + setState(() { + final eight_work_count = data['pd'] ?? {}; + buttonInfos = [ + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "重点工程管理", + "unreadCount": eight_work_count['GC_COUNT'] ?? '0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "安全检查管理", + "unreadCount": '0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "隐患管理", + "unreadCount": eight_work_count['CF_COUNT'] ?? '0', + }, + { + "icon": "assets/icon-apps/icon-yxkj-1.png", + "title": "处罚管理", + "unreadCount": eight_work_count['HIDDEN_COUNT'] ?? '0', + }, + + ]; + }); + } + void _handleItemPressed(int index) async { + // 根据索引执行不同的导航逻辑 + String title = ''; + switch (index) { + case 0: { + title = '重点工程管理'; + await pushPage(KeyprojectListPage(flow: title), context); + } break; + case 1: { + title = '安全检查管理'; + await pushPage(SafecheckListPage(flow: title), context); + + } break; + case 2: title = '隐患管理'; break; + case 3: title = '处罚管理'; break; + default: + print("按钮 $index 被点击"); + } + + _getData(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '重点工程管理'), + body: SafeArea( + child: Column( + children: [ + ListItemFactory.createBuildSimpleSection('重点工程管理'), + WorkTabIconGrid( + buttonInfos: buttonInfos, + onItemPressed: _handleItemPressed, + ), + ], + ) + ), + ); + } +} diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index c51fbb9..21f8ff3 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/pages/KeyProjects/keyProjects_tab_list.dart'; import 'package:qhd_prevention/pages/badge_manager.dart'; import 'package:qhd_prevention/pages/home/NFC/home_nfc_list_page.dart'; import 'package:qhd_prevention/pages/home/home_danger_page.dart'; @@ -320,21 +321,24 @@ class _HomePageState extends State { unreadCount: info["unreadCount"] as int, onPressed: () async { switch (idx) { - case 0: + case 0:// 人员信息 pushPage(UserinfoPage(), context); break; - case 1: + case 1:// 法律法规 pushPage(WorkSetPage(), context); break; - case 2: + case 2:// 风险布控 pushPage(RiskControlPage(), context); break; - case 3: + case 3:// 法律法规 pushPage(LawsRegulationsPage(), context); break; - case 4: + case 4:// 八项作业 await pushPage(WorkTabListPage(), context); break; + case 5: // 重点工程管理 + await pushPage(KeyprojectsTabList(), context); + break; case 7: pushPage(StudyGardenPage(), context); break; diff --git a/lib/pages/home/tap/item_list_widget.dart b/lib/pages/home/tap/item_list_widget.dart index 16fcef7..58feb2b 100644 --- a/lib/pages/home/tap/item_list_widget.dart +++ b/lib/pages/home/tap/item_list_widget.dart @@ -708,13 +708,14 @@ class ItemListWidget { ); } - static Widget itemContainer(Widget child) { + static Widget itemContainer(Widget child, {double horizontal = 12}) { + return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), ), - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + padding: EdgeInsets.symmetric(horizontal: horizontal, vertical: 8), child: child, ); } diff --git a/pubspec.lock b/pubspec.lock index faa7d17..c0a4f7a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: args sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.7.0" asn1lib: @@ -14,7 +14,7 @@ packages: description: name: asn1lib sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.6.5" async: @@ -22,7 +22,7 @@ packages: description: name: async sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.13.0" boolean_selector: @@ -30,7 +30,7 @@ packages: description: name: boolean_selector sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.2" camera: @@ -38,7 +38,7 @@ packages: description: name: camera sha256: d6ec2cbdbe2fa8f5e0d07d8c06368fe4effa985a4a5ddade9cc58a8cd849557d - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.11.2" camera_android_camerax: @@ -46,23 +46,23 @@ packages: description: name: camera_android_camerax sha256: "58b8fe843a3c83fd1273c00cb35f5a8ae507f6cc9b2029bcf7e2abba499e28d8" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.6.19+1" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: "180c1b368cf3485a18c46e219e3ad80271a779a6d66a749376e31244fd927cde" - url: "https://pub.flutter-io.cn" + sha256: e4aca5bccaf897b70cac87e5fdd789393310985202442837922fd40325e2733b + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.9.20+7" + version: "0.9.21+1" camera_platform_interface: dependency: transitive description: name: camera_platform_interface sha256: "2f757024a48696ff4814a789b0bd90f5660c0fb25f393ab4564fb483327930e2" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.10.0" camera_web: @@ -70,7 +70,7 @@ packages: description: name: camera_web sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.3.5" characters: @@ -78,7 +78,7 @@ packages: description: name: characters sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.4.0" clock: @@ -86,7 +86,7 @@ packages: description: name: clock sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.2" collection: @@ -94,7 +94,7 @@ packages: description: name: collection sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.19.1" connectivity_plus: @@ -102,7 +102,7 @@ packages: description: name: connectivity_plus sha256: "051849e2bd7c7b3bc5844ea0d096609ddc3a859890ec3a9ac4a65a2620cc1f99" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.1.4" connectivity_plus_platform_interface: @@ -110,7 +110,7 @@ packages: description: name: connectivity_plus_platform_interface sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.0.1" convert: @@ -118,7 +118,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.1.2" cross_file: @@ -126,7 +126,7 @@ packages: description: name: cross_file sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.3.4+2" crypto: @@ -134,7 +134,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.6" csslib: @@ -142,7 +142,7 @@ packages: description: name: csslib sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.2" cupertino_icons: @@ -150,7 +150,7 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.8" dbus: @@ -158,7 +158,7 @@ packages: description: name: dbus sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.7.11" dio: @@ -166,7 +166,7 @@ packages: description: name: dio sha256: d90ee57923d1828ac14e492ca49440f65477f4bb1263575900be731a3dac66a9 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.9.0" dio_web_adapter: @@ -174,7 +174,7 @@ packages: description: name: dio_web_adapter sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.1" dotted_line: @@ -182,7 +182,7 @@ packages: description: name: dotted_line sha256: "41e3d655939559815daa1370fc1e07673a205fa628cf40ce3af45d90029a77b6" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.3" encrypt: @@ -190,7 +190,7 @@ packages: description: name: encrypt sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.0.3" extended_image: @@ -198,7 +198,7 @@ packages: description: name: extended_image sha256: f6cbb1d798f51262ed1a3d93b4f1f2aa0d76128df39af18ecb77fa740f88b2e0 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "10.0.1" extended_image_library: @@ -206,7 +206,7 @@ packages: description: name: extended_image_library sha256: "1f9a24d3a00c2633891c6a7b5cab2807999eb2d5b597e5133b63f49d113811fe" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.0.1" extension: @@ -214,7 +214,7 @@ packages: description: name: extension sha256: be3a6b7f8adad2f6e2e8c63c895d19811fcf203e23466c6296267941d0ff4f24 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.6.0" fake_async: @@ -222,7 +222,7 @@ packages: description: name: fake_async sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.3.3" ffi: @@ -230,7 +230,7 @@ packages: description: name: ffi sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.4" file: @@ -238,7 +238,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "7.0.1" file_selector_linux: @@ -246,7 +246,7 @@ packages: description: name: file_selector_linux sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.9.3+2" file_selector_macos: @@ -254,7 +254,7 @@ packages: description: name: file_selector_macos sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.9.4+3" file_selector_platform_interface: @@ -262,7 +262,7 @@ packages: description: name: file_selector_platform_interface sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.6.2" file_selector_windows: @@ -270,7 +270,7 @@ packages: description: name: file_selector_windows sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.9.3+4" fixnum: @@ -278,7 +278,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.1" flutter: @@ -291,7 +291,7 @@ packages: description: name: flutter_easyloading sha256: ba21a3c883544e582f9cc455a4a0907556714e1e9cf0eababfcb600da191d17c - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.5" flutter_html: @@ -299,7 +299,7 @@ packages: description: name: flutter_html sha256: "38a2fd702ffdf3243fb7441ab58aa1bc7e6922d95a50db76534de8260638558d" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.0" flutter_lints: @@ -307,7 +307,7 @@ packages: description: name: flutter_lints sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.0.0" flutter_new_badger: @@ -315,7 +315,7 @@ packages: description: name: flutter_new_badger sha256: d3742ace8009663db1ac6ba0377b092f479c35deb33e05514ba05cc0b0a5aaaa - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.1" flutter_plugin_android_lifecycle: @@ -323,7 +323,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: "6382ce712ff69b0f719640ce957559dde459e55ecd433c767e06d139ddf16cab" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.0.29" flutter_spinkit: @@ -331,7 +331,7 @@ packages: description: name: flutter_spinkit sha256: d2696eed13732831414595b98863260e33e8882fc069ee80ec35d4ac9ddb0472 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.2.1" flutter_test: @@ -349,7 +349,7 @@ packages: description: name: fluttertoast sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "8.2.12" geolocator: @@ -357,7 +357,7 @@ packages: description: name: geolocator sha256: f4efb8d3c4cdcad2e226af9661eb1a0dd38c71a9494b22526f9da80ab79520e5 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "10.1.1" geolocator_android: @@ -365,7 +365,7 @@ packages: description: name: geolocator_android sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.6.2" geolocator_apple: @@ -373,7 +373,7 @@ packages: description: name: geolocator_apple sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.3.13" geolocator_platform_interface: @@ -381,7 +381,7 @@ packages: description: name: geolocator_platform_interface sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.2.6" geolocator_web: @@ -389,7 +389,7 @@ packages: description: name: geolocator_web sha256: "102e7da05b48ca6bf0a5bda0010f886b171d1a08059f01bfe02addd0175ebece" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.2.1" geolocator_windows: @@ -397,7 +397,7 @@ packages: description: name: geolocator_windows sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.2.5" html: @@ -405,7 +405,7 @@ packages: description: name: html sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.15.6" http: @@ -413,7 +413,7 @@ packages: description: name: http sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.5.0" http_client_helper: @@ -421,7 +421,7 @@ packages: description: name: http_client_helper sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.0" http_parser: @@ -429,7 +429,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.1.2" image_picker: @@ -437,7 +437,7 @@ packages: description: name: image_picker sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.2" image_picker_android: @@ -445,7 +445,7 @@ packages: description: name: image_picker_android sha256: b08e9a04d0f8d91f4a6e767a745b9871bfbc585410205c311d0492de20a7ccd6 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.8.12+25" image_picker_for_web: @@ -453,7 +453,7 @@ packages: description: name: image_picker_for_web sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.6" image_picker_ios: @@ -461,7 +461,7 @@ packages: description: name: image_picker_ios sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.8.12+2" image_picker_linux: @@ -469,7 +469,7 @@ packages: description: name: image_picker_linux sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.2.1+2" image_picker_macos: @@ -477,7 +477,7 @@ packages: description: name: image_picker_macos sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.2.1+2" image_picker_platform_interface: @@ -485,7 +485,7 @@ packages: description: name: image_picker_platform_interface sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.10.1" image_picker_windows: @@ -493,7 +493,7 @@ packages: description: name: image_picker_windows sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.2.1+1" intl: @@ -501,7 +501,7 @@ packages: description: name: intl sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.20.2" js: @@ -509,7 +509,7 @@ packages: description: name: js sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.7.2" leak_tracker: @@ -517,7 +517,7 @@ packages: description: name: leak_tracker sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "10.0.9" leak_tracker_flutter_testing: @@ -525,7 +525,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.9" leak_tracker_testing: @@ -533,7 +533,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.0.1" lints: @@ -541,7 +541,7 @@ packages: description: name: lints sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.1.1" list_counter: @@ -549,7 +549,7 @@ packages: description: name: list_counter sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.2" matcher: @@ -557,7 +557,7 @@ packages: description: name: matcher sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.12.17" material_color_utilities: @@ -565,7 +565,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.11.1" meta: @@ -573,7 +573,7 @@ packages: description: name: meta sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.16.0" mime: @@ -581,7 +581,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.0.0" mobile_scanner: @@ -589,7 +589,7 @@ packages: description: name: mobile_scanner sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "7.0.1" ndef_record: @@ -597,7 +597,7 @@ packages: description: name: ndef_record sha256: "0c72dfac0d5c16fc264846d103ee5d8249cd3858261a5a537b455a24c1bd5857" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.2.1" nested: @@ -605,7 +605,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.0" nfc_manager: @@ -613,7 +613,7 @@ packages: description: name: nfc_manager sha256: "164cc0223dee528d4d05a542da921f0b3a31ca0312400701c93ebf4ce757f676" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.0.2" nfc_manager_ndef: @@ -621,7 +621,7 @@ packages: description: name: nfc_manager_ndef sha256: "676e741c42b63ab1fda5a981015cb706ab4fdb76e5d0eec6611993bb27d7e7bf" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.1" nm: @@ -629,7 +629,7 @@ packages: description: name: nm sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.5.0" package_info_plus: @@ -637,7 +637,7 @@ packages: description: name: package_info_plus sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "8.3.0" package_info_plus_platform_interface: @@ -645,7 +645,7 @@ packages: description: name: package_info_plus_platform_interface sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.0" path: @@ -653,7 +653,7 @@ packages: description: name: path sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.9.1" path_provider: @@ -661,7 +661,7 @@ packages: description: name: path_provider sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.5" path_provider_android: @@ -669,7 +669,7 @@ packages: description: name: path_provider_android sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.2.17" path_provider_foundation: @@ -677,7 +677,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.1" path_provider_linux: @@ -685,7 +685,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -693,7 +693,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.2" path_provider_windows: @@ -701,7 +701,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.3.0" pdfx: @@ -709,7 +709,7 @@ packages: description: name: pdfx sha256: "29db9b71d46bf2335e001f91693f2c3fbbf0760e4c2eb596bf4bafab211471c1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.9.2" petitparser: @@ -717,7 +717,7 @@ packages: description: name: petitparser sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.1.0" photo_manager: @@ -725,7 +725,7 @@ packages: description: name: photo_manager sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.7.1" photo_manager_image_provider: @@ -733,7 +733,7 @@ packages: description: name: photo_manager_image_provider sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.2.0" photo_view: @@ -741,7 +741,7 @@ packages: description: name: photo_view sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.15.0" platform: @@ -749,7 +749,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.1.6" plugin_platform_interface: @@ -757,7 +757,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.8" pointycastle: @@ -765,7 +765,7 @@ packages: description: name: pointycastle sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.9.1" provider: @@ -773,7 +773,7 @@ packages: description: name: provider sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.1.5" shared_preferences: @@ -781,7 +781,7 @@ packages: description: name: shared_preferences sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.5.3" shared_preferences_android: @@ -789,7 +789,7 @@ packages: description: name: shared_preferences_android sha256: "5bcf0772a761b04f8c6bf814721713de6f3e5d9d89caf8d3fe031b02a342379e" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.11" shared_preferences_foundation: @@ -797,7 +797,7 @@ packages: description: name: shared_preferences_foundation sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.5.4" shared_preferences_linux: @@ -805,7 +805,7 @@ packages: description: name: shared_preferences_linux sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.1" shared_preferences_platform_interface: @@ -813,7 +813,7 @@ packages: description: name: shared_preferences_platform_interface sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.1" shared_preferences_web: @@ -821,7 +821,7 @@ packages: description: name: shared_preferences_web sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.3" shared_preferences_windows: @@ -829,7 +829,7 @@ packages: description: name: shared_preferences_windows sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.1" simple_gesture_detector: @@ -837,7 +837,7 @@ packages: description: name: simple_gesture_detector sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.2.1" sky_engine: @@ -850,7 +850,7 @@ packages: description: name: source_span sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.10.1" sprintf: @@ -858,7 +858,7 @@ packages: description: name: sprintf sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "7.0.0" stack_trace: @@ -866,7 +866,7 @@ packages: description: name: stack_trace sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.12.1" stream_channel: @@ -874,7 +874,7 @@ packages: description: name: stream_channel sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.4" stream_transform: @@ -882,7 +882,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.1" string_scanner: @@ -890,7 +890,7 @@ packages: description: name: string_scanner sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.4.1" synchronized: @@ -898,7 +898,7 @@ packages: description: name: synchronized sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.4.0" table_calendar: @@ -906,7 +906,7 @@ packages: description: name: table_calendar sha256: "0c0c6219878b363a2d5f40c7afb159d845f253d061dc3c822aa0d5fe0f721982" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.0" term_glyph: @@ -914,7 +914,7 @@ packages: description: name: term_glyph sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.2.2" test_api: @@ -922,7 +922,7 @@ packages: description: name: test_api sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.7.4" typed_data: @@ -930,7 +930,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.4.0" universal_platform: @@ -938,7 +938,7 @@ packages: description: name: universal_platform sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.0" url_launcher: @@ -946,7 +946,7 @@ packages: description: name: url_launcher sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.3.2" url_launcher_android: @@ -954,7 +954,7 @@ packages: description: name: url_launcher_android sha256: "0aedad096a85b49df2e4725fa32118f9fa580f3b14af7a2d2221896a02cd5656" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.3.17" url_launcher_ios: @@ -962,7 +962,7 @@ packages: description: name: url_launcher_ios sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.3.3" url_launcher_linux: @@ -970,7 +970,7 @@ packages: description: name: url_launcher_linux sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.1" url_launcher_macos: @@ -978,7 +978,7 @@ packages: description: name: url_launcher_macos sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.2.2" url_launcher_platform_interface: @@ -986,7 +986,7 @@ packages: description: name: url_launcher_platform_interface sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.3.2" url_launcher_web: @@ -994,7 +994,7 @@ packages: description: name: url_launcher_web sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.1" url_launcher_windows: @@ -1002,7 +1002,7 @@ packages: description: name: url_launcher_windows sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.1.4" uuid: @@ -1010,7 +1010,7 @@ packages: description: name: uuid sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.5.1" vector_math: @@ -1018,7 +1018,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.1.4" video_player: @@ -1026,7 +1026,7 @@ packages: description: name: video_player sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.10.0" video_player_android: @@ -1034,7 +1034,7 @@ packages: description: name: video_player_android sha256: d26f8791c8f670825cc227e2cad4319d2ac02b71b2ad5c2b67786bb873ac43b1 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.8.11" video_player_avfoundation: @@ -1042,7 +1042,7 @@ packages: description: name: video_player_avfoundation sha256: f52261d11f97bf14c43e8ed5714f71d8ce4538552b8cc87f45e5d87d3c205e41 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.8.3" video_player_platform_interface: @@ -1050,7 +1050,7 @@ packages: description: name: video_player_platform_interface sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.4.0" video_player_web: @@ -1058,7 +1058,7 @@ packages: description: name: video_player_web sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.0" visibility_detector: @@ -1066,7 +1066,7 @@ packages: description: name: visibility_detector sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.4.0+2" vm_service: @@ -1074,7 +1074,7 @@ packages: description: name: vm_service sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "15.0.0" web: @@ -1082,7 +1082,7 @@ packages: description: name: web sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.1" webview_flutter: @@ -1090,7 +1090,7 @@ packages: description: name: webview_flutter sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.13.0" webview_flutter_android: @@ -1098,7 +1098,7 @@ packages: description: name: webview_flutter_android sha256: "414174cacd339046a1a6dbf93cac62422194c676fed11119ccf228b81640e887" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.9.1" webview_flutter_platform_interface: @@ -1106,7 +1106,7 @@ packages: description: name: webview_flutter_platform_interface sha256: "63d26ee3aca7256a83ccb576a50272edd7cfc80573a4305caa98985feb493ee0" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.14.0" webview_flutter_wkwebview: @@ -1114,23 +1114,23 @@ packages: description: name: webview_flutter_wkwebview sha256: fb46db8216131a3e55bcf44040ca808423539bc6732e7ed34fb6d8044e3d512f - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.23.0" wechat_assets_picker: dependency: "direct main" description: name: wechat_assets_picker - sha256: cafe3d32564ed3cacf9822f251941f7b44fe9885c17c8de4fca7e939a459e1ef - url: "https://pub.flutter-io.cn" + sha256: "8bffdf50d250e802fa6ac8a557594c9bfbb0080fc52220513aeb7a5040729fcd" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "9.5.1" + version: "9.6.0" wechat_picker_library: dependency: transitive description: name: wechat_picker_library sha256: a42e09cb85b15fc9410f6a69671371cc60aa99c4a1f7967f6593a7f665f6f47a - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.0.5" win32: @@ -1138,7 +1138,7 @@ packages: description: name: win32 sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.14.0" xdg_directories: @@ -1146,7 +1146,7 @@ packages: description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.1.0" xml: @@ -1154,7 +1154,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.5.0" sdks: