diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 5326047..1c9b601 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -24,6 +24,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + NFCReaderUsageDescription + 用于读取 NFC 标签 NSAppTransportSecurity NSAllowsArbitraryLoads @@ -31,8 +33,6 @@ NSBluetoothAlwaysUsageDescription app需要蓝牙权限连接设备 - NFCReaderUsageDescription - 用于读取 NFC 标签 NSCameraUsageDescription app需要相机权限来扫描二维码 NSContactsUsageDescription @@ -45,8 +45,10 @@ app需要发现本地网络设备 NSLocationAlwaysAndWhenInUseUsageDescription app需要后台定位以实现持续跟踪 + NSLocationAlwaysUsageDescription + 需要位置权限以提供定位服务 NSLocationWhenInUseUsageDescription - app需要定位权限来提供附近服务 + 需要位置权限以提供定位服务 NSMicrophoneUsageDescription app需要麦克风权限进行语音通话 NSMotionUsageDescription @@ -57,10 +59,6 @@ app需要访问相册以上传图片 NSUserNotificationsUsageDescription app需要发送通知提醒重要信息 - NSLocationWhenInUseUsageDescription - 需要位置权限以提供定位服务 - NSLocationAlwaysUsageDescription - 需要位置权限以提供定位服务 UIApplicationSupportsIndirectInputEvents UILaunchStoryboardName @@ -70,15 +68,11 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight diff --git a/lib/customWidget/department_picker_hidden_type.dart b/lib/customWidget/department_picker_hidden_type.dart index 2b82562..773a1bb 100644 --- a/lib/customWidget/department_picker_hidden_type.dart +++ b/lib/customWidget/department_picker_hidden_type.dart @@ -10,54 +10,48 @@ class Category { final String name; final List children; - Category({ - required this.id, - required this.name, - this.children = const [], - }); + Category({required this.id, required this.name, this.children = const []}); factory Category.fromJson(Map json) { return Category( id: json['id'] as String, name: json['name'] as String, - children: (json['nodes'] as List) - .map((e) => Category.fromJson(e as Map)) - .toList(), + children: + (json['nodes'] as List) + .map((e) => Category.fromJson(e as Map)) + .toList(), ); } } -/// 弹窗回调签名:返回选中项的 id 和 name -typedef DeptSelectHiddenTypeCallback = void Function(String id, String name); +/// 弹窗回调签名:返回完整的多级路径 JSON 对象 +typedef DeptSelectHiddenTypeCallback = + void Function(Map> result); class DepartmentPickerHiddenType extends StatefulWidget { - /// 回调,返回选中部门 id 与 name final DeptSelectHiddenTypeCallback onSelected; - const DepartmentPickerHiddenType({Key? key, required this.onSelected}) : super(key: key); + const DepartmentPickerHiddenType({Key? key, required this.onSelected}) + : super(key: key); @override - _DepartmentPickerHiddenTypeState createState() => _DepartmentPickerHiddenTypeState(); + _DepartmentPickerHiddenTypeState createState() => + _DepartmentPickerHiddenTypeState(); } -class _DepartmentPickerHiddenTypeState extends State { +class _DepartmentPickerHiddenTypeState + extends State { String selectedId = ''; - String selectedName = ''; Set expandedSet = {}; - List original = []; List filtered = []; bool loading = true; - final TextEditingController _searchController = TextEditingController(); + final Map parentMap = {}; @override void initState() { super.initState(); - // 初始均为空 - selectedId = ''; - selectedName = ''; - expandedSet = {}; _searchController.addListener(_onSearchChanged); _loadData(); } @@ -72,102 +66,146 @@ class _DepartmentPickerHiddenTypeState extends State Future _loadData() async { try { List raw; - if (SessionService.instance.departmentHiddenTypeJsonStr?.isNotEmpty ?? false) { - raw = json.decode(SessionService.instance.departmentHiddenTypeJsonStr!) as List; + // 从 SessionService 读取或通过 API 拉取 + if (SessionService.instance.departmentHiddenTypeJsonStr?.isNotEmpty ?? + false) { + raw = + json.decode(SessionService.instance.departmentHiddenTypeJsonStr!) + as List; } else { - final resultLevel = await ApiService. getHiddenLevelsListTwo(); + // ... 同前逻辑,获取 parentId 并调用 API + final resultLevel = await ApiService.getHiddenLevelsListTwo(); List levelList = resultLevel['list'] as List; - String parentId=""; - for(int i=0;i; + raw = json.decode(nodes) as List; } + + // 构建 Category 列表并生成 parentMap + final list = + raw.map((e) => Category.fromJson(e as Map)).toList(); + _buildParentMap(list); + setState(() { - original = raw.map((e) => Category.fromJson(e as Map)).toList(); - filtered = original; + original = list; + filtered = list; loading = false; }); - } catch (e) { + } catch (_) { setState(() => loading = false); } } + void _buildParentMap(List list, [Category? parent]) { + for (var cat in list) { + parentMap[cat.id] = parent; + if (cat.children.isNotEmpty) { + _buildParentMap(cat.children, cat); + } + } + } + void _onSearchChanged() { - final query = _searchController.text.toLowerCase().trim(); + final q = _searchController.text.toLowerCase().trim(); setState(() { - filtered = query.isEmpty ? original : _filterCategories(original, query); + filtered = q.isEmpty ? original : _filterCategories(original, q); }); } - List _filterCategories(List list, String query) { - List result = []; + List _filterCategories(List list, String q) { + final res = []; for (var cat in list) { - final children = _filterCategories(cat.children, query); - if (cat.name.toLowerCase().contains(query) || children.isNotEmpty) { - result.add(Category(id: cat.id, name: cat.name, children: children)); + final children = _filterCategories(cat.children, q); + if (cat.name.toLowerCase().contains(q) || children.isNotEmpty) { + res.add(Category(id: cat.id, name: cat.name, children: children)); } } - return result; + return res; + } + + Category? _findById(String id) { + Category? found; + void dfs(List list) { + for (var c in list) { + if (c.id == id) { + found = c; + return; + } + dfs(c.children); + if (found != null) return; + } + } + + dfs(original); + return found; + } + + /// 构建从根到选中节点的路径列表 + List _buildPath(String id) { + final path = []; + var cur = _findById(id); + while (cur != null) { + path.insert(0, cur); + cur = parentMap[cur.id]; + } + return path; } Widget _buildRow(Category cat, int indent) { final hasChildren = cat.children.isNotEmpty; - final isExpanded = expandedSet.contains(cat.id); - final isSelected = cat.id == selectedId; + final expanded = expandedSet.contains(cat.id); + final selected = cat.id == selectedId; return Column( children: [ InkWell( onTap: () { setState(() { if (hasChildren) { - isExpanded ? expandedSet.remove(cat.id) : expandedSet.add(cat.id); + expanded ? expandedSet.remove(cat.id) : expandedSet.add(cat.id); } selectedId = cat.id; - selectedName = cat.name; }); }, child: Container( color: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 12), child: Row( children: [ SizedBox(width: 16.0 * indent), - SizedBox( - width: 24, - child: hasChildren - ? Icon(isExpanded ? Icons.arrow_drop_down_rounded : Icons.arrow_right_rounded, - size: 35, color: Colors.grey[600]) - : const SizedBox.shrink(), - ), - const SizedBox(width: 5), - Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(vertical: 12), - child: Text(cat.name), - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: Icon( - isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: Colors.green, - ), + if (hasChildren) + Icon( + expanded + ? Icons.arrow_drop_down_rounded + : Icons.arrow_right_rounded, + size: 24, + color: Colors.grey[600], + ) + else + const SizedBox(width: 24), + const SizedBox(width: 8), + Expanded(child: Text(cat.name)), + Icon( + selected + ? Icons.radio_button_checked + : Icons.radio_button_unchecked, + color: Colors.green, ), + const SizedBox(width: 16), ], ), ), ), - if (hasChildren && isExpanded) + if (hasChildren && expanded) ...cat.children.map((c) => _buildRow(c, indent + 1)), ], ); @@ -176,52 +214,55 @@ class _DepartmentPickerHiddenTypeState extends State @override Widget build(BuildContext context) { return Container( - width: MediaQuery.of(context).size.width, + width: double.infinity, height: MediaQuery.of(context).size.height * 0.7, color: Colors.white, child: Column( children: [ - Container( - color: Colors.white, + // 顶部操作栏 + Padding( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Row( children: [ GestureDetector( onTap: () => Navigator.of(context).pop(), - child: const Text('取消', style: TextStyle(fontSize: 16)), + child: const Text('取消'), ), + const SizedBox(width: 16), Expanded( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), - child: SearchBarWidget( - controller: _searchController, - isShowSearchButton: false, - onSearch: (keyboard) { - }, - ), + child: SearchBarWidget( + controller: _searchController, + isShowSearchButton: false, + onSearch: (_) {}, ), ), + const SizedBox(width: 16), GestureDetector( onTap: () { + final pathCats = _buildPath(selectedId); + final ids = pathCats.map((e) => e.id).toList(); + final names = pathCats.map((e) => e.name).toList(); + widget.onSelected({'id': ids, 'name': names}); Navigator.of(context).pop(); - widget.onSelected(selectedId, selectedName); }, - child: const Text('确定', style: TextStyle(fontSize: 16, color: Colors.green)), + child: const Text( + '确定', + style: TextStyle(color: Colors.green), + ), ), ], ), ), - Divider(), + const Divider(height: 1), + // 列表区 Expanded( - child: loading - ? const Center(child: CircularProgressIndicator()) - : Container( - color: Colors.white, - child: ListView.builder( - itemCount: filtered.length, - itemBuilder: (ctx, idx) => _buildRow(filtered[idx], 0), - ), - ), + child: + loading + ? const Center(child: CircularProgressIndicator()) + : ListView.builder( + itemCount: filtered.length, + itemBuilder: (_, idx) => _buildRow(filtered[idx], 0), + ), ), ], ), diff --git a/lib/customWidget/picker/CupertinoDatePicker.dart b/lib/customWidget/picker/CupertinoDatePicker.dart index c7ce1dc..53e7dad 100644 --- a/lib/customWidget/picker/CupertinoDatePicker.dart +++ b/lib/customWidget/picker/CupertinoDatePicker.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; /// print('用户选择的时间:$picked'); /// } class BottomDateTimePicker { - static Future show(BuildContext context) { + static Future showDate(BuildContext context) { return showModalBottomSheet( context: context, backgroundColor: Colors.white, diff --git a/lib/customWidget/single_image_viewer.dart b/lib/customWidget/single_image_viewer.dart index d123767..649840c 100644 --- a/lib/customWidget/single_image_viewer.dart +++ b/lib/customWidget/single_image_viewer.dart @@ -9,7 +9,7 @@ class SingleImageViewer extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - backgroundColor: Colors.black.withValues(alpha: 0.7), + backgroundColor: Colors.black.withValues(alpha: 0.5), appBar: MyAppbar( isBack: false, actions: [ @@ -17,12 +17,12 @@ class SingleImageViewer extends StatelessWidget { Navigator.of(context).pop(); }, icon: Icon(Icons.close, color: Colors.white, size: 40,),) ], - backgroundColor: Colors.black.withValues(alpha:0.7), title: '', + backgroundColor: Colors.black.withValues(alpha:0.5), title: '', ), body: Center( child: PhotoView( imageProvider: NetworkImage(imageUrl), - backgroundDecoration: BoxDecoration(color: Colors.black.withValues(alpha:00.5)), + backgroundDecoration: BoxDecoration(color: Colors.black.withValues(alpha:0.5)), minScale: PhotoViewComputedScale.contained, maxScale: PhotoViewComputedScale.covered * 2, onTapUp: (context, details, controllerValue) { diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart index 1b8d4b3..6e4930a 100644 --- a/lib/http/ApiService.dart +++ b/lib/http/ApiService.dart @@ -657,14 +657,13 @@ U6Hzm1ninpWeE+awIDAQAB ); } /// 气体分析详情列表删除 - static Future> hotworkGasDelete(String hotworkId) { + static Future> hotworkGasDelete(String hotworkGasId) { return HttpManager().request( basePath, '/app/hotwork/gas/delete', method: Method.post, data: { - "HOTWORK_ID":hotworkId, - "tm": DateTime.now().millisecondsSinceEpoch, + "HOTWORKGAS_ID":hotworkGasId, "CORPINFO_ID":SessionService.instance.corpinfoId, "USER_ID":SessionService.instance.loginUserId, }, @@ -692,6 +691,21 @@ U6Hzm1ninpWeE+awIDAQAB }, ); } + /// 所有安全防护措施 + static Future> listSignFinishAllMeasures(String hotworkId) { + final String tm = DateTime.now().millisecondsSinceEpoch.toString(); + return HttpManager().request( + basePath, + '/app/hotwork/listAllMeasuresForSign?tm=$tm', + method: Method.post, + data: { + "CORPINFO_ID":SessionService.instance.corpinfoId, + "CONFIRM_ID":SessionService.instance.loginUserId, + "HOTWORK_ID":hotworkId, + }, + ); + } + /// 关联的特殊作业列表 static Future> getEightWorkStartList(Map data) { return HttpManager().request( diff --git a/lib/pages/app/Danger_paicha/quick_report_page.dart b/lib/pages/app/Danger_paicha/quick_report_page.dart index f080671..a129c37 100644 --- a/lib/pages/app/Danger_paicha/quick_report_page.dart +++ b/lib/pages/app/Danger_paicha/quick_report_page.dart @@ -1,3 +1,4 @@ +import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -180,11 +181,9 @@ class _QuickReportPageState extends State { backgroundColor: Colors.transparent, builder: (ctx) => DepartmentPickerHiddenType( - onSelected: (id, name) async { - setState(() { - yinHuanId = id; - yinHuanName = name; - }); + onSelected: (json) { + print(jsonEncode(json)); + }, ), ); diff --git a/lib/pages/app/hidden_record_detail_page.dart b/lib/pages/app/hidden_record_detail_page.dart index de92d72..847a382 100644 --- a/lib/pages/app/hidden_record_detail_page.dart +++ b/lib/pages/app/hidden_record_detail_page.dart @@ -209,7 +209,7 @@ class _HiddenRecordDetailPageState extends State { text: "隐患照片", imageUrls: files, onImageTapped: (index) { - present( + presentOpaque( SingleImageViewer(imageUrl:ApiService.baseImgPath + files[index]), context, ); @@ -264,7 +264,7 @@ class _HiddenRecordDetailPageState extends State { text: "整改后图片", imageUrls: files2, onImageTapped: (index) { - present( + presentOpaque( SingleImageViewer(imageUrl: ApiService.baseImgPath +files2[index]), context, ); diff --git a/lib/pages/app/pending_rectification_detail_page.dart b/lib/pages/app/pending_rectification_detail_page.dart index af233ee..50684cb 100644 --- a/lib/pages/app/pending_rectification_detail_page.dart +++ b/lib/pages/app/pending_rectification_detail_page.dart @@ -243,7 +243,7 @@ class _PendingRectificationDetailPageState extends State createState() => _HotworkGasListState(); -} - -class _HotworkGasListState extends State { - List list = []; - bool isLoading = true; - Future _getListData() async { - final data = await ApiService.hotworkGasList(widget.HOTWORK_ID); - setState(() { - list = data['varList'] ?? []; - isLoading = false; - }); - } - - void _deleteItem(String id) async { - showDialog( - context: context, - builder: - (_) => CustomAlertDialog( - title: '温馨提示', - content: '确定要删除这条记录?', - cancelText: '取消', - onCancel: () {}, - onConfirm: () async { - final result = await ApiService.hotworkGasDelete(id); - if (result['result']) { - ToastUtil.showNormal(context, '删除成功'); - _getListData(); - } - }, - ), - ); - - } - - - Widget _buildListItem(Map item) { - final images = (item['SIGN_PATH'] as String?)?.split(',') ?? []; - final baseImgPath = ApiService.baseImgPath; - - return Container( - color: Colors.white, - margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 5), - - child: Padding( - padding: const EdgeInsets.all(12), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('分析时间: ${item['ANALYZE_TIME'] ?? ''}'), - Text('代表性气体: ${item['ANALYZE_GAS'] ?? ''}'), - ], - ), - const SizedBox(height: 6), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text('分析数据: ${item['ANALYZE_RESULT'] ?? ''}'), - if ((item['ANALYZE_PLACE'] ?? '').toString().isNotEmpty) - Text('分析地点: ${item['ANALYZE_PLACE']}'), - ], - ), - const SizedBox(height: 6), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - const Text('分析人:'), - const SizedBox(width: 8), - Expanded( - child: Wrap( - spacing: 8, - runSpacing: 4, - children: List.generate(images.length, (i) { - final img = baseImgPath + images[i]; - return GestureDetector( - onTap: () { - present( - SingleImageViewer(imageUrl: img), - context, - ); - }, - child: Image.network( - img, - width: 50, - height: 30, - fit: BoxFit.cover, - ), - ); - }), - ), - ), - if (widget.addFlag) - TextButton( - onPressed: () => - _deleteItem(item['HOTWORKGAS_ID'].toString()), - style: TextButton.styleFrom( - backgroundColor: Colors.red, - padding: const EdgeInsets.symmetric(horizontal: 12), - minimumSize: const Size(0, 32), - ), - child: const Text( - '删除', - style: TextStyle(color: Colors.white), - ), - ), - ], - ) - ], - ), - ), - ); - } - - Widget _buildListContent() { - if (isLoading) { - return const Center(child: CircularProgressIndicator()); - } - - if (list.isEmpty) { - return NoDataWidget.show(); - } - - return ListView.builder( - itemCount: list.length, - itemBuilder: (context, index) { - final item = list[index]; - return _buildListItem(item); - }, - ); - } - - @override - void initState() { - super.initState(); - _getListData(); - } - void _pyshAddGas() async { - await pushPage(HomeGasTestPage(HOTWORK_ID: widget.HOTWORK_ID,), context); - _getListData(); - - } - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.white, - appBar: MyAppbar( - title: '气体分析详情', - actions: [ - if (widget.addFlag) - TextButton( - onPressed: () { - _pyshAddGas(); - }, - child: const Text('添加', style: TextStyle(color: Colors.white, fontSize: 16)), - ) - ], - ), - body: _buildListContent(), - ); - } -} diff --git a/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart b/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart index 212943c..838afe4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart @@ -38,7 +38,7 @@ class _HomeGasTestPageState extends State { } Future _chooseDatePicker() async { - DateTime? picked = await BottomDateTimePicker.show(context); + DateTime? picked = await BottomDateTimePicker.showDate(context); if (picked != null) { setState(() { _selectData = DateFormat('yyyy-MM-dd HH:mm').format(picked); @@ -57,7 +57,7 @@ class _HomeGasTestPageState extends State { setState(() { imagePaths.add(path); signTimes.add(now); - + FocusHelper.clearFocus(context); }); } } @@ -68,12 +68,13 @@ class _HomeGasTestPageState extends State { return Column( children: [ const SizedBox(height: 10), - const DottedLine( - dashLength: 6.0, - dashGapLength: 4.0, - lineThickness: 0.5, - dashColor: Colors.grey, - ), + // const DottedLine( + // dashLength: 6.0, + // dashGapLength: 4.0, + // lineThickness: 0.5, + // dashColor: Colors.grey, + // ), + const Divider(), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -190,7 +191,8 @@ class _HomeGasTestPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: MyAppbar(title: '气体检测'), - body: _loading + body: SafeArea(child: + _loading ? const Center(child: CircularProgressIndicator()) : SingleChildScrollView( padding: const EdgeInsets.all(12), @@ -275,6 +277,7 @@ class _HomeGasTestPageState extends State { ], ), ), + ) ); } } diff --git a/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/gasWork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/gasWork_apply_detail.dart index 1d7ee92..9cc313b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/gasWork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/gasWork_apply_detail.dart @@ -5,12 +5,12 @@ import 'package:qhd_prevention/customWidget/department_person_picker.dart'; import 'package:qhd_prevention/customWidget/department_picker.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; -import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work_detai/hotwork_gas_list.dart'; import 'package:qhd_prevention/tools/tools.dart'; import '../../../../../../customWidget/bottom_picker.dart'; import '../../../../../../http/ApiService.dart'; import '../../../../../my_appbar.dart'; import '../../special_Wrok/dh_work_detai/MeasuresListWidget.dart'; +import '../../special_Wrok/qtfx_work_detail/hotwork_gas_list.dart'; enum EditUserType { ANALYZE('分析单位', '分析单位负责人'), diff --git a/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/hotwork_gas_list.dart b/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/hotwork_gas_list.dart index 3c73312..77162e8 100644 --- a/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/hotwork_gas_list.dart +++ b/lib/pages/home/tap/tabList/special_wrok/qtfx_work_detail/hotwork_gas_list.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/http/ApiService.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/home_gas_test_page.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; @@ -25,9 +26,11 @@ class HotworkGasList extends StatefulWidget { } class _HotworkGasListState extends State { - List list = []; + late List list = []; bool isLoading = true; + Future _getListData() async { + final data = await ApiService.hotworkGasList(widget.HOTWORK_ID); setState(() { list = data['varList'] ?? []; @@ -46,9 +49,9 @@ class _HotworkGasListState extends State { onCancel: () {}, onConfirm: () async { final result = await ApiService.hotworkGasDelete(id); - if (result['result']) { - ToastUtil.showNormal(context, '删除成功'); + if (result['result'] == 'success') { _getListData(); + ToastUtil.showNormal(context, '删除成功'); } }, ), @@ -160,23 +163,24 @@ class _HotworkGasListState extends State { super.initState(); _getListData(); } + void _pyshAddGas() async { + await pushPage(HomeGasTestPage(HOTWORK_ID: widget.HOTWORK_ID,), context); + _getListData(); + } @override Widget build(BuildContext context) { return Scaffold( + backgroundColor: Colors.white, appBar: MyAppbar( title: '气体分析详情', actions: [ if (widget.addFlag) TextButton( onPressed: () { - Navigator.pushNamed( - context, - '/hotworkGasDetail', - arguments: {'HOTWORK_ID': widget.HOTWORK_ID}, - ).then((_) => _getListData()); + _pyshAddGas(); }, - child: const Text('添加', style: TextStyle(color: Colors.white)), + child: const Text('添加', style: TextStyle(color: Colors.white, fontSize: 16)), ) ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/special_work_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/special_work_list_page.dart index 184456d..268735a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/special_work_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/special_work_list_page.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/toast_util.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/dh_work_detai/hotwork_apply_detail.dart'; +import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/szaq_work_detail/hotwork_set_safe_detail.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; import 'package:qhd_prevention/tools/tools.dart'; import '../../../../../customWidget/bottom_picker.dart'; import '../../../../../customWidget/custom_button.dart'; import '../../../../../customWidget/search_bar_widget.dart'; import '../../../../../http/ApiService.dart'; -import '../special_Wrok/dh_work_detai/hotwork_gas_list.dart'; +import '../special_Wrok/qtfx_work_detail/hotwork_gas_list.dart'; class SpecialWorkListPage extends StatefulWidget { final String flow; @@ -192,7 +193,7 @@ class _SpecialWorkListPageState extends State { pushPage(HotworkGasList(HOTWORK_ID: item['HOTWORK_ID'], addFlag:true), context); break; case '设置安全措施确认人': - routeName = '/hotwork-measures-detail'; + await pushPage(HotworkSetSafeDetail(HOTWORK_ID: item['HOTWORK_ID'], flow: widget.flow), context); break; case '安全措施确认': routeName = '/hotwork-measures-confirm-detail'; diff --git a/lib/pages/home/tap/tabList/special_wrok/szaq_work_detail/hotwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/szaq_work_detail/hotwork_set_safe_detail.dart new file mode 100644 index 0000000..1d47d13 --- /dev/null +++ b/lib/pages/home/tap/tabList/special_wrok/szaq_work_detail/hotwork_set_safe_detail.dart @@ -0,0 +1,809 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; +import 'package:qhd_prevention/customWidget/custom_button.dart'; +import 'package:qhd_prevention/customWidget/department_person_picker.dart'; +import 'package:qhd_prevention/customWidget/department_picker.dart'; +import 'package:qhd_prevention/customWidget/toast_util.dart'; +import 'package:qhd_prevention/pages/home/tap/item_list_widget.dart'; +import 'package:qhd_prevention/tools/tools.dart'; +import '../../../../../../customWidget/bottom_picker.dart'; +import '../../../../../../http/ApiService.dart'; +import '../../../../../my_appbar.dart'; +import '../../special_Wrok/dh_work_detai/MeasuresListWidget.dart'; +import '../../special_Wrok/qtfx_work_detail/hotwork_gas_list.dart'; + +enum EditUserType { + ANALYZE('分析单位', '分析单位负责人'), + GUARDIAN('监护人单位', '监护人'), + CONFESS('安全交底人单位', '安全交底人'), + ACCEPT_CONFESS('接受交底人单位', '接受交底人'), + CONFIRM('作业负责人单位', '作业负责人'), + LEADER('所在单位', '所在单位负责人'), + AUDIT('安全管理部门', '安全管理部门负责人'), + APPROVE('动火审批单位', '动火审批负责人'), + MONITOR('动火前在岗部门', '动火前在岗班长'), + WORK_START('作业开始负责人单位', '作业开始负责人'), + WORK_END('作业结束负责人单位', '作业结束负责人'), + ACCEPT('验收部门', '验收部门负责人'); + + /// 对应的单位显示名 + final String displayName; + final String personName; + + const EditUserType(this.displayName, this.personName); +} + +class HotworkSetSafeDetail extends StatefulWidget { + const HotworkSetSafeDetail({ + super.key, + required this.HOTWORK_ID, + required this.flow, + }); + + final String HOTWORK_ID; + final String flow; + + @override + State createState() => _HotworkSetSafeDetailState(); +} + +class _HotworkSetSafeDetailState extends State { + late bool isEditable = false; + final levelList = ["特级", "一级", "二级"]; + + /// 编辑还是新增 + late String msg = 'add'; + + /// 详情 + late Map pd = {}; + late List> measuresList = []; + + final TextEditingController _contentController = TextEditingController(); + final TextEditingController _locationController = TextEditingController(); + final TextEditingController _methodController = TextEditingController(); + final TextEditingController _hotworkPersonController = + TextEditingController(); + final TextEditingController _relatedController = TextEditingController(); + final TextEditingController _riskController = TextEditingController(); + + /// 动火人及证书编号 + late List workUserList = []; + /// 安全防护措施列表 + late List measuresListCopy = []; + + // 存储各单位的人员列表 + final Map>> _personCache = {}; + + @override + void initState() { + super.initState(); + _getData(); + _getHotWorkNameList(); + addMeasuresListCopy(); + _contentController.addListener(() { + setState(() { + pd['WORK_CONTENT'] = _contentController.text.trim(); + }); + }); + _locationController.addListener(() { + pd['WORK_PLACE'] = _locationController.text.trim(); + }); + _methodController.addListener(() { + pd['WORK_FUNCTION'] = _methodController.text.trim(); + }); + _hotworkPersonController.addListener(() { + pd['WORK_USER'] = _hotworkPersonController.text.trim(); + }); + _relatedController.addListener(() { + pd['SPECIAL_WORK'] = _relatedController.text.trim(); + }); + _riskController.addListener(() { + pd['RISK_IDENTIFICATION'] = _riskController.text.trim(); + }); + } + + void set_pd_DEPARTMENT_ID(EditUserType type, String id) { + pd['${type.name}_DEPARTMENT_ID'] = id; + } + + void set_pd_DEPARTMENT_NAME(EditUserType type, String name) { + pd['${type.name}_DEPARTMENT_NAME'] = name; + } + + void set_pd_USER_ID(EditUserType type, String id) { + pd['${type.name}_USER_ID'] = id; + } + + void set_pd_USER_Name(EditUserType type, String name) { + pd['${type.name}_USER_NAME'] = name; + } + + String get_pd_DEPARTMENT_ID(EditUserType type) { + return pd['${type.name}_DEPARTMENT_ID'] ?? ''; + } + + String get_pd_DEPARTMENT_NAME(EditUserType type) { + return pd['${type.name}_DEPARTMENT_NAME'] ?? ''; + } + + String get_pd_USER_ID(EditUserType type) { + return pd['${type.name}_USER_ID'] ?? ''; + } + + String get_pd_USER_Name(EditUserType type) { + return pd['${type.name}_USER_NAME'] ?? ''; + } + + Future _chooseLevel() async { + final choice = await BottomPicker.show( + context, + items: levelList, + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + // 用户点击确定并选择了 choice + setState(() { + pd['WORK_LEVEL'] = choice; + FocusHelper.clearFocus(context); + }); + } + } + + Future _chooseHorkUser() async { + final choice = await BottomPicker.show( + context, + items: workUserList.map((item) => item['NAME'] as String).toList(), + itemBuilder: (item) => Text(item, textAlign: TextAlign.center), + initialIndex: 0, + ); + if (choice != null) { + setState(() { + pd['WORK_USER'] = choice; + _hotworkPersonController.text = choice; + Map result = workUserList.firstWhere( + (item) => item['NAME'] == choice, + orElse: () => {}, // 避免找不到时报错 + ); + if (FormUtils.hasValue(result, 'USER_ID')) { + pd['WORK_USER_ID'] = result['USER_ID']; + } + FocusHelper.clearFocus(context); + }); + } + } + + Widget _defaultDetail() { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ItemListWidget.singleLineTitleText( + label: '申请单位:', + isEditable: false, + text: pd['APPLY_DEPARTMENT_NAME'] ?? '', + ), + Divider(), + ItemListWidget.singleLineTitleText( + label: '申请人:', + isEditable: false, + text: pd['APPLY_USER_NAME'] ?? '', + ), + if (FormUtils.hasValue(pd, 'CHECK_NO')) + Column( + children: [ + Divider(), + ItemListWidget.singleLineTitleText( + label: '编号:', + isEditable: false, + text: pd['CHECK_NO'] ?? '', + ), + ], + ), + + Divider(), + ItemListWidget.multiLineTitleTextField( + label: '作业内容:', + isEditable: isEditable, + controller: _contentController, + text: pd['WORK_CONTENT'] ?? '', + ), + Divider(), + ItemListWidget.singleLineTitleText( + label: '动火地点及动火部位:', + isEditable: isEditable, + controller: _locationController, + text: pd['WORK_PLACE'] ?? '', + ), + Divider(), + ItemListWidget.selectableLineTitleTextField( + label: '动火作业级别', + isEditable: isEditable, + onTap: () { + _chooseLevel(); + }, + text: pd['WORK_LEVEL'] ?? '', + ), + Divider(), + ItemListWidget.singleLineTitleText( + label: '动火方式:', + isEditable: isEditable, + controller: _methodController, + text: pd['WORK_FUNCTION'] ?? '', + ), + if (pd['WORK_START_DATE'] != null && + pd['WORK_START_DATE'].toString().isNotEmpty) + Column( + children: [ + Divider(), + ItemListWidget.singleLineTitleText( + label: '动火作业\n实施时间:', + isEditable: isEditable, + controller: _methodController, + text: + pd['WORK_START_DATE'] ?? + '' + + '至' + + (pd['WORK_END_DATE'] + ? pd['WORK_END_DATE'] ?? '' + : '--') ?? + '', + ), + ], + ), + Divider(), + ItemListWidget.twoRowSelectableTitleText( + label: '动火人及证书编号:', + isEditable: isEditable, + onTap: () { + _chooseHorkUser(); + }, + controller: _hotworkPersonController, + text: pd['WORK_USER'] ?? '', + ), + Divider(), + ItemListWidget.twoRowButtonTitleText( + label: '关联的其他特殊作业及安全作业票编号', + isEditable: isEditable, + onTap: () { + showDialog( + context: context, + builder: + (_) => SelectionPopup( + type: 'assignments', + initialValue: pd['SPECIAL_WORK'] ?? '', + onConfirm: (val) { + // val 为逗号分隔的选中值 + setState(() { + pd['SPECIAL_WORK'] = val; + _relatedController.text = val; + }); + }, + ), + ).then((_) { + FocusHelper.clearFocus(context); + }); + // identification + }, + hintText: '请输入关联的其他特殊作业及安全作业票编号', + controller: _relatedController, + text: pd['SPECIAL_WORK'] ?? '', + ), + Divider(), + ItemListWidget.twoRowButtonTitleText( + label: '风险辨识结果', + isEditable: isEditable, + onTap: () { + showDialog( + context: context, + builder: + (_) => SelectionPopup( + type: 'identification', + initialValue: pd['RISK_IDENTIFICATION'] ?? '', + onConfirm: (val) { + // val 为逗号分隔的选中值 + setState(() { + pd['RISK_IDENTIFICATION'] = val; + _riskController.text = val; + }); + }, + ), + ).then((_) { + FocusHelper.clearFocus(context); + }); + }, + hintText: '请输入风险辨识结果', + controller: _riskController, + text: pd['RISK_IDENTIFICATION'] ?? '', + ), + if (FormUtils.hasValue(pd, 'ANALYZE_TIME')) + Column( + children: [ + Divider(), + ItemListWidget.OneRowButtonTitleText( + label: '分析人', + text: pd['ANALYZE_USER_NAME'] ?? '', + onTap: () { + pushPage( + HotworkGasList(HOTWORK_ID: widget.HOTWORK_ID), + context, + ); + }, + ), + ], + ), + ], + ); + } + + Widget _card(Widget child) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(5), + ), + child: child, + ); + } + + Widget _chooseItem(EditUserType type) { + return Column( + children: [ + ItemListWidget.selectableLineTitleTextField( + label: type.displayName, + isEditable: isEditable, + text: pd['${type.name}_DEPARTMENT_NAME'] ?? '请选择', + onTap: () => chooseUnitHandle(type), + ), + Divider(), + ItemListWidget.selectableLineTitleTextField( + label: type.personName, + isEditable: isEditable, + text: pd['${type.name}_USER_NAME'] ?? '请选择', + onTap: () => choosePersonHandle(type), + ), + ], + ); + } + + /// 弹出单位选择 + void chooseUnitHandle(EditUserType type) { + FocusHelper.clearFocus(context); + showModalBottomSheet( + context: context, + isScrollControlled: true, + barrierColor: Colors.black54, + backgroundColor: Colors.transparent, + builder: + (_) => DepartmentPicker( + onSelected: (id, name) async { + setState(() { + set_pd_DEPARTMENT_ID(type, id); + set_pd_DEPARTMENT_NAME(type, name); + set_pd_USER_ID(type, ''); + set_pd_USER_Name(type, ''); + }); + _getPersonListForUnitId(id, type); + }, + ), + ).then((_) { + FocusHelper.clearFocus(context); + }); + } + + Future _getPersonListForUnitId(String id, EditUserType type) async { + // 拉取该单位的人员列表并缓存 + final result = await ApiService.getListTreePersonList(id); + setState(() { + _personCache[type] = List>.from( + result['userList'] as List, + ); + }); + } + + /// 弹出人员选择,需先选择单位 + void choosePersonHandle(EditUserType type) async { + FocusHelper.clearFocus(context); + + String unitId = get_pd_DEPARTMENT_ID(type); + final personList = _personCache[type] ?? []; + if (!unitId.isNotEmpty) { + final unitName = type.displayName; + ToastUtil.showNormal(context, '请先选择$unitName'); + return; + } + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + await _getPersonListForUnitId(unitId, type); + final list = _personCache[type] ?? []; + + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 + ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); + } else { + choosePersonHandle(type); + } + return; + } + DepartmentPersonPicker.show( + context, + personsData: personList, + onSelected: (userId, name) { + setState(() { + set_pd_USER_ID(type, userId); + set_pd_USER_Name(type, name); + }); + }, + ).then((_) { + FocusHelper.clearFocus(context); + }); + } + + /// 提交 1 提交 0暂存 + Future _submit(String status) async { + // 通用文本字段校验规则 + final textRules = >[ + {'value': _contentController.text.trim(), 'message': '请填写作业内容'}, + {'value': _locationController.text.trim(), 'message': '请填写动火地点及部位'}, + {'value': _methodController.text.trim(), 'message': '请填写动火方式'}, + {'value': _hotworkPersonController.text.trim(), 'message': '请填写动火人及证书编号'}, + { + 'value': _relatedController.text.trim(), + 'message': '请输入关联的其他特殊作业及安全作业票编号', + }, + {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, + ]; + final level = pd['WORK_LEVEL'] ?? ''; + print('---level-$level'); + + /// 各项负责人校验 + final unitRules = [ + EditUserType.ANALYZE, + EditUserType.GUARDIAN, + EditUserType.CONFESS, + EditUserType.ACCEPT_CONFESS, + EditUserType.CONFIRM, + EditUserType.LEADER, + EditUserType.AUDIT, + EditUserType.APPROVE, + EditUserType.MONITOR, + EditUserType.WORK_START, + EditUserType.WORK_END, + EditUserType.ACCEPT, + ]; + if (status == '1') { + // 文本校验 + for (var rule in textRules) { + if ((rule['value'] as String).isEmpty) { + ToastUtil.showNormal(context, rule['message']); + return; + } + } + // 级别校验 + if (level.length == 0) { + ToastUtil.showNormal(context, '请选择动火级别'); + return; + } + + for (var type in unitRules) { + if (get_pd_DEPARTMENT_ID(type).length == 0) { + ToastUtil.showNormal(context, '请选择${type.displayName}'); + return; + } + if (get_pd_USER_ID(type).length == 0) { + ToastUtil.showNormal(context, '请选择${type.displayName}负责人'); + return; + } + } + } + // LoadingDialogHelper.show(context); + + String taskId = '0'; + if (level == '特级') { + taskId = '1'; + } else if (level == '一级') { + taskId = '2'; + } else if (level == '二级') { + taskId = '3'; + } + + // 提交参数 + if (msg == 'add') { + pd['CORPINFO_ID'] = SessionService.instance.corpinfoId; + pd['CREATOR'] = SessionService.instance.loginUserId; + pd['OPERATOR'] = SessionService.instance.loginUserId; + pd['ACTION_USER'] = SessionService.instance.username; + pd['APPLY_STATUS'] = status; + pd['STEP_ID'] = status; + pd['TASK_ID'] = taskId; + pd['HOTWORK_ID'] = widget.HOTWORK_ID; + pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId; + pd['APPLY_DEPARTMENT_NAME'] = + SessionService.instance.loginUser?['DEPARTMENT_NAME'] ?? ''; + pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; + pd['APPLY_USER_NAME'] = SessionService.instance.username; + pd['USER_ID'] = SessionService.instance.loginUserId; + } + + LoadingDialogHelper.show(context); + String jsonStr = jsonEncode(pd); + printLongString(jsonStr); + try { + String url = "/app/hotwork/" + msg; + final result = await ApiService.submitHotwork(url, pd); + LoadingDialogHelper.hide(context); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, status == '1' ? '提交成功' : '已暂存'); + Navigator.pop(context); + } + } catch (e) { + LoadingDialogHelper.hide(context); + ToastUtil.showNormal(context, '操作失败:$e'); + } + } + + void printLongString(String text, {int chunkSize = 800}) { + final pattern = RegExp('.{1,$chunkSize}'); // 每 chunkSize 个字符一组 + for (final match in pattern.allMatches(text)) { + print(match.group(0)); + } + } + + Future _getHotWorkNameList() async { + final result = await ApiService.getHotWorkNameList(); + setState(() { + workUserList = result['varList'] ?? ''; + List names = + workUserList.map((item) => item['NAME'] as String).toList(); + }); + } + + /// 初始化拉取数据 + Future _getData() async { + final data = await ApiService.getHomeworkFindById(widget.HOTWORK_ID); + setState(() { + pd = data['pd']; + if (pd['STEP_ID'] == 0) { + isEditable = true; + } else { + _getMeasures(pd['HOTWORK_ID'] ?? ''); + } + // 给所有输入框赋值 + _contentController.text = pd['WORK_CONTENT'] ?? ''; + _locationController.text = pd['WORK_PLACE'] ?? ''; + _methodController.text = pd['WORK_FUNCTION'] ?? ''; + _hotworkPersonController.text = pd['WORK_USER'] ?? ''; + _relatedController.text = pd['SPECIAL_WORK'] ?? ''; + _riskController.text = pd['RISK_IDENTIFICATION'] ?? ''; + }); + // final data = await ApiService.getHomeworkFindById(widget.HOTWORK_ID); + // setState(() { + // pd = data['pd']; + // }); + // LoadingDialogHelper.hide(context); + } + + Future _getMeasures(String homework_id) async { + final data = await ApiService.listSignFinishAllMeasures( + homework_id.length > 0 ? homework_id : widget.HOTWORK_ID, + ); + setState(() { + measuresList = List>.from( + data['finishMeasuresList'] ?? >[], + ); + }); + } + void removeMeasuresListCopy(int index) { + setState(() { + measuresListCopy.removeAt(index); + }); + } + void addMeasuresListCopy() { + setState(() { + measuresListCopy.add( + MeasureItem( + id: Random().nextDouble(), + DEPARTMENT_ID: '', + DEPARTMENT_NAME: '', + USER_ID: '', + USER_NAME: '', + userList: [], + userIndex: -1, + selectMeasures: [], + ), + ); + }); + } + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: MyAppbar(title: '选择安全措施确认人'), + body: SafeArea( + child: SingleChildScrollView( + padding: EdgeInsets.all(12), + child: Column( + children: [ + _card(_defaultDetail()), + + SizedBox(height: 20), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + padding: EdgeInsets.symmetric(horizontal: 5), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ListItemFactory.createBuildSimpleSection('安全防护措施'), + CustomButton( + text: '添加', + padding: EdgeInsets.symmetric(horizontal: 15), + backgroundColor: Colors.blue, + height: 36, + onPressed: () {}, + ), + ], + ), + ), + ...measuresListCopy.asMap().entries.map((entry) { + int index = entry.key; + MeasureItem item = entry.value; + return Padding( + padding: EdgeInsets.all(12), + child: Stack( + children: [ + Card( + child: Padding( + padding: EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 部门 picker + ItemListWidget.selectableLineTitleTextField( + label: '确认单位:', + isEditable: isEditable, + onTap: () { + + }, + text:item.DEPARTMENT_NAME ?? '请选择', + ), + SizedBox(height: 8), + // 用户 picker + ItemListWidget.selectableLineTitleTextField( + label: '确认人:', + isEditable: isEditable, + onTap: () { + + }, + text:item.USER_NAME ?? '请选择', + ), + SizedBox(height: 8), + // 安全措施 + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('安全措施:'), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom(shape: StadiumBorder()), + child: Text('选择安全措施'), + ), + ], + ), + ...item.selectMeasures.asMap().entries.map((e) { + int idx = e.key; + String txt = e.value; + return Padding( + padding: EdgeInsets.only(top: 4), + child: Text('${idx + 1}. $txt'), + ); + }), + ], + ), + ), + ), + if (index != 0) + Positioned( + top: 0, + right: 0, + child: IconButton( + icon: Icon(Icons.close, color: Colors.red), + onPressed: () => removeMeasuresListCopy(index), + ), + ), + ], + ), + ); + }), + isEditable + ? Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '提交', + backgroundColor: Colors.blue, + onPressed: () { + _submit('1'); + }, + ), + ), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), + ], + ), + ], + ), + ), + ), + ); + } +} +class MeasureItem { + final double id; + String DEPARTMENT_ID; + String DEPARTMENT_NAME; + String USER_ID; + String USER_NAME; + List userList; + int userIndex; + List selectMeasures; + + MeasureItem({ + required this.id, + this.DEPARTMENT_ID = '', + this.DEPARTMENT_NAME = '', + this.USER_ID = '', + this.USER_NAME = '', + List? userList, + this.userIndex = -1, + List? selectMeasures, + }) : userList = userList ?? [], + selectMeasures = selectMeasures ?? []; +} \ No newline at end of file diff --git a/lib/pages/home/work/dangerTypeItems/danger_detail.dart b/lib/pages/home/work/dangerTypeItems/danger_detail.dart index 8642eee..fcd70c5 100644 --- a/lib/pages/home/work/dangerTypeItems/danger_detail.dart +++ b/lib/pages/home/work/dangerTypeItems/danger_detail.dart @@ -49,7 +49,7 @@ class DangerDetail extends StatelessWidget { text: "隐患照片", imageUrls: imgUrls, onImageTapped: (index) { - present( + presentOpaque( SingleImageViewer(imageUrl: imgUrls[index]), context, ); diff --git a/lib/pages/home/work/dangerTypeItems/finish/danger_acceptance_finish.dart b/lib/pages/home/work/dangerTypeItems/finish/danger_acceptance_finish.dart index 979de20..20b7b82 100644 --- a/lib/pages/home/work/dangerTypeItems/finish/danger_acceptance_finish.dart +++ b/lib/pages/home/work/dangerTypeItems/finish/danger_acceptance_finish.dart @@ -67,7 +67,7 @@ class _DangerAcceptanceFinishState extends State { text: "验收图片", imageUrls: imgUrls, onImageTapped: (index) { - present( + presentOpaque( SingleImageViewer(imageUrl: imgUrls[index]), context, ); diff --git a/lib/pages/home/work/dangerTypeItems/finish/danner_repair_finish.dart b/lib/pages/home/work/dangerTypeItems/finish/danner_repair_finish.dart index 08ce234..f2b95d4 100644 --- a/lib/pages/home/work/dangerTypeItems/finish/danner_repair_finish.dart +++ b/lib/pages/home/work/dangerTypeItems/finish/danner_repair_finish.dart @@ -61,7 +61,7 @@ class _DannerRepairFinishState extends State { text: "整改后图片", imageUrls: imgUrls, onImageTapped: (index) { - present( + presentOpaque( SingleImageViewer(imageUrl: imgUrls[index]), context, ); diff --git a/lib/tools/tools.dart b/lib/tools/tools.dart index 3f7805e..9484bde 100644 --- a/lib/tools/tools.dart +++ b/lib/tools/tools.dart @@ -19,11 +19,26 @@ Future pushPage(Widget page, BuildContext context) { ); } void present(Widget page, BuildContext context) { - Navigator.push( - context, - MaterialPageRoute(fullscreenDialog: true, builder: (context) => page), + Navigator.of(context).push( + PageRouteBuilder( + pageBuilder: (context, animation, secondaryAnimation) => page, + transitionDuration: Duration.zero, + reverseTransitionDuration: Duration.zero, + ), ); } +void presentOpaque(Widget page, BuildContext context) { + Navigator.of(context).push( + PageRouteBuilder( + opaque: false, // 允许下层透出 + barrierColor: Colors.black.withOpacity(0.5), //路由遮罩色 + pageBuilder: (context, animation, secondaryAnimation) => page, + transitionDuration: Duration.zero, + reverseTransitionDuration: Duration.zero, + ), + ); +} + class FocusHelper { static final FocusNode _emptyNode = FocusNode(); /// 延迟一帧后再移交焦点,避免不生效的问题 diff --git a/pubspec.lock b/pubspec.lock index 937467d..7b80a26 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: "4b6c1bef4270c39df96402c4d62f2348c3bb2bbaefd0883b9dbd58f426306ad0" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.6.19" camera_avfoundation: dependency: transitive description: name: camera_avfoundation - sha256: b389be4a325742a3950e50475067d95a3de2fb32ba3f31bfcc62b0b6d19907a6 - url: "https://pub.flutter-io.cn" + sha256: cabc6cbdeadca9cbcac178110c9d5e87bde5c646c3b8c9c4c2747fc500a12432 + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "0.9.20+4" + version: "0.9.20+5" 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: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "5.8.0+1" dio_web_adapter: @@ -174,15 +174,23 @@ 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: + dependency: "direct main" + description: + name: dotted_line + sha256: "41e3d655939559815daa1370fc1e07673a205fa628cf40ce3af45d90029a77b6" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" + source: hosted + version: "3.2.3" encrypt: dependency: "direct main" 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: @@ -190,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: @@ -198,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: @@ -206,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: @@ -214,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: @@ -222,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: @@ -230,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: @@ -238,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: @@ -246,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: @@ -254,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: @@ -262,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: @@ -270,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: @@ -283,7 +291,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: @@ -291,7 +299,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_plugin_android_lifecycle: @@ -299,7 +307,7 @@ packages: description: name: flutter_plugin_android_lifecycle sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.0.28" flutter_test: @@ -317,7 +325,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: @@ -325,7 +333,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: @@ -333,7 +341,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: @@ -341,7 +349,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: @@ -349,7 +357,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: @@ -357,7 +365,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: @@ -365,7 +373,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: @@ -373,7 +381,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: @@ -381,7 +389,7 @@ packages: description: name: http sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "1.4.0" http_client_helper: @@ -389,7 +397,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: @@ -397,7 +405,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: @@ -405,7 +413,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: @@ -413,7 +421,7 @@ packages: description: name: image_picker_android sha256: "6fae381e6af2bbe0365a5e4ce1db3959462fa0c4d234facf070746024bb80c8d" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "0.8.12+24" image_picker_for_web: @@ -421,7 +429,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: @@ -429,7 +437,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: @@ -437,7 +445,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: @@ -445,7 +453,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: @@ -453,7 +461,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: @@ -461,7 +469,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: @@ -469,7 +477,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: @@ -477,7 +485,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: @@ -485,7 +493,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: @@ -493,7 +501,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: @@ -501,7 +509,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: @@ -509,7 +517,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: @@ -517,7 +525,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: @@ -525,7 +533,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: @@ -533,7 +541,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: @@ -541,7 +549,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: @@ -549,7 +557,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: @@ -557,7 +565,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: @@ -565,7 +573,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: @@ -573,7 +581,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: @@ -581,7 +589,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: @@ -589,7 +597,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: @@ -597,7 +605,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: @@ -605,7 +613,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: @@ -613,7 +621,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: @@ -621,7 +629,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: @@ -629,7 +637,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: @@ -637,7 +645,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: @@ -645,7 +653,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: @@ -653,7 +661,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: @@ -661,7 +669,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: @@ -669,7 +677,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: @@ -677,7 +685,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: @@ -685,7 +693,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: @@ -693,7 +701,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: @@ -701,7 +709,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: @@ -709,7 +717,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: @@ -717,7 +725,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: @@ -725,7 +733,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: @@ -733,7 +741,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: @@ -741,7 +749,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: @@ -749,7 +757,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: @@ -757,7 +765,7 @@ packages: description: name: shared_preferences_android sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.4.10" shared_preferences_foundation: @@ -765,7 +773,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: @@ -773,7 +781,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: @@ -781,7 +789,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: @@ -789,7 +797,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: @@ -797,7 +805,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: @@ -805,7 +813,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: @@ -818,7 +826,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: @@ -826,7 +834,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: @@ -834,7 +842,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: @@ -842,7 +850,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: @@ -850,7 +858,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: @@ -858,7 +866,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: @@ -866,7 +874,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: @@ -874,7 +882,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: @@ -882,7 +890,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: @@ -890,7 +898,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: @@ -898,7 +906,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: @@ -906,7 +914,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: @@ -914,7 +922,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: @@ -922,7 +930,7 @@ packages: description: name: url_launcher_android sha256: "8582d7f6fe14d2652b4c45c9b6c14c0b678c2af2d083a11b604caeba51930d79" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "6.3.16" url_launcher_ios: @@ -930,7 +938,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: @@ -938,7 +946,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: @@ -946,7 +954,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: @@ -954,7 +962,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: @@ -962,7 +970,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: @@ -970,7 +978,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: @@ -978,7 +986,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: @@ -986,7 +994,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: @@ -994,23 +1002,23 @@ 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: dependency: transitive description: name: video_player_android - sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" - url: "https://pub.flutter-io.cn" + sha256: "9d5af2d233ba69df803dcf2f31e66d9a4c6206f2d96178df06b09b0ec3056b39" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted - version: "2.8.7" + version: "2.8.9" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation sha256: "9fedd55023249f3a02738c195c906b4e530956191febf0838e37d0dac912f953" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.8.0" video_player_platform_interface: @@ -1018,7 +1026,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: @@ -1026,7 +1034,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: @@ -1034,7 +1042,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: @@ -1042,7 +1050,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: @@ -1050,7 +1058,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: @@ -1058,7 +1066,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: @@ -1066,7 +1074,7 @@ packages: description: name: webview_flutter_android sha256: "9573ad97890d199ac3ab32399aa33a5412163b37feb573eb5b0a76b35e9ffe41" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "4.8.2" webview_flutter_platform_interface: @@ -1074,7 +1082,7 @@ packages: description: name: webview_flutter_platform_interface sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "2.13.1" webview_flutter_wkwebview: @@ -1082,7 +1090,7 @@ packages: description: name: webview_flutter_wkwebview sha256: "71523b9048cf510cfa1fd4e0a3fa5e476a66e0884d5df51d59d5023dba237107" - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "3.22.1" wechat_assets_picker: @@ -1090,7 +1098,7 @@ packages: description: name: wechat_assets_picker sha256: cafe3d32564ed3cacf9822f251941f7b44fe9885c17c8de4fca7e939a459e1ef - url: "https://pub.flutter-io.cn" + url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" source: hosted version: "9.5.1" wechat_picker_library: @@ -1098,7 +1106,7 @@ packages: 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: @@ -1106,7 +1114,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: @@ -1114,7 +1122,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: @@ -1122,7 +1130,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: