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