Browse Source

feat(splash): 添加隐私政策同意功能及界面组件

在闪屏页添加隐私政策同意功能,包括状态管理、存储和界面组件。用户需要同意隐私政策才能继续使用应用,并可通过复选框和链接查看详细内容。
newdev_shunjiawei
lxm 1 year ago
parent
commit
fc01d8909f
  1. 16
      lib/modules/splash/controllers/splash_controller.dart
  2. 115
      lib/modules/splash/views/splash_view.dart

16
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<bool>('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<bool> _checkAndRequestPrivacy() async {
if (_storage.read<bool>('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);
},

115
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<SplashController> {
const SplashView({Key? key}) : super(key: key);
@ -39,6 +40,14 @@ class SplashView extends GetView<SplashController> {
),
),
// 隐私政策组件 - 添加在底部
Positioned(
bottom: 90.h,
left: 0,
right: 0,
child: _buildTermsAndPrivacy(isDarkMode),
),
// 版本号
//_buildVersionInfo(isDarkMode),
],
@ -206,6 +215,112 @@ class SplashView extends GetView<SplashController> {
);
}
// 用户协议和隐私政策
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) {

Loading…
Cancel
Save