diff --git a/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart b/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart index 412a03b..e74e16c 100644 --- a/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart +++ b/making_school_asignment_app/lib/page/home_page/children/homework_review/components/question_paper_view.dart @@ -496,19 +496,29 @@ class QuestionImageView extends HookWidget with EventBusMixin Image(image: imageProvider, fit: BoxFit.fitWidth), ), - // child: showZgtAnnotate != null ? $TheCachedNetworkImage(imgWidth: maxWidth, imageUrl: showZgtAnnotate, (_, imageProvider) => Image(image: imageProvider, fit: BoxFit.fitWidth)) : null, - ), + RepaintBoundary( + key: logic.pictureOverviewKey, + child: CustomPaint( + // isComplex: true, + size: Size(maxWidth, zoomState.zoomFile.value!.actualHeight!), + foregroundPainter: DrawingPainter(ctrl: vnHandWritings), + // child: $TheCachedNetworkImage( + // imgWidth: maxWidth, + // imageUrl: showZgtAnnotate ?? sateData.data.value!.zgtAnswer, + // (_, imageProvider) => Image(image: imageProvider, fit: BoxFit.fitWidth), + + // ), + child: showZgtAnnotate != null ? $TheCachedNetworkImage(imgWidth: maxWidth, imageUrl: showZgtAnnotate, (_, imageProvider) => Image(image: imageProvider, fit: BoxFit.fitWidth)) : null, + ), + ), + ], ), ), ), diff --git a/making_school_asignment_app/lib/page/home_page/children/read_over/widget/annotate_list.dart b/making_school_asignment_app/lib/page/home_page/children/read_over/widget/annotate_list.dart index cdf1d1a..35499cb 100644 --- a/making_school_asignment_app/lib/page/home_page/children/read_over/widget/annotate_list.dart +++ b/making_school_asignment_app/lib/page/home_page/children/read_over/widget/annotate_list.dart @@ -24,8 +24,7 @@ class AnnotateList extends StatefulWidget { final int assessType; const AnnotateList( - {Key? key, required this.tabIndex, required this.assessType}) - : super(key: key); + {super.key, required this.tabIndex, required this.assessType}); @override State createState() => _AnnotateListState(); @@ -72,6 +71,14 @@ class _AnnotateListState extends State getAnnotateList(); } + @override + void dispose() { + refreshController1.dispose(); + refreshController2.dispose(); + tabController2.dispose(); + super.dispose(); + } + //待批阅列表 void getUnAnnotateList() async { WorkStudent data = WorkStudent([], 0); @@ -85,7 +92,7 @@ class _AnnotateListState extends State refreshController1.finishRefresh(); refreshController2.finishRefresh(); EasyLoading.dismiss(); - print('state.unAnnotateList.length=${unAnnotateList.length}'); + // print('state.unAnnotateList.length=${unAnnotateList.length}'); } //已批阅列表 @@ -102,7 +109,7 @@ class _AnnotateListState extends State refreshController1.finishRefresh(); refreshController2.finishRefresh(); EasyLoading.dismiss(); - print('state.annotateList.length=${annotateList.length}'); + // print('state.annotateList.length=${annotateList.length}'); } /// 刷新方法 @@ -264,7 +271,7 @@ Widget $easyRefresh({ emptyWidget: data.isEmpty ? const MyEmptyWidget() : null, controller: controller, header: MaterialHeader(), - footer: TaurusFooter(), + footer: MaterialFooter(), child: completed && isPadFlag ? GridView( padding: EdgeInsets.only( diff --git a/making_school_asignment_app/lib/page/login_page/children/sys_protocol.dart b/making_school_asignment_app/lib/page/login_page/children/sys_protocol.dart index e79b358..61e7145 100644 --- a/making_school_asignment_app/lib/page/login_page/children/sys_protocol.dart +++ b/making_school_asignment_app/lib/page/login_page/children/sys_protocol.dart @@ -27,10 +27,7 @@ class Protocol extends Dialog { ), child: Column( children: [ - quickText('用户协议与隐私政策', - size: 15.sp, - color: const Color.fromRGBO(37, 37, 37, 1), - fontWeight: FontWeight.bold), + quickText('用户协议与隐私政策', size: 15.sp, color: const Color.fromRGBO(37, 37, 37, 1), fontWeight: FontWeight.bold), Expanded( child: ListView( physics: const BouncingScrollPhysics(), @@ -38,22 +35,15 @@ class Protocol extends Dialog { children: [ Text.rich(TextSpan(children: [ TextSpan( - text: - '感谢您选择点智学APP ! 我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,请务必审慎阅读', - style: TextStyle( - fontSize: 13.sp, - color: const Color.fromRGBO(51, 51, 51, 1)), + text: '感谢您选择点智学APP ! 我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,请务必审慎阅读', + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), ), TextSpan( text: '《隐私政策》', - style: TextStyle( - fontSize: 13.sp, - color: Theme.of(context).primaryColor), + style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor), recognizer: TapGestureRecognizer() ..onTap = () async { - Get.toNamed(Routes.agreementPage, arguments: { - "type": AGREEMENT_KEY.PRIVACY_GREEMENT.name - }); + Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.PRIVACY_GREEMENT.name}); // RouterManager.router.navigateTo( // context, // '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.PRIVACY_GREEMENT.name}', @@ -63,20 +53,14 @@ class Protocol extends Dialog { ), TextSpan( text: '和', - style: TextStyle( - fontSize: 13.sp, - color: Color.fromRGBO(51, 51, 51, 1)), + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), ), TextSpan( text: '《用户协议》', - style: TextStyle( - fontSize: 13.sp, - color: Theme.of(context).primaryColor), + style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor), recognizer: TapGestureRecognizer() ..onTap = () async { - Get.toNamed(Routes.agreementPage, arguments: { - "type": AGREEMENT_KEY.USER_AGREEMENT.name - }); + Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name}); // RouterManager.router.navigateTo( // context, // '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}', @@ -85,11 +69,8 @@ class Protocol extends Dialog { }, ), TextSpan( - text: - '内的所有条款,尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2.约定我们的限制责任、免责条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问,可通过发邮件至yuanxuanjiaoyu@gmail.com与我们联系。您点击"同意并继续”的行为即表示您已阅读完毕并同意以上协议的全部内容。如您同意以上协议内容,请点击"同意并继续”,开始使用我们的产品和服务!', - style: TextStyle( - fontSize: 13.sp, - color: const Color.fromRGBO(51, 51, 51, 1)), + text: '内的所有条款,尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2.约定我们的限制责任、免责条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问,可通过发邮件至yuanxuanjiaoyu@gmail.com与我们联系。您点击"同意并继续”的行为即表示您已阅读完毕并同意以上协议的全部内容。如您同意以上协议内容,请点击"同意并继续”,开始使用我们的产品和服务!', + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), ), ])), ], @@ -108,12 +89,8 @@ class Protocol extends Dialog { padding: EdgeInsets.only(top: 15.h), decoration: BoxDecoration( border: Border( - top: BorderSide( - width: 0.5.r, - color: const Color.fromRGBO(238, 238, 238, 1)), - right: BorderSide( - width: 0.5.r, - color: const Color.fromRGBO(238, 238, 238, 1)), + top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), + right: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), ), ), child: quickText('退出APP', size: 14.sp), @@ -123,8 +100,7 @@ class Protocol extends Dialog { Expanded( child: InkWell( onTap: () { - StorageService.to - .write(AppStorageKey.privacyAgreement.value, true); + StorageService.to.write(AppStorageKey.privacyAgreement.value, true); Navigator.of(context).pop(true); }, child: Container( @@ -132,13 +108,10 @@ class Protocol extends Dialog { padding: EdgeInsets.only(top: 15.h), decoration: BoxDecoration( border: Border( - top: BorderSide( - width: 0.5.r, - color: const Color.fromRGBO(238, 238, 238, 1)), + top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), ), ), - child: quickText('同意并继续', - color: Theme.of(context).primaryColor, size: 14.sp), + child: quickText('同意并继续', color: Theme.of(context).primaryColor, size: 14.sp), ), ), ) @@ -153,8 +126,7 @@ class Protocol extends Dialog { /// 系统协议 Future sysProtocol(BuildContext context) async { - bool? sysProtocol = - StorageService.to.hasData(AppStorageKey.privacyAgreement.value); + bool? sysProtocol = StorageService.to.hasData(AppStorageKey.privacyAgreement.value); if (!sysProtocol) { return showDialog( @@ -165,3 +137,114 @@ Future sysProtocol(BuildContext context) async { ); } } + +/// 辅助阅读协议 +Future assistedReadingProtocol(BuildContext context) async { + var flag = await showDialog( + context: context, + barrierDismissible: false, + // useRootNavigator: false, + builder: (ctx) => const ProtocolAssistedGuidance(), + ); + print("点击返回值 :$flag"); + return flag ?? false; +} + +/// 协议辅助引导 +class ProtocolAssistedGuidance extends Dialog { + const ProtocolAssistedGuidance({super.key}); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + width: isPad() ? 216.w : 260.w, + height: 200.h, + padding: EdgeInsets.symmetric(horizontal: 4.w,vertical: 16.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + ), + child: Column( + children: [ + quickText('协议及政策阅读指引', size: 16.sp, color: const Color.fromRGBO(37, 37, 37, 1), fontWeight: FontWeight.bold), + Expanded( + child: ListView( + physics: const BouncingScrollPhysics(), + padding: EdgeInsets.fromLTRB(10.w, 14.h, 10.w, 10.h), + children: [ + Text.rich(TextSpan(children: [ + TextSpan( + text: '感谢您选择点智学,在使用当前APP服务之前,请仔细阅读', + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), + ), + TextSpan( + text: '《隐私政策》', + style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor), + recognizer: TapGestureRecognizer() + ..onTap = () async { + Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.PRIVACY_GREEMENT.name}); + }, + ), + TextSpan( + text: '和', + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), + ), + TextSpan( + text: '《用户协议》', + style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor), + recognizer: TapGestureRecognizer() + ..onTap = () async { + Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name}); + }, + ), + TextSpan( + text: '如果你已经阅读并同意此协议及政策,请点击“同意并继续”开始使用。', + style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)), + ), + ])), + ], + ), + ), + SizedBox(height: 10.h), + Row( + children: [ + Expanded( + child: InkWell( + onTap: () => Navigator.of(context).pop(false), + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 15.h), + decoration: BoxDecoration( + border: Border( + top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), + right: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), + ), + ), + child: quickText('拒绝', size: 14.sp), + ), + ), + ), + Expanded( + child: InkWell( + onTap: () => Navigator.of(context).pop(true), + child: Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 15.h), + decoration: BoxDecoration( + border: Border( + top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)), + ), + ), + child: quickText('同意并继续', color: Theme.of(context).primaryColor, size: 15.sp), + ), + ), + ) + ], + ), + ], + ), + ), + ); + } +} diff --git a/making_school_asignment_app/lib/page/login_page/login_logic.dart b/making_school_asignment_app/lib/page/login_page/login_logic.dart index 7353333..47ca5db 100644 --- a/making_school_asignment_app/lib/page/login_page/login_logic.dart +++ b/making_school_asignment_app/lib/page/login_page/login_logic.dart @@ -7,6 +7,7 @@ import 'package:making_school_asignment_app/common/store/user_store.dart'; import 'package:making_school_asignment_app/common/utils/storage.dart'; import 'package:making_school_asignment_app/common/utils/toast_utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart'; +import 'package:making_school_asignment_app/page/login_page/children/sys_protocol.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/common/store/app_storage_key.dart'; @@ -53,10 +54,10 @@ class LoginLogic extends GetxController with RequestToolMixin { state.isShowPwd.value = !state.isShowPwd.value; } -// 前往登录 + /// 前往登录 void toLogin(BuildContext context) async { if (!state.canLogin.value) return; - + Utils.hideKeyboard(); state.canLogin.value = false; void toMsg(msg) { @@ -64,13 +65,15 @@ class LoginLogic extends GetxController with RequestToolMixin { state.canLogin.value = true; } - Utils.hideKeyboard(); - String userName = state.userNameController.text.trim(); String userPwd = state.passwordController.text.trim(); if (userName == '') return toMsg('请填写用户账号'); if (userPwd == '') return toMsg('请填写密码再试'); - if (!state.readAgreement.value) return toMsg('请阅读用户协议'); + if (!state.readAgreement.value) { + var consent = await assistedReadingProtocol(context); // 辅助阅读协议阅读引导 + if (!consent) return toMsg('请阅读用户协议、隐私协议'); + state.readAgreement.value = true; + } EasyLoading.show(status: 'loading...'); @@ -148,14 +151,14 @@ class LoginLogic extends GetxController with RequestToolMixin { } @override - void dispose() { - super.dispose(); + void onClose() { state.userNameController ..removeListener(userNameListener) ..dispose(); state.passwordController.dispose(); state.pwdFocus.dispose(); state.theFocus.dispose(); + super.onClose(); } /// 是否展示用户附加功能 diff --git a/making_school_asignment_app/lib/page/login_page/login_view.dart b/making_school_asignment_app/lib/page/login_page/login_view.dart index c1dbb98..ac904a7 100644 --- a/making_school_asignment_app/lib/page/login_page/login_view.dart +++ b/making_school_asignment_app/lib/page/login_page/login_view.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:making_school_asignment_app/common/const_text.dart'; +import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart'; import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; @@ -166,7 +167,12 @@ class _LoginPageState extends State { obscureText: state.isShowPwd.value, //隐藏密码显示 // textInputAction: state.isShowPwd.value?TextInputAction.go:TextInputAction.next, - // onSubmitted: (val) => toLogin(), + textInputAction: TextInputAction.send, + onSubmitted: (_) => easyThrottle('LOGIN_EASYTHROTTLE', () async{ + Utils.hideKeyboard(); + await Future.delayed(const Duration(milliseconds: 300)); + WidgetsBinding.instance.addPostFrameCallback((_) => logic.toLogin(context)); + }), style: TextStyle( color: const Color(0xFF434343), fontSize: 14.sp, @@ -281,10 +287,11 @@ class _LoginPageState extends State { ], ), InkWell( - onTap: () { - logic.toLogin(context); - // Get.toNamed(Routes.home); - }, + onTap: () => easyThrottle('LOGIN_EASYTHROTTLE', () async{ + Utils.hideKeyboard(); + await Future.delayed(Duration.zero); + WidgetsBinding.instance.addPostFrameCallback((_) => logic.toLogin(context)); + }), child: Obx(() { return Container( margin: EdgeInsets.symmetric(vertical: 10.h), diff --git a/making_school_asignment_app/lib/page/work_page/work_logic.dart b/making_school_asignment_app/lib/page/work_page/work_logic.dart index 473803d..719ec61 100644 --- a/making_school_asignment_app/lib/page/work_page/work_logic.dart +++ b/making_school_asignment_app/lib/page/work_page/work_logic.dart @@ -17,10 +17,15 @@ class WorkLogic extends GetxController with RequestToolMixin, GetTickerProviderS ); } - @override - void dispose() { - super.dispose(); + void onClose() { tabController.dispose(); + super.onClose(); } + + // @override + // void dispose() { + // super.dispose(); + // tabController.dispose(); + // } } diff --git a/making_school_asignment_app/lib/page/work_page/work_view.dart b/making_school_asignment_app/lib/page/work_page/work_view.dart index b218492..1449755 100644 --- a/making_school_asignment_app/lib/page/work_page/work_view.dart +++ b/making_school_asignment_app/lib/page/work_page/work_view.dart @@ -14,7 +14,7 @@ import 'package:syncfusion_flutter_datepicker/datepicker.dart'; import 'work_logic.dart'; class WorkPage extends StatefulWidget { - const WorkPage({Key? key}) : super(key: key); + const WorkPage({super.key}); @override State createState() => _WorkPageState();