2025.7.4 我的-服务协议、隐私协议、帮助中心、关于
							parent
							
								
									183be5ee58
								
							
						
					
					
						commit
						c738be9e23
					
				|  | @ -38,7 +38,9 @@ | |||
|     <application | ||||
|         android:label="qhd_prevention" | ||||
|         android:name="${applicationName}" | ||||
|         android:icon="@mipmap/ic_launcher"> | ||||
|         android:icon="@mipmap/ic_launcher" | ||||
|         android:usesCleartextTraffic="true" | ||||
|         > | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:exported="true" | ||||
|  |  | |||
|  | @ -0,0 +1,313 @@ | |||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:image_picker/image_picker.dart'; | ||||
| import 'dart:io'; | ||||
| import '../../../../../customWidget/photo_picker_row.dart'; | ||||
| import 'package:qhd_prevention/pages/my_appbar.dart'; | ||||
| 
 | ||||
| // feedback_type.dart | ||||
| enum FeedbackType { | ||||
|   systemError, | ||||
|   uiOptimization, | ||||
|   designIssue, | ||||
|   performanceIssue, | ||||
|   other, | ||||
| } | ||||
| 
 | ||||
| class FeedbackApp extends StatelessWidget { | ||||
|   const FeedbackApp({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: MyAppbar(title:'问题反馈' ), | ||||
|       body: const FeedbackPage(), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class FeedbackPage extends StatefulWidget { | ||||
|   const FeedbackPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<FeedbackPage> createState() => _FeedbackPageState(); | ||||
| } | ||||
| 
 | ||||
| class _FeedbackPageState extends State<FeedbackPage> { | ||||
|   final _formKey = GlobalKey<FormState>(); | ||||
|   final TextEditingController _titleController = TextEditingController(); | ||||
|   final TextEditingController _descriptionController = TextEditingController(); | ||||
| 
 | ||||
|   // 反馈类型 | ||||
|   FeedbackType? _selectedType = FeedbackType.other; | ||||
| 
 | ||||
|   // 上传的图片 | ||||
|   List<File> _images = []; | ||||
| 
 | ||||
|   // 获取反馈类型名称 | ||||
|   String _getTypeName(FeedbackType type) { | ||||
|     switch (type) { | ||||
|       case FeedbackType.systemError: | ||||
|         return '系统错误'; | ||||
|       case FeedbackType.uiOptimization: | ||||
|         return '界面优化'; | ||||
|       case FeedbackType.designIssue: | ||||
|         return '设计缺陷'; | ||||
|       case FeedbackType.performanceIssue: | ||||
|         return '性能问题'; | ||||
|       case FeedbackType.other: | ||||
|         return '其他'; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // 选择图片 | ||||
|   Future<void> _pickImage() async { | ||||
|     if (_images.length >= 4) return; | ||||
| 
 | ||||
|     final picker = ImagePicker(); | ||||
|     try { | ||||
|       final pickedFile = await picker.pickImage(source: ImageSource.gallery); | ||||
|       if (pickedFile != null) { | ||||
|         setState(() { | ||||
|           _images.add(File(pickedFile.path)); | ||||
|         }); | ||||
|       } | ||||
|     } catch (e) { | ||||
|       ScaffoldMessenger.of( | ||||
|         context, | ||||
|       ).showSnackBar(const SnackBar(content: Text('无法访问相册,请检查权限设置'))); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // 删除图片 | ||||
|   void _removeImage(int index) { | ||||
|     setState(() { | ||||
|       _images.removeAt(index); | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: MyAppbar(title: "问题反馈"), | ||||
|       body: Container( | ||||
|         color: Colors.white, | ||||
|         child: Form( | ||||
|           key: _formKey, | ||||
|           child: SingleChildScrollView( | ||||
|             padding: const EdgeInsets.all(16), | ||||
|             child: Column( | ||||
|               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|               children: [ | ||||
|                 // 标题输入 | ||||
|                 const Text('标题', style: TextStyle(fontWeight: FontWeight.bold)), | ||||
|                 const SizedBox(height: 8), | ||||
|                 TextFormField( | ||||
|                   controller: _titleController, | ||||
|                   decoration: const InputDecoration( | ||||
|                     hintText: '请输入标题...', | ||||
|                     border: OutlineInputBorder(), | ||||
|                   ), | ||||
|                   validator: (value) { | ||||
|                     if (value == null || value.isEmpty) { | ||||
|                       return '请输入标题'; | ||||
|                     } | ||||
|                     return null; | ||||
|                   }, | ||||
|                 ), | ||||
|                 const SizedBox(height: 24), | ||||
| 
 | ||||
|                 // 问题描述 | ||||
|                 const Text( | ||||
|                   '详细问题和意见', | ||||
|                   style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                 ), | ||||
|                 const SizedBox(height: 8), | ||||
|                 TextFormField( | ||||
|                   controller: _descriptionController, | ||||
|                   maxLines: 5, | ||||
|                   decoration: | ||||
|                   const InputDecoration( | ||||
|                     hintText: '请补充详细问题和意见...', | ||||
|                     border: OutlineInputBorder(), | ||||
|                     contentPadding:  EdgeInsets.all(10), | ||||
|                   ), | ||||
|                   validator: (value) { | ||||
|                     if (value == null || value.isEmpty) { | ||||
|                       return '请补充详细问题和意见'; | ||||
|                     } | ||||
|                     return null; | ||||
|                   }, | ||||
|                 ), | ||||
|                 const SizedBox(height: 24), | ||||
| 
 | ||||
|                 // 反馈类型 | ||||
|                 const Text( | ||||
|                   '反馈类型', | ||||
|                   style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                 ), | ||||
|                 const SizedBox(height: 8), | ||||
|                 Wrap( | ||||
|                   spacing: 16, | ||||
|                   children: | ||||
|                       FeedbackType.values.map((type) { | ||||
|                         return ChoiceChip( | ||||
|                           label: Text(_getTypeName(type)), | ||||
|                           selected: _selectedType == type, | ||||
|                           onSelected: (selected) { | ||||
|                             setState(() { | ||||
|                               if (selected) { | ||||
|                                 _selectedType = type; | ||||
|                               } | ||||
|                             }); | ||||
|                           }, | ||||
|                         ); | ||||
|                       }).toList(), | ||||
|                 ), | ||||
| 
 | ||||
|                 // const SizedBox(height: 14), | ||||
|                 // Row( | ||||
|                 //   mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|                 //   children: [ | ||||
|                 //   const Text( | ||||
|                 //     '请提供相关问题的截图或照片', | ||||
|                 //     style: TextStyle(fontWeight: FontWeight.bold), | ||||
|                 //   ), | ||||
|                 //   Text( | ||||
|                 //     '${_images.length}/4', | ||||
|                 //     style: const TextStyle(color: Colors.grey), | ||||
|                 //   ), | ||||
|                 // ],), | ||||
| 
 | ||||
|                 // 图片上传 | ||||
|                 const SizedBox(height: 16), | ||||
| 
 | ||||
|                 RepairedPhotoSection( | ||||
|                   horizontalPadding: 0, | ||||
|                   title: "请提供相关问题的截图或照片", | ||||
|                   maxCount: 4, | ||||
|                   mediaType: MediaType.image, | ||||
|                   onChanged: (files) { | ||||
|                     // 上传 files 到服务器 | ||||
|                   }, | ||||
|                   onAiIdentify: () {}, | ||||
|                 ), | ||||
| 
 | ||||
|                 // GridView.builder( | ||||
|                 //   shrinkWrap: true, | ||||
|                 //   physics: const NeverScrollableScrollPhysics(), | ||||
|                 //   gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( | ||||
|                 //     crossAxisCount: 4, | ||||
|                 //     crossAxisSpacing: 8, | ||||
|                 //     mainAxisSpacing: 8, | ||||
|                 //     childAspectRatio: 1, | ||||
|                 //   ), | ||||
|                 //   itemCount: _images.length + 1, | ||||
|                 //   itemBuilder: (context, index) { | ||||
|                 //     if (index < _images.length) { | ||||
|                 //       return Stack( | ||||
|                 //         children: [ | ||||
|                 //           Container( | ||||
|                 //             decoration: BoxDecoration( | ||||
|                 //               borderRadius: BorderRadius.circular(8), | ||||
|                 //               image: DecorationImage( | ||||
|                 //                 image: FileImage(_images[index]), | ||||
|                 //                 fit: BoxFit.cover, | ||||
|                 //               ), | ||||
|                 //             ), | ||||
|                 //           ), | ||||
|                 //           Positioned( | ||||
|                 //             top: 4, | ||||
|                 //             right: 4, | ||||
|                 //             child: GestureDetector( | ||||
|                 //               onTap: () => _removeImage(index), | ||||
|                 //               child: Container( | ||||
|                 //                 padding: const EdgeInsets.all(2), | ||||
|                 //                 decoration: const BoxDecoration( | ||||
|                 //                   shape: BoxShape.circle, | ||||
|                 //                   color: Colors.black54, | ||||
|                 //                 ), | ||||
|                 //                 child: const Icon( | ||||
|                 //                   Icons.close, | ||||
|                 //                   size: 16, | ||||
|                 //                   color: Colors.white, | ||||
|                 //                 ), | ||||
|                 //               ), | ||||
|                 //             ), | ||||
|                 //           ), | ||||
|                 //         ], | ||||
|                 //       ); | ||||
|                 //     } else { | ||||
|                 //       return _images.length < 4 | ||||
|                 //           ? GestureDetector( | ||||
|                 //             onTap: _pickImage, | ||||
|                 //             child: Container( | ||||
|                 //               decoration: BoxDecoration( | ||||
|                 //                 border: Border.all(color: Colors.grey), | ||||
|                 //                 borderRadius: BorderRadius.circular(8), | ||||
|                 //               ), | ||||
|                 //               child: const Icon( | ||||
|                 //                 Icons.add, | ||||
|                 //                 size: 40, | ||||
|                 //                 color: Colors.grey, | ||||
|                 //               ), | ||||
|                 //             ), | ||||
|                 //           ) | ||||
|                 //           : const SizedBox(); | ||||
|                 //     } | ||||
|                 //   }, | ||||
|                 // ), | ||||
|                 const SizedBox(height: 40), | ||||
| 
 | ||||
|                 // 提交按钮 | ||||
|                 SizedBox( | ||||
|                   width: double.infinity, | ||||
|                   child: ElevatedButton( | ||||
|                     onPressed: _submitFeedback, | ||||
|                     style: ElevatedButton.styleFrom( | ||||
|                       backgroundColor: Colors.blue, | ||||
|                       padding: const EdgeInsets.symmetric(vertical: 16), | ||||
|                       shape: RoundedRectangleBorder( | ||||
|                         borderRadius: BorderRadius.circular(8), | ||||
|                       ), | ||||
|                     ), | ||||
|                     child: const Text( | ||||
|                       '提交', | ||||
|                       style: TextStyle(fontSize: 18, color: Colors.white), | ||||
|                     ), | ||||
|                   ), | ||||
|                 ), | ||||
|               ], | ||||
|             ), | ||||
|           ), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   // 提交反馈 | ||||
|   void _submitFeedback() { | ||||
|     if (_formKey.currentState!.validate()) { | ||||
|       // 模拟提交过程 | ||||
|       showDialog( | ||||
|         context: context, | ||||
|         barrierDismissible: false, | ||||
|         builder: (context) => const Center(child: CircularProgressIndicator()), | ||||
|       ); | ||||
| 
 | ||||
|       Future.delayed(const Duration(seconds: 2), () { | ||||
|         Navigator.pop(context); // 关闭加载对话框 | ||||
|         ScaffoldMessenger.of( | ||||
|           context, | ||||
|         ).showSnackBar(const SnackBar(content: Text('反馈提交成功!'))); | ||||
| 
 | ||||
|         // 重置表单 | ||||
|         _formKey.currentState!.reset(); | ||||
|         setState(() { | ||||
|           _images.clear(); | ||||
|           _selectedType = FeedbackType.other; | ||||
|         }); | ||||
|       }); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -0,0 +1,104 @@ | |||
| import 'package:flutter/material.dart'; | ||||
| import 'dart:io'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:qhd_prevention/pages/my_appbar.dart'; | ||||
| 
 | ||||
| import '../../tools/tools.dart'; | ||||
| import 'mine_sign_page.dart'; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| class FirstSignPage extends StatefulWidget { | ||||
|   const FirstSignPage({super.key}); | ||||
| 
 | ||||
| 
 | ||||
|   @override | ||||
|   State<FirstSignPage> createState() => _SignatureUpdatePageState(); | ||||
| } | ||||
| 
 | ||||
| class _SignatureUpdatePageState extends State<FirstSignPage> { | ||||
|   String imagePath=""; | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       appBar: MyAppbar(title: "更新签字信息"), | ||||
|       body: Column( | ||||
|           crossAxisAlignment: CrossAxisAlignment.start, | ||||
|           children: [ | ||||
|             Row( | ||||
|               children: [ | ||||
|                 GestureDetector( | ||||
|                   onTap: () { | ||||
|                     pushPage(MineSignPage(), context); | ||||
|                   }, | ||||
|                   child:  Text("用户",style: TextStyle(color: Colors.black,fontSize: 16)), | ||||
|                 ), | ||||
| 
 | ||||
|                 // _buildConfirmButton(), | ||||
|               ], | ||||
|             ), | ||||
|             const SizedBox(height: 8), | ||||
| 
 | ||||
|            Row( | ||||
|              children: [ | ||||
|                  Text('签字照片:', | ||||
|                    style: TextStyle( | ||||
|                      fontSize: 16, | ||||
|                      fontWeight: FontWeight.bold, | ||||
|                      color: Colors.grey, | ||||
|                    ), | ||||
|                 ), | ||||
|                if (imagePath.isNotEmpty) | ||||
|                Image.file(File(imagePath)), | ||||
|               ], | ||||
|            ), | ||||
| 
 | ||||
|             // 确认按钮 | ||||
|             // const Spacer(), | ||||
|             // _buildConfirmButton(), | ||||
|           ], | ||||
|         ), | ||||
| 
 | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   Widget _buildConfirmButton() { | ||||
|     return SizedBox( | ||||
|       width: double.infinity, | ||||
|       child: ElevatedButton( | ||||
|         onPressed: () { | ||||
| 
 | ||||
|         }, | ||||
|         style: ElevatedButton.styleFrom( | ||||
|           backgroundColor: const Color(0xFF4285F4), | ||||
|           padding: const EdgeInsets.symmetric(vertical: 16), | ||||
|           shape: RoundedRectangleBorder( | ||||
|             borderRadius: BorderRadius.circular(8), | ||||
|           ), | ||||
|         ), | ||||
|         child: imagePath.isNotEmpty | ||||
|             ? const SizedBox( | ||||
|           width: 24, | ||||
|           height: 24, | ||||
|           child: CircularProgressIndicator( | ||||
|             strokeWidth: 2, | ||||
|             color: Colors.white, | ||||
|           ), | ||||
|         ) | ||||
|             : const Text( | ||||
|           '确认', | ||||
|           style: TextStyle(fontSize: 18, color: Colors.white), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | @ -1,4 +1,6 @@ | |||
| import 'package:flutter/material.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_feedback_page.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/webViewPage.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_about_page.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_set_page.dart'; | ||||
| import 'package:qhd_prevention/tools/tools.dart'; | ||||
|  | @ -56,6 +58,62 @@ class _MinePageState extends State<MinePage> { | |||
|           }, | ||||
|         ), | ||||
| 
 | ||||
|         Divider(height: 1,color: Colors.black12,), | ||||
|         GestureDetector( | ||||
|           child: _setItemWidget("问题反馈"), | ||||
|           onTap: () { | ||||
|             pushPage(FeedbackPage(), context); | ||||
|           }, | ||||
|         ), | ||||
| 
 | ||||
|         Divider(height: 1,color: Colors.black12,), | ||||
|         GestureDetector( | ||||
|           child: _setItemWidget("用户服务协议"), | ||||
|           onTap: () { | ||||
|             Navigator.push( | ||||
|               context, | ||||
|               MaterialPageRoute( | ||||
|                 builder: (context) => const WebViewPage( | ||||
|                   name: "用户服务协议", | ||||
|                   url: 'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', // 替换为目标网址 | ||||
|                 ), | ||||
|               ), | ||||
|             ); | ||||
|           }, | ||||
|         ), | ||||
| 
 | ||||
|         Divider(height: 1,color: Colors.black12,), | ||||
|         GestureDetector( | ||||
|           child: _setItemWidget("用户隐私协议"), | ||||
|           onTap: () { | ||||
|             Navigator.push( | ||||
|               context, | ||||
|               MaterialPageRoute( | ||||
|                 builder: (context) => const WebViewPage( | ||||
|                   name: "用户隐私协议", | ||||
|                   url: 'http://47.92.102.56:7811/file/xieyi/zsysq.htm', // 替换为目标网址 | ||||
|                 ), | ||||
|               ), | ||||
|             ); | ||||
|           }, | ||||
|         ), | ||||
| 
 | ||||
|         Divider(height: 1,color: Colors.black12,), | ||||
|         GestureDetector( | ||||
|           child: _setItemWidget("帮助中心"), | ||||
|           onTap: () { | ||||
|             Navigator.push( | ||||
|               context, | ||||
|               MaterialPageRoute( | ||||
|                 builder: (context) => const WebViewPage( | ||||
|                   name: "帮助中心", | ||||
|                   url: 'http://47.92.102.56:7811/file/help/help/', // 替换为目标网址 | ||||
|                 ), | ||||
|               ), | ||||
|             ); | ||||
|           }, | ||||
|         ), | ||||
| 
 | ||||
|         Divider(height: 1,color: Colors.black12,), | ||||
|         GestureDetector( | ||||
|           child: _setItemWidget("关于"), | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| import 'package:flutter/material.dart'; | ||||
| import 'package:qhd_prevention/pages/login_page.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_first_sign_page.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_set_pwd_page.dart'; | ||||
| import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; | ||||
| import 'package:qhd_prevention/pages/my_appbar.dart'; | ||||
| import 'package:qhd_prevention/tools/h_colors.dart'; | ||||
| import 'package:shared_preferences/shared_preferences.dart'; | ||||
|  | @ -29,6 +31,15 @@ class MineSetPage extends StatelessWidget { | |||
|             }, | ||||
|           ), | ||||
| 
 | ||||
|           Divider(height: 1, color: Colors.black12), | ||||
|           GestureDetector( | ||||
|               child: _setItemWidget("更新签字信息"), | ||||
|               onTap: () { | ||||
|                 pushPage(FirstSignPage(), context); | ||||
|                 // pushPage(MineSignPage(), context); | ||||
|             } | ||||
|           ), | ||||
| 
 | ||||
|           Divider(height: 1, color: Colors.black12), | ||||
|           GestureDetector(child: _setItemWidget("检查更新"), onTap: () {}), | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,365 @@ | |||
| import 'dart:io'; | ||||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/rendering.dart'; | ||||
| import 'dart:ui' as ui; | ||||
| import 'package:flutter/services.dart'; | ||||
| 
 | ||||
| import 'package:path_provider/path_provider.dart'; | ||||
| 
 | ||||
| class MineSignPage extends StatelessWidget { | ||||
|   const MineSignPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       body: const SignatureConfirmPage(), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class SignatureConfirmPage extends StatefulWidget { | ||||
|   const SignatureConfirmPage({super.key}); | ||||
| 
 | ||||
|   @override | ||||
|   State<SignatureConfirmPage> createState() => _SignatureConfirmPageState(); | ||||
| } | ||||
| 
 | ||||
| class _SignatureConfirmPageState extends State<SignatureConfirmPage> { | ||||
|   final GlobalKey _signatureKey = GlobalKey(); | ||||
|   List<Offset?> _points = []; | ||||
|   bool _hasSignature = false; | ||||
|   File? fileN; | ||||
|   Uint8List? _postBytes; | ||||
|  late String imagepath=""; | ||||
| 
 | ||||
|   void _clearSignature() { | ||||
|     setState(() { | ||||
|       _points.clear(); | ||||
|       _hasSignature = false; | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   void _confirmSignature() { | ||||
|     if (!_hasSignature) { | ||||
|       ScaffoldMessenger.of(context).showSnackBar( | ||||
|         const SnackBar(content: Text('请先签名')), | ||||
|       ); | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     _saveSignPic(); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     // // 保存签名逻辑 | ||||
|     // ScaffoldMessenger.of(context).showSnackBar( | ||||
|     //   const SnackBar(content: Text('签名已确认')), | ||||
|     // ); | ||||
|     //模拟保存后返回 | ||||
| 
 | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   // 保存签名 | ||||
|   void _saveSignPic() async{ | ||||
| 
 | ||||
|     RenderRepaintBoundary boundary = _signatureKey.currentContext!.findRenderObject() as RenderRepaintBoundary; | ||||
|     var image = await boundary.toImage(pixelRatio: 1); | ||||
|     ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); | ||||
| 
 | ||||
|     Directory dir = await getTemporaryDirectory(); | ||||
|     String path = dir.path +"/"+ 'sign.png'; | ||||
| 
 | ||||
|     File file2 = File(path); | ||||
|     // 检查文件是否存在 | ||||
|     if (await file2.exists()) { | ||||
|       // 文件存在,删除文件 | ||||
|       await file2.delete(); | ||||
|     } | ||||
| 
 | ||||
|     var file = await File(path).create(recursive: true); | ||||
|     if(byteData != null){ | ||||
|       file.writeAsBytesSync(byteData.buffer.asInt8List(),flush: true); | ||||
| 
 | ||||
|       setState(() { | ||||
|         _postBytes = byteData.buffer.asUint8List(); | ||||
|         fileN = file; | ||||
|         imagepath = file.path; | ||||
|         Future.delayed(const Duration(milliseconds: 500), () { | ||||
|           Navigator.pop(context,imagepath); | ||||
|         }); | ||||
|       }); | ||||
| 
 | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     SystemChrome.setPreferredOrientations([ | ||||
|       DeviceOrientation.landscapeRight, | ||||
|       DeviceOrientation.landscapeLeft, | ||||
|     ]); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   void dispose() { | ||||
|     // 不要忘记重置方向设置,以避免影响其他页面或应用。 | ||||
|     SystemChrome.setPreferredOrientations([ | ||||
|       DeviceOrientation.portraitUp, | ||||
|       DeviceOrientation.portraitDown, | ||||
|       DeviceOrientation.landscapeLeft, | ||||
|       DeviceOrientation.landscapeRight, | ||||
|     ]); | ||||
|     super.dispose(); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Scaffold( | ||||
|       body: SafeArea( | ||||
|         child: Column( | ||||
|           children: [ | ||||
| 
 | ||||
|             // 标题区域 | ||||
|             _buildTitleBar(), | ||||
|             // MyAppbar(title: "签字"), | ||||
| 
 | ||||
|             // 签字区域 | ||||
|             Expanded( | ||||
|               child: _buildSignatureArea(), | ||||
|             ), | ||||
| 
 | ||||
|             // 按钮区域 | ||||
|             _buildActionButtons(), | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget _buildTitleBar() { | ||||
|     return Padding( | ||||
|       padding: const EdgeInsets.symmetric(horizontal: 16), | ||||
|       child: Row( | ||||
|         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|         children: [ | ||||
|           IconButton( | ||||
|             icon: const Icon(Icons.arrow_back), | ||||
|             onPressed: () => Navigator.pop(context), | ||||
|           ), | ||||
|           const Text( | ||||
|             '签字', | ||||
|             style: TextStyle( | ||||
|               fontSize: 20, | ||||
|               fontWeight: FontWeight.bold, | ||||
|             ), | ||||
|           ), | ||||
|           const SizedBox(width: 48), // 占位保持标题居中 | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget _buildSignatureArea() { | ||||
|     return Padding( | ||||
|       padding: const EdgeInsets.symmetric(horizontal: 24), | ||||
|       child: Container( | ||||
|         decoration: BoxDecoration( | ||||
|           borderRadius: BorderRadius.circular(12), | ||||
|           border: Border.all(color: Colors.grey[300]!), | ||||
|         ), | ||||
|         child: Column( | ||||
|           children: [ | ||||
| 
 | ||||
|             // 签字画布 | ||||
|             Expanded( | ||||
|               child: GestureDetector( | ||||
|                 onPanStart: (details) { | ||||
|                   setState(() { | ||||
|                     _points.add(details.localPosition); | ||||
|                     _hasSignature = true; | ||||
|                   }); | ||||
|                 }, | ||||
|                 onPanUpdate: (details) { | ||||
|                   setState(() { | ||||
|                     _points.add(details.localPosition); | ||||
|                   }); | ||||
|                 }, | ||||
|                 onPanEnd: (details) { | ||||
|                   setState(() { | ||||
|                     _points.add(null); | ||||
|                   }); | ||||
|                 }, | ||||
|                 child: RepaintBoundary( | ||||
|                   key: _signatureKey, | ||||
|                   child: Stack( | ||||
|                     children: [ | ||||
|                       // if (imagepath.length > 0) | ||||
|                       // Image.file( | ||||
|                       //   File(imagepath), // 显示选择的图片文件 | ||||
|                       //   fit: BoxFit.contain, // 设置图片填充方式为完整显示,保持宽高比例 | ||||
|                       // ), | ||||
| 
 | ||||
| 
 | ||||
|                       // 背景横线 | ||||
|                       _buildBackgroundLines(), | ||||
| 
 | ||||
|                       // 签名画布 | ||||
|                       CustomPaint( | ||||
|                         painter: SignaturePainter(points: _points), | ||||
|                         size: Size.infinite, | ||||
|                       ), | ||||
| 
 | ||||
|                       // 提示文字 | ||||
|                       if (!_hasSignature) | ||||
|                         const Center( | ||||
|                           child: Text( | ||||
|                             '请在此处签名', | ||||
|                             style: TextStyle( | ||||
|                               fontSize: 16, | ||||
|                               color: Colors.grey, | ||||
|                             ), | ||||
|                           ), | ||||
|                         ), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ), | ||||
|               ), | ||||
|             ), | ||||
|           ], | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget _buildBackgroundLines() { | ||||
|     return LayoutBuilder( | ||||
|       builder: (context, constraints) { | ||||
|         return CustomPaint( | ||||
|           painter: BackgroundLinesPainter(), | ||||
|           size: Size(constraints.maxWidth, constraints.maxHeight), | ||||
|         ); | ||||
|       }, | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   Widget _buildActionButtons() { | ||||
|     return Padding( | ||||
|       padding: const EdgeInsets.only(left: 24,right: 24,top: 10,bottom: 10), | ||||
|       child: Row( | ||||
|         mainAxisAlignment: MainAxisAlignment.spaceEvenly, | ||||
|         children: [ | ||||
|       // 重签按钮 | ||||
|       Expanded( | ||||
|       child: OutlinedButton( | ||||
|       onPressed: _clearSignature, | ||||
|         style: OutlinedButton.styleFrom( | ||||
|           padding: const EdgeInsets.symmetric(vertical: 8), | ||||
|           side: const BorderSide(color: Colors.blue), | ||||
|           shape: RoundedRectangleBorder( | ||||
|             borderRadius: BorderRadius.circular(8), | ||||
|           ), | ||||
|         ), | ||||
|           child: const Text( | ||||
|             '重签', | ||||
|             style: TextStyle( | ||||
|               fontSize: 16, | ||||
|               color: Colors.blue, | ||||
|               fontWeight: FontWeight.w500, | ||||
|             ), | ||||
|           ), | ||||
|          | ||||
|       ), | ||||
|     ), | ||||
| 
 | ||||
|       const SizedBox(width: 20), | ||||
| 
 | ||||
|       // 确定按钮 | ||||
|       Expanded( | ||||
|         child: ElevatedButton( | ||||
|           onPressed: _confirmSignature, | ||||
|           style: ElevatedButton.styleFrom( | ||||
|             backgroundColor: Colors.blue, | ||||
|             padding: const EdgeInsets.symmetric(vertical: 8), | ||||
|             shape: RoundedRectangleBorder( | ||||
|               borderRadius: BorderRadius.circular(8), | ||||
|             ), | ||||
|     ), | ||||
|             child: const Text( | ||||
|               '确定', | ||||
|               style: TextStyle( | ||||
|                 fontSize: 16, | ||||
|                 color: Colors.white, | ||||
|                 fontWeight: FontWeight.w500, | ||||
|               ), | ||||
|             ), | ||||
|           ), | ||||
|         ), | ||||
|        | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // 签名绘制器 | ||||
| class SignaturePainter extends CustomPainter { | ||||
|   final List<Offset?> points; | ||||
| 
 | ||||
|   SignaturePainter({required this.points}); | ||||
| 
 | ||||
|   @override | ||||
|   void paint(Canvas canvas, Size size) { | ||||
|     Paint paint = Paint() | ||||
|       ..color = Colors.black | ||||
|       ..strokeCap = StrokeCap.round | ||||
|       ..strokeWidth = 3.0; | ||||
| 
 | ||||
|     for (int i = 0; i < points.length - 1; i++) { | ||||
|       if (points[i] != null && points[i + 1] != null) { | ||||
|         canvas.drawLine(points[i]!, points[i + 1]!, paint); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   bool shouldRepaint(SignaturePainter oldDelegate) => oldDelegate.points != points; | ||||
| } | ||||
| 
 | ||||
| // 背景横线绘制器 | ||||
| class BackgroundLinesPainter extends CustomPainter { | ||||
|   @override | ||||
|   void paint(Canvas canvas, Size size) { | ||||
|     Paint paint = Paint() | ||||
|       // ..color = Colors.grey[200]! | ||||
|       ..color = Color.from(alpha: 0, red: 0, green: 0, blue: 0)! | ||||
|       ..strokeWidth = 0; | ||||
| 
 | ||||
|     // 绘制横线 | ||||
|     for (double y = 40; y < size.height; y += 40) { | ||||
|       canvas.drawLine( | ||||
|         Offset(0, y), | ||||
|         Offset(size.width, y), | ||||
|         paint, | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   bool shouldRepaint(CustomPainter oldDelegate) => false; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,62 @@ | |||
| 
 | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:qhd_prevention/pages/my_appbar.dart'; | ||||
| import 'package:webview_flutter/webview_flutter.dart'; | ||||
| 
 | ||||
| 
 | ||||
| class WebViewPage extends StatefulWidget { | ||||
|   final String url; | ||||
|   final String name; | ||||
| 
 | ||||
|   const WebViewPage({Key? key, required this.url, required this.name,}) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   State<WebViewPage> createState() => _WebViewPageState(name); | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| class _WebViewPageState extends State<WebViewPage> { | ||||
|   late final WebViewController _controller; | ||||
|   final String name; | ||||
|   ValueNotifier<double> loadingProgress = ValueNotifier(0.0); | ||||
|   ValueNotifier<bool> isLoading = ValueNotifier(true); | ||||
| 
 | ||||
|   _WebViewPageState(this.name); | ||||
| 
 | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     _controller = WebViewController() | ||||
|       ..setJavaScriptMode(JavaScriptMode.unrestricted) | ||||
|       ..setNavigationDelegate(NavigationDelegate( | ||||
|         onProgress: (progress) { | ||||
|           loadingProgress.value = progress / 100; | ||||
|           if (progress == 100) isLoading.value = false; | ||||
|         }, | ||||
|         onPageStarted: (url) => isLoading.value = true, | ||||
|         onPageFinished: (url) => isLoading.value = false, | ||||
|       )) | ||||
|       ..loadRequest(Uri.parse(widget.url)); | ||||
|   } | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Column( | ||||
|       children: [ | ||||
|         MyAppbar(title: name), | ||||
|         Expanded( child: WebViewWidget(controller: _controller),), | ||||
|         // ValueListenableBuilder<bool>( | ||||
|         //   valueListenable: isLoading, | ||||
|         //   builder: (context, loading, _) { | ||||
|         //     return loading | ||||
|         //         ? const Center(child: CircularProgressIndicator()) | ||||
|         //         : const SizedBox(); | ||||
|         //   }, | ||||
|         // ), | ||||
|       ], | ||||
| 
 | ||||
|     ); | ||||
| 
 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										254
									
								
								pubspec.lock
								
								
								
								
							
							
						
						
									
										254
									
								
								pubspec.lock
								
								
								
								
							|  | @ -6,23 +6,23 @@ packages: | |||
|     description: | ||||
|       name: args | ||||
|       sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.7.0" | ||||
|   async: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: async | ||||
|       sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.12.0" | ||||
|     version: "2.13.0" | ||||
|   boolean_selector: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: boolean_selector | ||||
|       sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.2" | ||||
|   characters: | ||||
|  | @ -30,7 +30,7 @@ packages: | |||
|     description: | ||||
|       name: characters | ||||
|       sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.4.0" | ||||
|   clock: | ||||
|  | @ -38,7 +38,7 @@ packages: | |||
|     description: | ||||
|       name: clock | ||||
|       sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.1.2" | ||||
|   collection: | ||||
|  | @ -46,7 +46,7 @@ packages: | |||
|     description: | ||||
|       name: collection | ||||
|       sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.19.1" | ||||
|   connectivity_plus: | ||||
|  | @ -54,7 +54,7 @@ packages: | |||
|     description: | ||||
|       name: connectivity_plus | ||||
|       sha256: "051849e2bd7c7b3bc5844ea0d096609ddc3a859890ec3a9ac4a65a2620cc1f99" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "6.1.4" | ||||
|   connectivity_plus_platform_interface: | ||||
|  | @ -62,7 +62,7 @@ packages: | |||
|     description: | ||||
|       name: connectivity_plus_platform_interface | ||||
|       sha256: "42657c1715d48b167930d5f34d00222ac100475f73d10162ddf43e714932f204" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.0.1" | ||||
|   cross_file: | ||||
|  | @ -70,7 +70,7 @@ packages: | |||
|     description: | ||||
|       name: cross_file | ||||
|       sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.3.4+2" | ||||
|   crypto: | ||||
|  | @ -78,7 +78,7 @@ packages: | |||
|     description: | ||||
|       name: crypto | ||||
|       sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.0.6" | ||||
|   csslib: | ||||
|  | @ -86,7 +86,7 @@ packages: | |||
|     description: | ||||
|       name: csslib | ||||
|       sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.0.2" | ||||
|   cupertino_icons: | ||||
|  | @ -94,7 +94,7 @@ packages: | |||
|     description: | ||||
|       name: cupertino_icons | ||||
|       sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.0.8" | ||||
|   dbus: | ||||
|  | @ -102,7 +102,7 @@ packages: | |||
|     description: | ||||
|       name: dbus | ||||
|       sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.7.11" | ||||
|   extended_image: | ||||
|  | @ -110,7 +110,7 @@ packages: | |||
|     description: | ||||
|       name: extended_image | ||||
|       sha256: f6cbb1d798f51262ed1a3d93b4f1f2aa0d76128df39af18ecb77fa740f88b2e0 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "10.0.1" | ||||
|   extended_image_library: | ||||
|  | @ -118,23 +118,23 @@ packages: | |||
|     description: | ||||
|       name: extended_image_library | ||||
|       sha256: "1f9a24d3a00c2633891c6a7b5cab2807999eb2d5b597e5133b63f49d113811fe" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "5.0.1" | ||||
|   fake_async: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: fake_async | ||||
|       sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.3.2" | ||||
|     version: "1.3.3" | ||||
|   ffi: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: ffi | ||||
|       sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.4" | ||||
|   file: | ||||
|  | @ -142,7 +142,7 @@ packages: | |||
|     description: | ||||
|       name: file | ||||
|       sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "7.0.1" | ||||
|   file_selector_linux: | ||||
|  | @ -150,7 +150,7 @@ packages: | |||
|     description: | ||||
|       name: file_selector_linux | ||||
|       sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.9.3+2" | ||||
|   file_selector_macos: | ||||
|  | @ -158,7 +158,7 @@ packages: | |||
|     description: | ||||
|       name: file_selector_macos | ||||
|       sha256: "8c9250b2bd2d8d4268e39c82543bacbaca0fda7d29e0728c3c4bbb7c820fd711" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.9.4+3" | ||||
|   file_selector_platform_interface: | ||||
|  | @ -166,7 +166,7 @@ packages: | |||
|     description: | ||||
|       name: file_selector_platform_interface | ||||
|       sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.6.2" | ||||
|   file_selector_windows: | ||||
|  | @ -174,7 +174,7 @@ packages: | |||
|     description: | ||||
|       name: file_selector_windows | ||||
|       sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.9.3+4" | ||||
|   flutter: | ||||
|  | @ -187,7 +187,7 @@ packages: | |||
|     description: | ||||
|       name: flutter_lints | ||||
|       sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "5.0.0" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|  | @ -195,7 +195,7 @@ packages: | |||
|     description: | ||||
|       name: flutter_plugin_android_lifecycle | ||||
|       sha256: f948e346c12f8d5480d2825e03de228d0eb8c3a737e4cdaa122267b89c022b5e | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.0.28" | ||||
|   flutter_test: | ||||
|  | @ -213,7 +213,7 @@ packages: | |||
|     description: | ||||
|       name: html | ||||
|       sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.15.6" | ||||
|   http: | ||||
|  | @ -221,7 +221,7 @@ packages: | |||
|     description: | ||||
|       name: http | ||||
|       sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.4.0" | ||||
|   http_client_helper: | ||||
|  | @ -229,7 +229,7 @@ packages: | |||
|     description: | ||||
|       name: http_client_helper | ||||
|       sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.0.0" | ||||
|   http_parser: | ||||
|  | @ -237,7 +237,7 @@ packages: | |||
|     description: | ||||
|       name: http_parser | ||||
|       sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "4.1.2" | ||||
|   image_picker: | ||||
|  | @ -245,7 +245,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker | ||||
|       sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.1.2" | ||||
|   image_picker_android: | ||||
|  | @ -253,7 +253,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_android | ||||
|       sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.8.12+23" | ||||
|   image_picker_for_web: | ||||
|  | @ -261,7 +261,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_for_web | ||||
|       sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.0.6" | ||||
|   image_picker_ios: | ||||
|  | @ -269,7 +269,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_ios | ||||
|       sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.8.12+2" | ||||
|   image_picker_linux: | ||||
|  | @ -277,7 +277,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_linux | ||||
|       sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.2.1+2" | ||||
|   image_picker_macos: | ||||
|  | @ -285,7 +285,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_macos | ||||
|       sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.2.1+2" | ||||
|   image_picker_platform_interface: | ||||
|  | @ -293,7 +293,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_platform_interface | ||||
|       sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.10.1" | ||||
|   image_picker_windows: | ||||
|  | @ -301,7 +301,7 @@ packages: | |||
|     description: | ||||
|       name: image_picker_windows | ||||
|       sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.2.1+1" | ||||
|   intl: | ||||
|  | @ -309,7 +309,7 @@ packages: | |||
|     description: | ||||
|       name: intl | ||||
|       sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.20.2" | ||||
|   js: | ||||
|  | @ -317,23 +317,23 @@ packages: | |||
|     description: | ||||
|       name: js | ||||
|       sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.7.2" | ||||
|   leak_tracker: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker | ||||
|       sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "6bb818ecbdffe216e81182c2f0714a2e62b593f4a4f13098713ff1685dfb6ab0" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "10.0.8" | ||||
|     version: "10.0.9" | ||||
|   leak_tracker_flutter_testing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker_flutter_testing | ||||
|       sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.0.9" | ||||
|   leak_tracker_testing: | ||||
|  | @ -341,7 +341,7 @@ packages: | |||
|     description: | ||||
|       name: leak_tracker_testing | ||||
|       sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.0.1" | ||||
|   lints: | ||||
|  | @ -349,7 +349,7 @@ packages: | |||
|     description: | ||||
|       name: lints | ||||
|       sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "5.1.1" | ||||
|   matcher: | ||||
|  | @ -357,7 +357,7 @@ packages: | |||
|     description: | ||||
|       name: matcher | ||||
|       sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.12.17" | ||||
|   material_color_utilities: | ||||
|  | @ -365,7 +365,7 @@ packages: | |||
|     description: | ||||
|       name: material_color_utilities | ||||
|       sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.11.1" | ||||
|   meta: | ||||
|  | @ -373,7 +373,7 @@ packages: | |||
|     description: | ||||
|       name: meta | ||||
|       sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.16.0" | ||||
|   mime: | ||||
|  | @ -381,7 +381,7 @@ packages: | |||
|     description: | ||||
|       name: mime | ||||
|       sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.0.0" | ||||
|   mobile_scanner: | ||||
|  | @ -389,7 +389,7 @@ packages: | |||
|     description: | ||||
|       name: mobile_scanner | ||||
|       sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "7.0.1" | ||||
|   nested: | ||||
|  | @ -397,7 +397,7 @@ packages: | |||
|     description: | ||||
|       name: nested | ||||
|       sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   nm: | ||||
|  | @ -405,7 +405,7 @@ packages: | |||
|     description: | ||||
|       name: nm | ||||
|       sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.5.0" | ||||
|   package_info_plus: | ||||
|  | @ -413,7 +413,7 @@ packages: | |||
|     description: | ||||
|       name: package_info_plus | ||||
|       sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "8.3.0" | ||||
|   package_info_plus_platform_interface: | ||||
|  | @ -421,7 +421,7 @@ packages: | |||
|     description: | ||||
|       name: package_info_plus_platform_interface | ||||
|       sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.2.0" | ||||
|   path: | ||||
|  | @ -429,15 +429,15 @@ packages: | |||
|     description: | ||||
|       name: path | ||||
|       sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.9.1" | ||||
|   path_provider: | ||||
|     dependency: transitive | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: path_provider | ||||
|       sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.5" | ||||
|   path_provider_android: | ||||
|  | @ -445,7 +445,7 @@ packages: | |||
|     description: | ||||
|       name: path_provider_android | ||||
|       sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.2.17" | ||||
|   path_provider_foundation: | ||||
|  | @ -453,7 +453,7 @@ packages: | |||
|     description: | ||||
|       name: path_provider_foundation | ||||
|       sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.1" | ||||
|   path_provider_linux: | ||||
|  | @ -461,7 +461,7 @@ packages: | |||
|     description: | ||||
|       name: path_provider_linux | ||||
|       sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.2.1" | ||||
|   path_provider_platform_interface: | ||||
|  | @ -469,7 +469,7 @@ packages: | |||
|     description: | ||||
|       name: path_provider_platform_interface | ||||
|       sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.2" | ||||
|   path_provider_windows: | ||||
|  | @ -477,7 +477,7 @@ packages: | |||
|     description: | ||||
|       name: path_provider_windows | ||||
|       sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.3.0" | ||||
|   petitparser: | ||||
|  | @ -485,7 +485,7 @@ packages: | |||
|     description: | ||||
|       name: petitparser | ||||
|       sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "6.1.0" | ||||
|   photo_manager: | ||||
|  | @ -493,7 +493,7 @@ packages: | |||
|     description: | ||||
|       name: photo_manager | ||||
|       sha256: a0d9a7a9bc35eda02d33766412bde6d883a8b0acb86bbe37dac5f691a0894e8a | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.7.1" | ||||
|   photo_manager_image_provider: | ||||
|  | @ -501,7 +501,7 @@ packages: | |||
|     description: | ||||
|       name: photo_manager_image_provider | ||||
|       sha256: b6015b67b32f345f57cf32c126f871bced2501236c405aafaefa885f7c821e4f | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.2.0" | ||||
|   photo_view: | ||||
|  | @ -509,7 +509,7 @@ packages: | |||
|     description: | ||||
|       name: photo_view | ||||
|       sha256: "1fc3d970a91295fbd1364296575f854c9863f225505c28c46e0a03e48960c75e" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.15.0" | ||||
|   platform: | ||||
|  | @ -517,7 +517,7 @@ packages: | |||
|     description: | ||||
|       name: platform | ||||
|       sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.1.6" | ||||
|   plugin_platform_interface: | ||||
|  | @ -525,7 +525,7 @@ packages: | |||
|     description: | ||||
|       name: plugin_platform_interface | ||||
|       sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.8" | ||||
|   provider: | ||||
|  | @ -533,7 +533,7 @@ packages: | |||
|     description: | ||||
|       name: provider | ||||
|       sha256: "4abbd070a04e9ddc287673bf5a030c7ca8b685ff70218720abab8b092f53dd84" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "6.1.5" | ||||
|   shared_preferences: | ||||
|  | @ -541,7 +541,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences | ||||
|       sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.5.3" | ||||
|   shared_preferences_android: | ||||
|  | @ -549,7 +549,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_android | ||||
|       sha256: "20cbd561f743a342c76c151d6ddb93a9ce6005751e7aa458baad3858bfbfb6ac" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.10" | ||||
|   shared_preferences_foundation: | ||||
|  | @ -557,7 +557,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_foundation | ||||
|       sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.5.4" | ||||
|   shared_preferences_linux: | ||||
|  | @ -565,7 +565,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_linux | ||||
|       sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.1" | ||||
|   shared_preferences_platform_interface: | ||||
|  | @ -573,7 +573,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_platform_interface | ||||
|       sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.1" | ||||
|   shared_preferences_web: | ||||
|  | @ -581,7 +581,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_web | ||||
|       sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.3" | ||||
|   shared_preferences_windows: | ||||
|  | @ -589,7 +589,7 @@ packages: | |||
|     description: | ||||
|       name: shared_preferences_windows | ||||
|       sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.4.1" | ||||
|   simple_gesture_detector: | ||||
|  | @ -597,7 +597,7 @@ packages: | |||
|     description: | ||||
|       name: simple_gesture_detector | ||||
|       sha256: ba2cd5af24ff20a0b8d609cec3f40e5b0744d2a71804a2616ae086b9c19d19a3 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.2.1" | ||||
|   sky_engine: | ||||
|  | @ -610,7 +610,7 @@ packages: | |||
|     description: | ||||
|       name: source_span | ||||
|       sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.10.1" | ||||
|   stack_trace: | ||||
|  | @ -618,7 +618,7 @@ packages: | |||
|     description: | ||||
|       name: stack_trace | ||||
|       sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.12.1" | ||||
|   stream_channel: | ||||
|  | @ -626,7 +626,7 @@ packages: | |||
|     description: | ||||
|       name: stream_channel | ||||
|       sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.4" | ||||
|   string_scanner: | ||||
|  | @ -634,7 +634,7 @@ packages: | |||
|     description: | ||||
|       name: string_scanner | ||||
|       sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.4.1" | ||||
|   table_calendar: | ||||
|  | @ -642,7 +642,7 @@ packages: | |||
|     description: | ||||
|       name: table_calendar | ||||
|       sha256: "0c0c6219878b363a2d5f40c7afb159d845f253d061dc3c822aa0d5fe0f721982" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.2.0" | ||||
|   term_glyph: | ||||
|  | @ -650,7 +650,7 @@ packages: | |||
|     description: | ||||
|       name: term_glyph | ||||
|       sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.2.2" | ||||
|   test_api: | ||||
|  | @ -658,7 +658,7 @@ packages: | |||
|     description: | ||||
|       name: test_api | ||||
|       sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.7.4" | ||||
|   typed_data: | ||||
|  | @ -666,7 +666,7 @@ packages: | |||
|     description: | ||||
|       name: typed_data | ||||
|       sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.4.0" | ||||
|   vector_math: | ||||
|  | @ -674,7 +674,7 @@ packages: | |||
|     description: | ||||
|       name: vector_math | ||||
|       sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.1.4" | ||||
|   video_player: | ||||
|  | @ -682,7 +682,7 @@ packages: | |||
|     description: | ||||
|       name: video_player | ||||
|       sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.10.0" | ||||
|   video_player_android: | ||||
|  | @ -690,63 +690,95 @@ packages: | |||
|     description: | ||||
|       name: video_player_android | ||||
|       sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.8.7" | ||||
|   video_player_avfoundation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: video_player_avfoundation | ||||
|       sha256: "0d47db6cbf72db61d86369219efd35c7f9d93515e1319da941ece81b1f21c49c" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "9fedd55023249f3a02738c195c906b4e530956191febf0838e37d0dac912f953" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.7.2" | ||||
|     version: "2.8.0" | ||||
|   video_player_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: video_player_platform_interface | ||||
|       sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "6.4.0" | ||||
|   video_player_web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: video_player_web | ||||
|       sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.3.5" | ||||
|     version: "2.4.0" | ||||
|   visibility_detector: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: visibility_detector | ||||
|       sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "0.4.0+2" | ||||
|   vm_service: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: vm_service | ||||
|       sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "14.3.1" | ||||
|     version: "15.0.0" | ||||
|   web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: web | ||||
|       sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.1.1" | ||||
|   webview_flutter: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: webview_flutter | ||||
|       sha256: c3e4fe614b1c814950ad07186007eff2f2e5dd2935eba7b9a9a1af8e5885f1ba | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "4.13.0" | ||||
|   webview_flutter_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_android | ||||
|       sha256: f6e6afef6e234801da77170f7a1847ded8450778caf2fe13979d140484be3678 | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "4.7.0" | ||||
|   webview_flutter_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_platform_interface | ||||
|       sha256: f0dc2dc3a2b1e3a6abdd6801b9355ebfeb3b8f6cde6b9dc7c9235909c4a1f147 | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "2.13.1" | ||||
|   webview_flutter_wkwebview: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_wkwebview | ||||
|       sha256: a3d461fe3467014e05f3ac4962e5fdde2a4bf44c561cb53e9ae5c586600fdbc3 | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "3.22.0" | ||||
|   wechat_assets_picker: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: wechat_assets_picker | ||||
|       sha256: cafe3d32564ed3cacf9822f251941f7b44fe9885c17c8de4fca7e939a459e1ef | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "9.5.1" | ||||
|   wechat_picker_library: | ||||
|  | @ -754,23 +786,23 @@ packages: | |||
|     description: | ||||
|       name: wechat_picker_library | ||||
|       sha256: a42e09cb85b15fc9410f6a69671371cc60aa99c4a1f7967f6593a7f665f6f47a | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.0.5" | ||||
|   win32: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: win32 | ||||
|       sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "5.13.0" | ||||
|     version: "5.14.0" | ||||
|   xdg_directories: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: xdg_directories | ||||
|       sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   xml: | ||||
|  | @ -778,9 +810,9 @@ packages: | |||
|     description: | ||||
|       name: xml | ||||
|       sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 | ||||
|       url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/" | ||||
|       url: "https://pub.flutter-io.cn" | ||||
|     source: hosted | ||||
|     version: "6.5.0" | ||||
| sdks: | ||||
|   dart: ">=3.7.0 <4.0.0" | ||||
|   dart: ">=3.8.0 <4.0.0" | ||||
|   flutter: ">=3.29.0" | ||||
|  |  | |||
|  | @ -50,6 +50,13 @@ dependencies: | |||
|   video_player: ^2.10.0 | ||||
|   #网络监听 | ||||
|   connectivity_plus: ^6.1.4 | ||||
|   #网页页面加载 | ||||
|   webview_flutter: ^4.4.0 | ||||
|   #手写签字 | ||||
| #  signature: ^6.0.0 | ||||
| 
 | ||||
|   path_provider: ^2.0.1 | ||||
| 
 | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|     sdk: flutter | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue