From 2a9895f67ae9dd8f9617a57c3c55b328e3b0ee7d Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Sat, 27 Apr 2024 23:02:44 +0800 Subject: [PATCH] feat:首次启动隐私协议弹窗 --- lib/app/splash_page.dart | 31 ++++++++++++++++++++++++++++++- lib/common/core/app_config_helper.dart | 14 ++++++++++++++ lib/common/core/sp_const.dart | 2 ++ lib/common/widgets/webview_dialog.dart | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 lib/common/widgets/webview_dialog.dart diff --git a/lib/app/splash_page.dart b/lib/app/splash_page.dart index 0aa8159..50d73ff 100644 --- a/lib/app/splash_page.dart +++ b/lib/app/splash_page.dart @@ -16,6 +16,9 @@ import 'package:wow_english/route/route.dart'; import 'package:wow_english/utils/log_util.dart'; import 'package:wow_english/utils/sp_util.dart'; +import '../common/core/app_consts.dart'; +import '../common/widgets/webview_dialog.dart'; + class SplashPage extends StatelessWidget { const SplashPage({super.key}); @@ -72,7 +75,33 @@ class _TransitionViewState extends State { } else { pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); }*/ - pushNamedAndRemoveUntil(AppRouteName.moduleSelect, (route) => false); + bool isAggreementAccepted = AppConfigHelper.getAgreementAccepted(); + if (isAggreementAccepted) { + pushNamedAndRemoveUntil(AppRouteName.moduleSelect, (route) => false); + } else { + showDialog( + context: context, + barrierDismissible: false, + builder: (BuildContext context) { + return WillPopScope( + onWillPop: () => Future.value(false), + child: WebviewDialog( + title: "服务条款及隐私政策", + webUrl: AppConsts.userPrivacyPolicyUrl, + leftTap: () { + AppConfigHelper.saveAgreementAccepted(true); + pushNamedAndRemoveUntil( + AppRouteName.moduleSelect, (route) => false); + }, + rightTap: () { + // 退出应用 + SystemNavigator.pop(); + }, + ), + ); + }, + ); + } }); } diff --git a/lib/common/core/app_config_helper.dart b/lib/common/core/app_config_helper.dart index 56c64d1..18e0ded 100644 --- a/lib/common/core/app_config_helper.dart +++ b/lib/common/core/app_config_helper.dart @@ -3,9 +3,11 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:wow_english/common/core/sp_const.dart'; import 'package:wow_english/common/core/user_util.dart'; import '../../models/app_config_entity.dart'; +import '../../utils/sp_util.dart'; import '../request/dao/system_dao.dart'; class AppConfigHelper { @@ -41,4 +43,16 @@ class AppConfigHelper { debugPrint('versionName=$versionName versionCode=$versionCode platForm=${Platform.operatingSystem}'); return versionCode; } + + static void saveAgreementAccepted(bool accepted) { + SpUtil.getInstance().setData(SpConst.prefsKeyAgreementAccepted, accepted); + } + + static bool getAgreementAccepted() { + return SpUtil.getInstance().get(SpConst.prefsKeyAgreementAccepted) ?? false; + } + + static void _clearUserData() { + SpUtil.getInstance().remove(SpConst.prefsKeyAgreementAccepted); + } } diff --git a/lib/common/core/sp_const.dart b/lib/common/core/sp_const.dart index 608f51f..547e52a 100644 --- a/lib/common/core/sp_const.dart +++ b/lib/common/core/sp_const.dart @@ -1,3 +1,5 @@ class SpConst { static const String prefsKeyUserInfo = "key_user_info"; + + static const String prefsKeyAgreementAccepted = "privacy_agreement_accepted"; } diff --git a/lib/common/widgets/webview_dialog.dart b/lib/common/widgets/webview_dialog.dart new file mode 100644 index 0000000..b05a4cf --- /dev/null +++ b/lib/common/widgets/webview_dialog.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class WebviewDialog extends StatelessWidget { + final String title; + final String webUrl; + final VoidCallback leftTap; + final VoidCallback rightTap; + + const WebviewDialog( + {super.key, + required this.title, + required this.webUrl, + required this.leftTap, + required this.rightTap}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Center( + child: Text(title), + ), + content: SizedBox( + width: MediaQuery.of(context).size.height - 100, + height: MediaQuery.of(context).size.width - 100, + child: FutureBuilder( + // 异步方法 + future: buildWebViewController(webUrl), + builder: (context, snapshot) { + // 等待状态显示的widget + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator(), + ); + // 错误时显示的widget + } else if (snapshot.hasError) { + return const Text('Error'); + } else { + return snapshot.data ?? const Text('No data'); + } + })), + actions: [ + TextButton( + child: + const Text('同意并继续', style: TextStyle(color: Color(0xFFFBB621))), + onPressed: () { + // 处理接受按钮的点击事件 + leftTap(); // 关闭对话框 + }, + ), + TextButton( + child: const Text('不同意,退出应用'), + onPressed: () { + // 处理拒绝按钮的点击事件 + rightTap(); // 关闭对话框 + }, + ), + ], + ); + } + + Future buildWebViewController(String url) async { + Widget res; + try { + WebViewController controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setBackgroundColor(const Color(0x00000000)) + ..setNavigationDelegate( + NavigationDelegate( + onProgress: (int progress) { + // Update loading bar. + }, + onPageStarted: (String url) { + EasyLoading.show(); + }, + onPageFinished: (String url) { + EasyLoading.dismiss(); + }, + onWebResourceError: (WebResourceError error) { + EasyLoading.showError(error.description); + }, + onNavigationRequest: (NavigationRequest request) { + return NavigationDecision.navigate; + }, + ), + ); + await controller.loadRequest(Uri.parse(url)); + res = WebViewWidget(controller: controller); + } catch (error) { + res = Text("加载失败:${error.toString()}"); + debugPrint("WebViewController加载失败:${error.toString()}"); + } + return res; + } +} -- libgit2 0.22.2