diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index 4da069bc9..d629117f2 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -27,12 +27,20 @@ class SplashController extends GetxController { final _loadingProgress = 0.0.obs; double get loadingProgress => _loadingProgress.value; + // 隐私政策同意状态 - 新增 + final _hasAcceptedPrivacy = false.obs; + RxBool get hasAcceptedPrivacy => _hasAcceptedPrivacy; + // 使用一个反应式变量来决定是否可以导航,替代所有布尔标记 final _canNavigate = false.obs; @override void onInit() { super.onInit(); + // 初始化隐私政策状态 + _hasAcceptedPrivacy.value = + _storage.read('hasAcceptedPrivacy') ?? false; + // 监听 _canNavigate 状态,一旦为 true,立即且仅执行一次导航 once(_canNavigate, (_) => _navigateToTargetPage()); // 启动整个初始化流程 @@ -59,10 +67,17 @@ class SplashController extends GetxController { _canNavigate.value = true; } + /// 切换隐私政策同意状态 - 新增方法 + void togglePrivacyAcceptance() { + _hasAcceptedPrivacy.value = !_hasAcceptedPrivacy.value; + _storage.write('hasAcceptedPrivacy', _hasAcceptedPrivacy.value); + } + /// 检查隐私政策,如果未同意,则显示弹窗并等待用户操作 /// 返回用户是否同意 Future _checkAndRequestPrivacy() async { if (_storage.read('hasAcceptedPrivacy') ?? false) { + _hasAcceptedPrivacy.value = true; return true; } @@ -71,6 +86,7 @@ class SplashController extends GetxController { PrivacyPolicyDialog.show( onAccept: () { _storage.write('hasAcceptedPrivacy', true); + _hasAcceptedPrivacy.value = true; Get.back(); // 关闭弹窗 if (!completer.isCompleted) completer.complete(true); }, diff --git a/lib/modules/splash/views/splash_view.dart b/lib/modules/splash/views/splash_view.dart index 815d11f6f..71457e362 100644 --- a/lib/modules/splash/views/splash_view.dart +++ b/lib/modules/splash/views/splash_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/splash_controller.dart'; +import '../../common/webview_page.dart'; class SplashView extends GetView { const SplashView({Key? key}) : super(key: key); @@ -39,6 +40,14 @@ class SplashView extends GetView { ), ), + // 隐私政策组件 - 添加在底部 + Positioned( + bottom: 90.h, + left: 0, + right: 0, + child: _buildTermsAndPrivacy(isDarkMode), + ), + // 版本号 //_buildVersionInfo(isDarkMode), ], @@ -206,6 +215,112 @@ class SplashView extends GetView { ); } + // 用户协议和隐私政策 + Widget _buildTermsAndPrivacy(bool isDarkMode) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 将勾选框和文本包装在 GestureDetector 中 + GestureDetector( + onTap: () => controller.togglePrivacyAcceptance(), + behavior: HitTestBehavior.opaque, // 确保透明区域也能响应点击 + child: Row( + children: [ + SizedBox( + width: 12.w, + height: 16.w, + child: Transform.scale( + scale: 0.7, + child: Obx(() => Checkbox( + value: controller.hasAcceptedPrivacy.value, + onChanged: (value) => controller + .hasAcceptedPrivacy.value = value ?? false, + activeColor: const Color(0xFF3B82F6), + materialTapTargetSize: + MaterialTapTargetSize.shrinkWrap, + visualDensity: VisualDensity.compact, + side: BorderSide( + width: 1.6, + color: Colors.grey[600]!, + ), + )), + ), + ), + SizedBox(width: 4.w), + Text( + 'expressConsent'.tr, // 登录/注册即表示你同意 + style: TextStyle( + fontSize: 13.sp, + color: isDarkMode ? Colors.grey[400] : Colors.grey[700], + ), + ), + ], + ), + ), + ], + ), + //SizedBox(height: 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GestureDetector( + onTap: () { + String url = 'https://www.voitrans.net/doc/yhxy.html'; // 用户协议链接 + if (Get.locale?.languageCode != 'zh' || + Get.locale?.countryCode != 'CN') { + url = 'https://www.voitrans.net/doc/yhxy_en.html'; // 用户协议英文链接 + } + Get.to(() => WebViewPage( + url: url, + title: 'userAgreement'.tr, + )); + }, + child: Text( + 'userAgreement'.tr, // 《用户协议》 + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xFF3B82F6), + ), + ), + ), + Text( + 'and'.tr, // 和 + style: TextStyle( + fontSize: 12.sp, + color: isDarkMode ? Colors.grey[500] : Colors.grey[600], + ), + ), + GestureDetector( + onTap: () { + String url = 'https://www.voitrans.net/doc/ysxy.html'; // 隐私政策链接 + + if (Get.locale?.languageCode != 'zh' || + Get.locale?.countryCode != 'CN') { + url = 'https://www.voitrans.net/doc/ysxy_en.html'; // 隐私政策英文链接 + } + + Get.to(() => WebViewPage( + url: url, + title: 'privacyPolicy'.tr, + )); + }, + child: Text( + 'privacyPolicy'.tr, // 《隐私政策》 + style: TextStyle( + fontSize: 12.sp, + color: const Color(0xFF3B82F6), + ), + ), + ), + ], + ), + ], + ); + } + // 版本信息 // 暂时不需要版本号显示,保留代码以备将来使用 // Widget _buildVersionInfo(bool isDarkMode) {