|
|
@@ -0,0 +1,236 @@
|
|
|
+import 'package:flutter/gestures.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
|
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
+import 'package:location/module/browser/browser_view.dart';
|
|
|
+import 'package:location/resource/assets.gen.dart';
|
|
|
+import 'package:location/resource/colors.gen.dart';
|
|
|
+import 'package:location/resource/string.gen.dart';
|
|
|
+import 'package:location/utils/common_expand.dart';
|
|
|
+import '../data/consts/web_url.dart';
|
|
|
+
|
|
|
+class AgreementDialog {
|
|
|
+ static final tag = "AgreementDialog";
|
|
|
+
|
|
|
+ static void show(
|
|
|
+ {required VoidCallback cancelClick, required VoidCallback sureClick}) {
|
|
|
+ SmartDialog.show(
|
|
|
+ tag: tag,
|
|
|
+ backDismiss: false,
|
|
|
+ builder: (_) {
|
|
|
+ return _AgreementDialog(cancelClick, sureClick);
|
|
|
+ },
|
|
|
+ clickMaskDismiss: false,
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ static void dismiss() {
|
|
|
+ SmartDialog.dismiss(tag: tag);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class _AgreementDialog extends Dialog {
|
|
|
+ final RxBool isFirstStep = true.obs;
|
|
|
+
|
|
|
+ final VoidCallback cancelClick;
|
|
|
+ final VoidCallback sureClick;
|
|
|
+
|
|
|
+ _AgreementDialog(this.cancelClick, this.sureClick);
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return Container(
|
|
|
+ width: 300.w,
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: Colors.white,
|
|
|
+ borderRadius: BorderRadius.circular(8.w),
|
|
|
+ ),
|
|
|
+ child: IntrinsicHeight(
|
|
|
+ child: Stack(
|
|
|
+ children: [
|
|
|
+ Column(children: [
|
|
|
+ SizedBox(height: 24.w),
|
|
|
+ Text(StringName.privacyTitle,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 17.sp,
|
|
|
+ color: '#202020'.color,
|
|
|
+ fontWeight: FontWeight.bold)),
|
|
|
+ SizedBox(height: 16.w),
|
|
|
+ Container(
|
|
|
+ margin: EdgeInsets.symmetric(horizontal: 24.w),
|
|
|
+ child: Obx(() {
|
|
|
+ if (isFirstStep.value) {
|
|
|
+ return oneStepContentRichText();
|
|
|
+ } else {
|
|
|
+ return twoStepContentRichText();
|
|
|
+ }
|
|
|
+ })),
|
|
|
+ SizedBox(height: 28.w),
|
|
|
+ Row(
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
+ children: [
|
|
|
+ Obx(() {
|
|
|
+ return cancelText(
|
|
|
+ isFirstStep.value
|
|
|
+ ? StringName.privacyDisagree
|
|
|
+ : StringName.privacyDisagreeAndExit,
|
|
|
+ () => cancel());
|
|
|
+ }),
|
|
|
+ SizedBox(width: 16.w),
|
|
|
+ sureText(StringName.privacyAgree, () {
|
|
|
+ sureClick();
|
|
|
+ })
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ SizedBox(height: 24.w)
|
|
|
+ ]),
|
|
|
+ Positioned(
|
|
|
+ top: 12.w,
|
|
|
+ right: 12.w,
|
|
|
+ child: GestureDetector(
|
|
|
+ onTap: () => cancel(),
|
|
|
+ child: Assets.images.iconAgreementClose
|
|
|
+ .image(width: 14.w, height: 14.w),
|
|
|
+ )),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget twoStepContentRichText() {
|
|
|
+ return RichText(
|
|
|
+ text: TextSpan(
|
|
|
+ style: TextStyle(fontSize: 14.sp, color: '#404040'.color),
|
|
|
+ children: [
|
|
|
+ const TextSpan(
|
|
|
+ text: "需要同意",
|
|
|
+ ),
|
|
|
+ TextSpan(
|
|
|
+ text: StringName.privacyPolicy,
|
|
|
+ style: TextStyle(color: '#2F79FF'.color),
|
|
|
+ recognizer: TapGestureRecognizer()
|
|
|
+ ..onTap = () {
|
|
|
+ if (GetPlatform.isIOS) {
|
|
|
+ BrowserPage.start(WebUrl.privacyPolicyIos);
|
|
|
+ } else {
|
|
|
+ BrowserPage.start(WebUrl.privacyPolicy);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ const TextSpan(
|
|
|
+ text: "和",
|
|
|
+ ),
|
|
|
+ TextSpan(
|
|
|
+ text: StringName.termOfService,
|
|
|
+ style: TextStyle(color: '#2F79FF'.color),
|
|
|
+ recognizer: TapGestureRecognizer()
|
|
|
+ ..onTap = () {
|
|
|
+ BrowserPage.start(WebUrl.userAgreement);
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ const TextSpan(
|
|
|
+ text: "才能继续为您提供服务,如您选择不同意很遗憾我们难以继续为您继续服务。",
|
|
|
+ ),
|
|
|
+ ]),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget oneStepContentRichText() {
|
|
|
+ return RichText(
|
|
|
+ text: TextSpan(
|
|
|
+ style: TextStyle(fontSize: 14.sp, color: '#404040'.color),
|
|
|
+ children: [
|
|
|
+ const TextSpan(
|
|
|
+ text:
|
|
|
+ "亲爱的用户,感谢您使用我们产品,为了更好的为您服务,我们可能向系统申请以下必要权限:定位信息权限、存储空间、电话权限等,用于应用的基本服务和功能),你有权拒绝或者撤回权限。\n本软件非常重视您的隐私和个人信息,在您使用之前请仔细阅读",
|
|
|
+ ),
|
|
|
+ TextSpan(
|
|
|
+ text: StringName.privacyPolicy,
|
|
|
+ style: TextStyle(color: '#2F79FF'.color),
|
|
|
+ recognizer: TapGestureRecognizer()
|
|
|
+ ..onTap = () {
|
|
|
+ if (GetPlatform.isIOS) {
|
|
|
+ BrowserPage.start(WebUrl.privacyPolicyIos);
|
|
|
+ } else {
|
|
|
+ BrowserPage.start(WebUrl.privacyPolicy);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ const TextSpan(
|
|
|
+ text: "和",
|
|
|
+ ),
|
|
|
+ TextSpan(
|
|
|
+ text: StringName.termOfService,
|
|
|
+ style: TextStyle(color: '#2F79FF'.color),
|
|
|
+ recognizer: TapGestureRecognizer()
|
|
|
+ ..onTap = () {
|
|
|
+ BrowserPage.start(WebUrl.userAgreement);
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ const TextSpan(
|
|
|
+ text: "全文,如您同意,请点击点击下方的“同意”按钮。",
|
|
|
+ ),
|
|
|
+ ]),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ void privacyClick() {
|
|
|
+ BrowserPage.start(WebUrl.privacyPolicy);
|
|
|
+ }
|
|
|
+
|
|
|
+ void userAgreementClick() {
|
|
|
+ BrowserPage.start(WebUrl.userAgreement);
|
|
|
+ }
|
|
|
+
|
|
|
+ void cancel() {
|
|
|
+ if (isFirstStep.value) {
|
|
|
+ isFirstStep.value = !isFirstStep.value;
|
|
|
+ } else {
|
|
|
+ cancelClick();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget cancelText(String txt, VoidCallback onTap) {
|
|
|
+ return GestureDetector(
|
|
|
+ onTap: onTap,
|
|
|
+ child: Container(
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: '#F8F8F8'.color,
|
|
|
+ borderRadius: BorderRadius.circular(26.w),
|
|
|
+ ),
|
|
|
+ width: 118.w,
|
|
|
+ height: 40.w,
|
|
|
+ child: Center(
|
|
|
+ child: Text(txt,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 16.sp,
|
|
|
+ color: '#A7A7A7'.color,
|
|
|
+ fontWeight: FontWeight.bold)),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ Widget sureText(String txt, VoidCallback onTap) {
|
|
|
+ return GestureDetector(
|
|
|
+ onTap: onTap,
|
|
|
+ child: Container(
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: ColorName.colorPrimary,
|
|
|
+ borderRadius: BorderRadius.circular(26.w),
|
|
|
+ ),
|
|
|
+ width: 118.w,
|
|
|
+ height: 40.w,
|
|
|
+ child: Center(
|
|
|
+ child: Text(txt,
|
|
|
+ style: TextStyle(
|
|
|
+ fontSize: 16.sp,
|
|
|
+ color: Colors.white,
|
|
|
+ fontWeight: FontWeight.bold)),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+}
|