From 2fcb288a5097ee2af920de2844dd3e968e64ef03 Mon Sep 17 00:00:00 2001 From: hs <873121290@qq.com> Date: Fri, 19 Sep 2025 17:59:47 +0800 Subject: [PATCH] -----------2.2.1---- --- ios/Runner.xcodeproj/project.pbxproj | 21 ++-- ios/Runner/Info.plist | 11 +- lib/customWidget/danner_repain_item.dart | 149 ++++++++++++----------- lib/pages/home/home_page.dart | 2 +- lib/pages/login_page.dart | 141 ++++++++++----------- lib/tools/tools.dart | 2 + lib/tools/update/update_dialogs.dart | 5 +- pubspec.yaml | 2 +- 8 files changed, 170 insertions(+), 163 deletions(-) diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2cb156a..2a0f2fa 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -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"; diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 100c097..e5556b3 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -20,12 +20,12 @@ $(FLUTTER_BUILD_NAME) CFBundleSignature ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) LSApplicationQueriesSchemes baidumap - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS NFCReaderUsageDescription @@ -77,17 +77,10 @@ UISupportedInterfaceOrientations - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight com.apple.developer.nfc.readersession.formats diff --git a/lib/customWidget/danner_repain_item.dart b/lib/customWidget/danner_repain_item.dart index d22be3b..6046680 100644 --- a/lib/customWidget/danner_repain_item.dart +++ b/lib/customWidget/danner_repain_item.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import '../tools/tools.dart'; /// 通用列表卡片组件: -/// - 两两为一组,优先尝试同一行显示左右两列并左/右对齐; -/// - 如放不下,则自动拆成两行,上行左对齐,下行右对齐。 +/// - 两两为一组,固定左右布局,平均分配宽度 +/// - 左侧文字左对齐,右侧文字右对齐 +/// - 文字过多时各自自动换行 +/// - 如果一行只有一个元素,靠左显示 class DannerRepainItem extends StatelessWidget { final String title; final List 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 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 _buildDetailRows() { + List 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, // 使用指定的对齐方式 ); } -} +} \ No newline at end of file diff --git a/lib/pages/home/home_page.dart b/lib/pages/home/home_page.dart index 0f8f43d..004f4ba 100644 --- a/lib/pages/home/home_page.dart +++ b/lib/pages/home/home_page.dart @@ -247,7 +247,6 @@ class HomePageState extends State { // 拉取其他数据 + 隐患列表(当 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 { } } } + fetchAndSaveBd09(context); } Future _onRefresh() async { diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index 0dcfb3e..141fa3a 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -260,84 +260,87 @@ class _LoginPageState extends State { 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, - ); - }, - ), - ], + ], + ), ), ), - ), - ], + ], + ), ), ), + ], ), // ), diff --git a/lib/tools/tools.dart b/lib/tools/tools.dart index 51993f1..96d7f43 100644 --- a/lib/tools/tools.dart +++ b/lib/tools/tools.dart @@ -622,6 +622,7 @@ Future 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 openAppStore() async { } else { throw 'Could not launch App Store for app id $appId'; } + exit(0); } } \ No newline at end of file diff --git a/lib/tools/update/update_dialogs.dart b/lib/tools/update/update_dialogs.dart index 506a201..ff651ed 100644 --- a/lib/tools/update/update_dialogs.dart +++ b/lib/tools/update/update_dialogs.dart @@ -150,10 +150,7 @@ class _DownloadProgressDialogState extends State { ], ), actions: [ - TextButton( - onPressed: _onCancel, - child: const Text('取消'), - ), + ], ), ); diff --git a/pubspec.yaml b/pubspec.yaml index 647262f..7086617 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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