parent
							
								
									dc89f7039f
								
							
						
					
					
						commit
						c73c8b8bc5
					
				|  | @ -491,9 +491,9 @@ | |||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | ||||
| 				CODE_SIGN_IDENTITY = "Apple Development"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				CODE_SIGN_STYLE = Manual; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				CURRENT_PROJECT_VERSION = 59; | ||||
| 				DEVELOPMENT_TEAM = ""; | ||||
| 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8AKCJ9LW7D; | ||||
| 				ENABLE_BITCODE = NO; | ||||
|  | @ -503,10 +503,11 @@ | |||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				MARKETING_VERSION = 2.2.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = uni.UNI85F7A17; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq-des"; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
|  | @ -685,9 +686,9 @@ | |||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | ||||
| 				CODE_SIGN_IDENTITY = "Apple Development"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				CODE_SIGN_STYLE = Manual; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				CURRENT_PROJECT_VERSION = 59; | ||||
| 				DEVELOPMENT_TEAM = ""; | ||||
| 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8AKCJ9LW7D; | ||||
| 				ENABLE_BITCODE = NO; | ||||
|  | @ -697,10 +698,11 @@ | |||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				MARKETING_VERSION = 2.2.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = uni.UNI85F7A17; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq-des"; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
|  | @ -716,9 +718,9 @@ | |||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | ||||
| 				CODE_SIGN_IDENTITY = "Apple Development"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				CODE_SIGN_STYLE = Manual; | ||||
| 				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; | ||||
| 				CURRENT_PROJECT_VERSION = 59; | ||||
| 				DEVELOPMENT_TEAM = ""; | ||||
| 				"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 8AKCJ9LW7D; | ||||
| 				ENABLE_BITCODE = NO; | ||||
|  | @ -728,10 +730,11 @@ | |||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				MARKETING_VERSION = 2.2.0; | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = uni.UNI85F7A17; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				PROVISIONING_PROFILE_SPECIFIER = ""; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq-des"; | ||||
| 				"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "qa-zsaq"; | ||||
| 				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
|  |  | |||
|  | @ -20,12 +20,12 @@ | |||
| 	<string>$(FLUTTER_BUILD_NAME)</string> | ||||
| 	<key>CFBundleSignature</key> | ||||
| 	<string>????</string> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
| 	<key>LSApplicationQueriesSchemes</key> | ||||
| 	<array> | ||||
| 		<string>baidumap</string> | ||||
| 	</array> | ||||
| 	<key>CFBundleVersion</key> | ||||
| 	<string>$(FLUTTER_BUILD_NUMBER)</string> | ||||
| 	<key>LSRequiresIPhoneOS</key> | ||||
| 	<true/> | ||||
| 	<key>NFCReaderUsageDescription</key> | ||||
|  | @ -77,17 +77,10 @@ | |||
| 	<false/> | ||||
| 	<key>UISupportedInterfaceOrientations</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||
| 	<array> | ||||
| 		<string>UIInterfaceOrientationPortrait</string> | ||||
| 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||
| 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||
| 	</array> | ||||
| 	<key>com.apple.developer.nfc.readersession.formats</key> | ||||
| 	<array> | ||||
|  |  | |||
|  | @ -2,8 +2,10 @@ import 'package:flutter/material.dart'; | |||
| import '../tools/tools.dart'; | ||||
| 
 | ||||
| /// 通用列表卡片组件: | ||||
| /// - 两两为一组,优先尝试同一行显示左右两列并左/右对齐; | ||||
| /// - 如放不下,则自动拆成两行,上行左对齐,下行右对齐。 | ||||
| /// - 两两为一组,固定左右布局,平均分配宽度 | ||||
| /// - 左侧文字左对齐,右侧文字右对齐 | ||||
| /// - 文字过多时各自自动换行 | ||||
| /// - 如果一行只有一个元素,靠左显示 | ||||
| class DannerRepainItem extends StatelessWidget { | ||||
|   final String title; | ||||
|   final List<String> details; | ||||
|  | @ -50,70 +52,12 @@ class DannerRepainItem extends StatelessWidget { | |||
|             ), | ||||
|             const Divider(height: 1), | ||||
| 
 | ||||
|             // — 详情区:动态两列/换行 — | ||||
|             // — 详情区:固定左右布局 — | ||||
|             Padding( | ||||
|               padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15), | ||||
|               child: LayoutBuilder(builder: (context, constraints) { | ||||
|                 // 间距:你可以根据设计随意调整 | ||||
|                 const double horizontalGap = 20; | ||||
|                 const double verticalGap = 5; | ||||
| 
 | ||||
|                 List<Widget> rows = []; | ||||
|                 for (int i = 0; i < details.length; i += 2) { | ||||
|                   final left = details[i]; | ||||
|                   final right = (i + 1 < details.length) ? details[i + 1] : ''; | ||||
| 
 | ||||
|                   // 测量文字宽度 | ||||
|                   final leftPainter = TextPainter( | ||||
|                     text: TextSpan(text: left, style: HhTextStyleUtils.secondaryTitleStyle), | ||||
|                     maxLines: 1, | ||||
|                     textDirection: TextDirection.ltr, | ||||
|                   )..layout(); | ||||
|                   final rightPainter = TextPainter( | ||||
|                     text: TextSpan(text: right, style: HhTextStyleUtils.secondaryTitleStyle), | ||||
|                     maxLines: 1, | ||||
|                     textDirection: TextDirection.ltr, | ||||
|                   )..layout(); | ||||
| 
 | ||||
|                   final canFitOneLine = right.isNotEmpty && | ||||
|                       (leftPainter.width + horizontalGap + rightPainter.width) | ||||
|                           <= constraints.maxWidth; | ||||
| 
 | ||||
|                   if (right.isNotEmpty && canFitOneLine) { | ||||
|                     // 同行显示,左右对齐 | ||||
|                     rows.add(Padding( | ||||
|                       padding: EdgeInsets.only(bottom: verticalGap), | ||||
|                       child: Row( | ||||
|                         mainAxisAlignment: MainAxisAlignment.spaceBetween, | ||||
|                         children: [ | ||||
|                           _DetailText(left), | ||||
|                           _DetailText(right), | ||||
|                         ], | ||||
|                       ), | ||||
|                     )); | ||||
|                   } else { | ||||
|                     // 拆为两行 | ||||
|                     rows.add(Padding( | ||||
|                       padding: EdgeInsets.only(bottom: verticalGap), | ||||
|                       child: Column( | ||||
|                         crossAxisAlignment: CrossAxisAlignment.stretch, | ||||
|                         children: [ | ||||
|                           // 上行:左对齐 | ||||
|                           _DetailText(left), | ||||
|                           if (right.isNotEmpty) | ||||
|                           // 下行:右对齐 | ||||
|                             Align( | ||||
|                               alignment: Alignment.centerRight, | ||||
|                               child: _DetailText(right), | ||||
|                             ), | ||||
|                         ], | ||||
|                       ), | ||||
|                     )); | ||||
|                   } | ||||
|                 } | ||||
| 
 | ||||
|                 return Column(children: rows); | ||||
|               }), | ||||
|               child: Column( | ||||
|                 children: _buildDetailRows(), | ||||
|               ), | ||||
|             ), | ||||
| 
 | ||||
|             // — 底部标签区 — | ||||
|  | @ -127,21 +71,86 @@ class DannerRepainItem extends StatelessWidget { | |||
|       ), | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   // 构建详情行 | ||||
|   List<Widget> _buildDetailRows() { | ||||
|     List<Widget> rows = []; | ||||
|     for (int i = 0; i < details.length; i += 2) { | ||||
|       final left = details[i]; | ||||
|       final right = (i + 1 < details.length) ? details[i + 1] : ''; | ||||
| 
 | ||||
|       rows.add( | ||||
|         Padding( | ||||
|           padding: const EdgeInsets.only(bottom: 8), | ||||
|           child: _DetailRow(left: left, right: right), | ||||
|         ), | ||||
|       ); | ||||
|     } | ||||
|     return rows; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// Detail 文本封装: | ||||
| /// 默认一行不换行;若超出则让整个组件撑宽,由外层判断拆行。 | ||||
| /// 详情行组件:固定左右布局,平均分配宽度,各自换行 | ||||
| /// 如果只有左侧文本,则靠左显示 | ||||
| class _DetailRow extends StatelessWidget { | ||||
|   final String left; | ||||
|   final String right; | ||||
| 
 | ||||
|   const _DetailRow({ | ||||
|     Key? key, | ||||
|     required this.left, | ||||
|     required this.right, | ||||
|   }) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     // 如果右侧文本为空,只显示左侧文本,靠左显示 | ||||
|     if (right.isEmpty) { | ||||
|       return Align( | ||||
|         alignment: Alignment.centerLeft, | ||||
|         child: _DetailText(left, textAlign: TextAlign.left), | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     return Row( | ||||
|       crossAxisAlignment: CrossAxisAlignment.start, | ||||
|       children: [ | ||||
|         // 左侧文本 - 占50%宽度 | ||||
|         Expanded( | ||||
|           flex: 1, | ||||
|           child: _DetailText(left, textAlign: TextAlign.left), | ||||
|         ), | ||||
| 
 | ||||
|         // 中间间距 | ||||
|         const SizedBox(width: 10), | ||||
| 
 | ||||
|         // 右侧文本 - 占50%宽度 | ||||
|         Expanded( | ||||
|           flex: 1, | ||||
|           child: _DetailText(right, textAlign: TextAlign.right), | ||||
|         ), | ||||
|       ], | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// Detail 文本封装:支持自动换行和指定的对齐方式 | ||||
| class _DetailText extends StatelessWidget { | ||||
|   final String text; | ||||
|   const _DetailText(this.text, {Key? key}) : super(key: key); | ||||
|   final TextAlign textAlign; | ||||
| 
 | ||||
|   const _DetailText(this.text, { | ||||
|     Key? key, | ||||
|     required this.textAlign, | ||||
|   }) : super(key: key); | ||||
| 
 | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Text( | ||||
|       text, | ||||
|       style: HhTextStyleUtils.secondaryTitleStyle, | ||||
|       softWrap: false, | ||||
|       overflow: TextOverflow.visible, | ||||
|       softWrap: true, // 允许换行 | ||||
|       textAlign: textAlign, // 使用指定的对齐方式 | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|  | @ -247,7 +247,6 @@ class HomePageState extends State<HomePage> { | |||
|     // 拉取其他数据 + 隐患列表(当 hiddenList 为空时显示 loading,否则不显示) | ||||
|     _fetchData(); | ||||
|    _fetchHiddenList(showLoading: hiddenList.isEmpty); | ||||
|     fetchAndSaveBd09(context); | ||||
|     /// 清单列表 | ||||
|     final data = await ApiService.getListData(); | ||||
|     if (data['result'] == 'success') { | ||||
|  | @ -258,6 +257,7 @@ class HomePageState extends State<HomePage> { | |||
|         } | ||||
|       } | ||||
|     } | ||||
|     fetchAndSaveBd09(context); | ||||
|   } | ||||
| 
 | ||||
|   Future<void> _onRefresh() async { | ||||
|  |  | |||
|  | @ -260,84 +260,87 @@ class _LoginPageState extends State<LoginPage> { | |||
| 
 | ||||
|                       Padding( | ||||
|                         padding: const EdgeInsets.only(bottom: 10), | ||||
|                         child: Row( | ||||
|                           children: [ | ||||
|                             Checkbox( | ||||
|                               value: _agreed, | ||||
|                               activeColor: Colors.white, | ||||
|                               checkColor: Colors.blueAccent, | ||||
|                               side: const BorderSide(color: Colors.white), | ||||
|                               onChanged:(value) { | ||||
|                                 setState(() { | ||||
|                                   _agreed = value??false; | ||||
|                                 }); | ||||
|                         child: Center( // 关键:把 Row 放到 Center 中 | ||||
|                           child: Row( | ||||
|                             mainAxisSize: MainAxisSize.min, // Row 根据子项宽度自适应,不再铺满父宽度 | ||||
|                             crossAxisAlignment: CrossAxisAlignment.center, | ||||
|                             children: [ | ||||
|                               Checkbox( | ||||
|                                 value: _agreed, | ||||
|                                 activeColor: Colors.white, | ||||
|                                 checkColor: Colors.blueAccent, | ||||
|                                 side: const BorderSide(color: Colors.white), | ||||
|                                 onChanged: (value) { | ||||
|                                   setState(() { | ||||
|                                     _agreed = value ?? false; | ||||
|                                   }); | ||||
|                                 }, | ||||
|                               ), | ||||
| 
 | ||||
|                               }, | ||||
|                                   // (v) => setState(() => _agreed = v ?? false), | ||||
|                             ), | ||||
|                             Expanded( | ||||
|                               child: RichText( | ||||
|                                 text: TextSpan( | ||||
|                                   children: [ | ||||
|                                     TextSpan( | ||||
|                                       text: '我已阅读并同意', | ||||
|                                       style: const TextStyle( | ||||
|                                         color: Colors.white, | ||||
|                                         fontSize: 12, | ||||
|                               // 用 Flexible 而非 Expanded,且给 RichText 一个居中对齐 | ||||
|                               Flexible( | ||||
|                                 fit: FlexFit.loose, | ||||
|                                 child: RichText( | ||||
|                                   textAlign: TextAlign.center, // 使文本在它的可用宽度内居中 | ||||
|                                   text: TextSpan( | ||||
|                                     children: [ | ||||
|                                       const TextSpan( | ||||
|                                         text: '我已阅读并同意', | ||||
|                                         style: TextStyle( | ||||
|                                           color: Colors.white, | ||||
|                                           fontSize: 12, | ||||
|                                         ), | ||||
|                                       ), | ||||
|                                     ), | ||||
|                                     TextSpan( | ||||
|                                       text: '《服务协议》', | ||||
|                                       style: const TextStyle( | ||||
|                                         color: Color(0xFF0D1D8C), | ||||
|                                         fontSize: 12, | ||||
|                                       TextSpan( | ||||
|                                         text: '《服务协议》', | ||||
|                                         style: const TextStyle( | ||||
|                                           color: Color(0xFF0D1D8C), | ||||
|                                           fontSize: 12, | ||||
|                                         ), | ||||
|                                         recognizer: TapGestureRecognizer() | ||||
|                                           ..onTap = () { | ||||
|                                             pushPage( | ||||
|                                               const WebViewPage( | ||||
|                                                 name: "用户服务协议", | ||||
|                                                 url: 'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', | ||||
|                                               ), | ||||
|                                               context, | ||||
|                                             ); | ||||
|                                           }, | ||||
|                                       ), | ||||
|                                       recognizer: | ||||
|                                           TapGestureRecognizer() | ||||
|                                             ..onTap = () { | ||||
|                                               pushPage( | ||||
|                                                 const WebViewPage( | ||||
|                                                   name: "用户服务协议", | ||||
|                                                   url: | ||||
|                                                       'http://47.92.102.56:7811/file/xieyi/zsyhxy.htm', // 替换为目标网址 | ||||
|                                                 ), | ||||
|                                                 context, | ||||
|                                               ); | ||||
|                                             }, | ||||
|                                     ), | ||||
|                                     TextSpan( | ||||
|                                       text: '和', | ||||
|                                       style: const TextStyle( | ||||
|                                         color: Colors.white, | ||||
|                                         fontSize: 12, | ||||
|                                       const TextSpan( | ||||
|                                         text: '和', | ||||
|                                         style: TextStyle( | ||||
|                                           color: Colors.white, | ||||
|                                           fontSize: 12, | ||||
|                                         ), | ||||
|                                       ), | ||||
|                                     ), | ||||
|                                     TextSpan( | ||||
|                                       text: '《隐私政策》', | ||||
|                                       style: const TextStyle( | ||||
|                                         color: Color(0xFF0D1D8C), | ||||
|                                         fontSize: 12, | ||||
|                                       TextSpan( | ||||
|                                         text: '《隐私政策》', | ||||
|                                         style: const TextStyle( | ||||
|                                           color: Color(0xFF0D1D8C), | ||||
|                                           fontSize: 12, | ||||
|                                         ), | ||||
|                                         recognizer: TapGestureRecognizer() | ||||
|                                           ..onTap = () { | ||||
|                                             pushPage( | ||||
|                                               const WebViewPage( | ||||
|                                                 name: "隐私政策", | ||||
|                                                 url: 'http://47.92.102.56:7811/file/xieyi/zsysq.htm', | ||||
|                                               ), | ||||
|                                               context, | ||||
|                                             ); | ||||
|                                           }, | ||||
|                                       ), | ||||
|                                       recognizer: | ||||
|                                           TapGestureRecognizer() | ||||
|                                             ..onTap = () { | ||||
|                                               pushPage( | ||||
|                                                 const WebViewPage( | ||||
|                                                   name: "隐私政策", | ||||
|                                                   url: | ||||
|                                                       'http://47.92.102.56:7811/file/xieyi/zsysq.htm', // 替换为目标网址 | ||||
|                                                 ), | ||||
|                                                 context, | ||||
|                                               ); | ||||
|                                             }, | ||||
|                                     ), | ||||
|                                   ], | ||||
|                                     ], | ||||
|                                   ), | ||||
|                                 ), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ], | ||||
|                             ], | ||||
|                           ), | ||||
|                         ), | ||||
|                       ), | ||||
| 
 | ||||
|                     ], | ||||
|                   ), | ||||
|                 // ), | ||||
|  |  | |||
|  | @ -622,6 +622,7 @@ Future<void> openAppStore() async { | |||
| 
 | ||||
|   if (await canLaunchUrl(uri)) { | ||||
|     await launchUrl(uri, mode: LaunchMode.externalApplication); | ||||
|     exit(0); | ||||
|   } else { | ||||
|     // 回退到 https 链接(在浏览器中打开 App Store 页面) | ||||
|     final Uri webUri = Uri.parse('https://itunes.apple.com/app/id$appId'); | ||||
|  | @ -630,5 +631,6 @@ Future<void> openAppStore() async { | |||
|     } else { | ||||
|       throw 'Could not launch App Store for app id $appId'; | ||||
|     } | ||||
|     exit(0); | ||||
|   } | ||||
| } | ||||
|  | @ -150,10 +150,7 @@ class _DownloadProgressDialogState extends State<DownloadProgressDialog> { | |||
|           ], | ||||
|         ), | ||||
|         actions: [ | ||||
|           TextButton( | ||||
|             onPressed: _onCancel, | ||||
|             child: const Text('取消'), | ||||
|           ), | ||||
| 
 | ||||
|         ], | ||||
|       ), | ||||
|     ); | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | |||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||
| # In Windows, build-name is used as the major, minor, and patch parts | ||||
| # of the product and file versions while build-number is used as the build suffix. | ||||
| version: 2.2.0+59 | ||||
| version: 2.2.1+60 | ||||
| 
 | ||||
| environment: | ||||
|   sdk: ^3.7.0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue