Merge remote-tracking branch 'origin/mcy_new' into mcy_new

This commit is contained in:
machuanyu 2025-04-23 14:48:22 +08:00
commit bd8ef8bb57
11 changed files with 249 additions and 118 deletions

View File

@ -298,17 +298,19 @@ class _AnnotateItemState extends State<AnnotateItem> {
: [ : [
Expanded( Expanded(
child: InkWell( child: InkWell(
onTap: () => easyThrottle('TO_GO_REVIEWHOMEWORK', () { onTap: () => easyThrottle('TO_GO_REVIEWHOMEWORK', () async {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, overlays: []).then((_) { await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
Get.toNamed(Routes.reviewHomework, arguments: { Future.delayed(const Duration(milliseconds: 300), () {
'homeworkId': widget.homeworkId, Get.toNamed(Routes.reviewHomework, arguments: {
'homeworkName': widget.name, 'homeworkId': widget.homeworkId,
'classId': itemData.classId, 'homeworkName': widget.name,
'subject': widget.logic.state.subject, 'classId': itemData.classId,
}); 'subject': widget.logic.state.subject,
});
}); });
}); });
// Get.toNamed(Routes.reviewHomework, arguments: { // Get.toNamed(Routes.reviewHomework, arguments: {
// 'homeworkId': widget.homeworkId, // 'homeworkId': widget.homeworkId,
// 'homeworkName': widget.name, // 'homeworkName': widget.name,

View File

@ -38,7 +38,7 @@ class QuestionNumberView extends GetView<HomeworkReviewLogic> {
var studentQuestions = sateData.studentQuestions.value ?? []; var studentQuestions = sateData.studentQuestions.value ?? [];
return $QuestionNumberScrollView( return $QuestionNumberScrollView(
controller:controller, controller: controller,
sateData: sateData, sateData: sateData,
sateZoomData: sateZoomData, sateZoomData: sateZoomData,
studentQuestions: studentQuestions, studentQuestions: studentQuestions,
@ -141,27 +141,34 @@ Widget $questionNumberScrollView({
// //
@hwidget @hwidget
Widget $scoringQuestionsView(BuildContext context, List<StudentQuestions>? studentQuestions,StudentQuestions item, HomeworkReviewLogic logic, double scaleRatio, double initScale) { Widget $scoringQuestionsView(BuildContext context, List<StudentQuestions>? studentQuestions, StudentQuestions item, HomeworkReviewLogic logic, double scaleRatio, double initScale) {
var studentScore = useState<int?>(item.studentScore); var studentScore = useState<int?>(item.studentScore);
useValueChanged<int?, void>(studentScore.value, (_, __) { useValueChanged<int?, void>(item.studentScore, (_, __) {
item.studentScore = studentScore.value;
//
var annotateTime = logic.state.data.value?.annotateTime;
if (annotateTime == null) {
var noRatingGiven = studentQuestions!.firstWhereOrNull((e) => e.studentScore == null);
if (noRatingGiven == null) logic.submit(context);
}
});
useValueChanged<StudentQuestions, void>(item, (_, __) {
studentScore.value = item.studentScore; studentScore.value = item.studentScore;
}); });
useEffect(() { useEffect(() {
return () {}; ///
studentScoreListener() {
item.studentScore = studentScore.value;
if (item.studentScore == null) return;
//
var annotateTime = logic.state.data.value?.annotateTime;
if (annotateTime == null) {
var noRatingGiven = studentQuestions!.firstWhereOrNull((e) => e.studentScore == null);
if (noRatingGiven == null) logic.submit(context);
}
}
studentScore.addListener(studentScoreListener);
return () {
studentScore.removeListener(studentScoreListener);
};
}, []); }, []);
var padinVal = item.correctRate > 0 ? EdgeInsets.only(top: 6.4.h) : EdgeInsets.symmetric(vertical: 2.h); var padinVal = item.correctRate > 0 ? EdgeInsets.only(top: 6.4.h) : EdgeInsets.symmetric(vertical: 2.h);
return Container( return Container(
height: item.height! * scaleRatio * initScale, height: item.height! * scaleRatio * initScale,

View File

@ -13,6 +13,7 @@ import 'package:making_school_asignment_app/common/job/marking_models/do_test_qu
import 'package:making_school_asignment_app/common/mixins/event_bus_mixin.dart'; import 'package:making_school_asignment_app/common/mixins/event_bus_mixin.dart';
import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart'; import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart';
import 'package:making_school_asignment_app/common/utils/cached_network_img.dart'; import 'package:making_school_asignment_app/common/utils/cached_network_img.dart';
import 'package:making_school_asignment_app/common/utils/toast_utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart'; import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart';
import 'package:zoom_widget/zoom_widget.dart'; import 'package:zoom_widget/zoom_widget.dart';
@ -307,7 +308,6 @@ class QuestionImageView extends HookWidget with EventBusMixin<BottomOperationBar
sateData.zoomOffset = Offset(sateData.zoomOffset!.dx, -sateData.slide.value); sateData.zoomOffset = Offset(sateData.zoomOffset!.dx, -sateData.slide.value);
} }
initPosition.value = sateData.zoomOffset; initPosition.value = sateData.zoomOffset;
print("赋值 initPosition.value ${initPosition.value}");
} }
}); });
return () { return () {
@ -347,7 +347,17 @@ class QuestionImageView extends HookWidget with EventBusMixin<BottomOperationBar
sateData.data.value?.zgtAnnotate = null; sateData.data.value?.zgtAnnotate = null;
sateData.data.value?.showZgtAnnotate = null; sateData.data.value?.showZgtAnnotate = null;
if (sateData.data.value != null) { if (sateData.data.value != null) {
sateData.data.update((_) => logic.submit(Get.context ?? context)); sateData.data.update((_) {
var theStudentQuestions = sateData.studentQuestions.value;
if (theStudentQuestions?.isNotEmpty ?? false) {
var noMarking = theStudentQuestions?.firstWhereOrNull((e) => e.studentScore == null);
if (noMarking != null) {
ToastUtils.showInfo("未提交!请为第${noMarking.questionNo}题打分,再手动提交");
return;
}
}
logic.submit(Get.context ?? context);
});
} }
}, },
), ),
@ -468,7 +478,7 @@ class QuestionImageView extends HookWidget with EventBusMixin<BottomOperationBar
(dy - max(0, imageHeightOffsetStart) + ((zoomFile.imageHeightOffsetStart == null || zoomFile.imageHeightOffsetStart! <= 0.1) ? (sateData.zoomOffset?.dy.abs() ?? 0) : 0)) / theScale, (dy - max(0, imageHeightOffsetStart) + ((zoomFile.imageHeightOffsetStart == null || zoomFile.imageHeightOffsetStart! <= 0.1) ? (sateData.zoomOffset?.dy.abs() ?? 0) : 0)) / theScale,
); );
print("最终位置 $localPosition"); // print("最终位置 $localPosition");
vnHandWritings.value = List.from(vnHandWritings.value)..add(localPosition); vnHandWritings.value = List.from(vnHandWritings.value)..add(localPosition);
sateData.handwritings = vnHandWritings.value; sateData.handwritings = vnHandWritings.value;
}, },
@ -496,19 +506,29 @@ class QuestionImageView extends HookWidget with EventBusMixin<BottomOperationBar
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
onScaleUpdate: logic.zoomLogic.onScaleUpdate, onScaleUpdate: logic.zoomLogic.onScaleUpdate,
onPositionUpdate: logic.zoomLogic.onPanUpPosition, onPositionUpdate: logic.zoomLogic.onPanUpPosition,
child: RepaintBoundary( child: Stack(
key: logic.pictureOverviewKey, children: [
child: CustomPaint( $TheCachedNetworkImage(
// isComplex: true,
// size: customPaintSize.value,
foregroundPainter: DrawingPainter(ctrl: vnHandWritings),
child: $TheCachedNetworkImage(
imgWidth: maxWidth, imgWidth: maxWidth,
imageUrl: showZgtAnnotate ?? sateData.data.value!.zgtAnswer, imageUrl: sateData.data.value!.zgtAnswer,
(_, imageProvider) => Image(image: imageProvider, fit: BoxFit.fitWidth), (_, imageProvider) => 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,
),
),
],
), ),
), ),
), ),
@ -524,7 +544,7 @@ class DrawingPainter extends CustomPainter {
final Paint paintBrush = Paint() final Paint paintBrush = Paint()
..color = Colors.red ..color = Colors.red
..strokeCap = StrokeCap.round ..strokeCap = StrokeCap.round
..strokeWidth = 0.75.sp; ..strokeWidth = 0.7.sp;
DrawingPainter({required this.ctrl}) : super(repaint: ctrl); DrawingPainter({required this.ctrl}) : super(repaint: ctrl);
@override @override

View File

@ -125,7 +125,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
// var theImageScaleZoom = state.imageScaleZoom.value; // var theImageScaleZoom = state.imageScaleZoom.value;
// if (theImageScaleZoom == null || theImageScaleZoom.url != e?.url) state.imageScaleZoom.value = e; // if (theImageScaleZoom == null || theImageScaleZoom.url != e?.url) state.imageScaleZoom.value = e;
// }); // });
WidgetsBinding.instance.addPostFrameCallback((_) => getData()); WidgetsBinding.instance.addPostFrameCallback((_) => getData());
super.onInit(); super.onInit();
} }
@ -173,7 +173,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
state.param.value.templateId ??= data.templateId; state.param.value.templateId ??= data.templateId;
state.param.value.studentId ??= data.studentId; state.param.value.studentId ??= data.studentId;
state.data.value = data; state.data.value = data;
} catch (e) { } catch (e) {
print('获取数据报错了:$e'); print('获取数据报错了:$e');
@ -189,28 +189,26 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
void cancelAllRatings() { void cancelAllRatings() {
var studentQuestions = state.studentQuestions.value; var studentQuestions = state.studentQuestions.value;
if (state.data.value?.studentQuestions.isEmpty ?? true) return; if (state.data.value?.studentQuestions.isEmpty ?? true) return;
List<StudentQuestions> data = [];
for (var e in studentQuestions!) { for (var e in studentQuestions!) {
var newe = StudentQuestions.fromJson(e.toJson()); if (e.studentScore != null) {
newe.studentScore = null; e.studentScore = null;
data.add(newe); }
} }
state.studentQuestions.value = data; // state.studentQuestions.value = data;
state.data.value?.studentQuestions = data; // state.data.value?.studentQuestions = data;
state.studentQuestions.update((_) {});
} }
// //
void allRating(int score) { void allRating(int score) {
var studentQuestions = state.studentQuestions.value; var studentQuestions = state.studentQuestions.value;
if (state.data.value?.studentQuestions.isEmpty ?? true) return; if (state.data.value?.studentQuestions.isEmpty ?? true) return;
List<StudentQuestions> data = [];
for (var e in studentQuestions!) { for (var e in studentQuestions!) {
var newe = StudentQuestions.fromJson(e.toJson()); e.studentScore = score;
newe.studentScore = score;
data.add(newe);
} }
state.studentQuestions.value = data; // state.studentQuestions.value = data;
state.data.value?.studentQuestions = data; // state.data.value?.studentQuestions = data;
state.studentQuestions.update((_) {});
} }
// //

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:making_school_asignment_app/page/global_widget/ReturnToHomepage.dart'; import 'package:making_school_asignment_app/page/global_widget/ReturnToHomepage.dart';

View File

@ -24,8 +24,7 @@ class AnnotateList extends StatefulWidget {
final int assessType; final int assessType;
const AnnotateList( const AnnotateList(
{Key? key, required this.tabIndex, required this.assessType}) {super.key, required this.tabIndex, required this.assessType});
: super(key: key);
@override @override
State<AnnotateList> createState() => _AnnotateListState(); State<AnnotateList> createState() => _AnnotateListState();
@ -72,6 +71,14 @@ class _AnnotateListState extends State<AnnotateList>
getAnnotateList(); getAnnotateList();
} }
@override
void dispose() {
refreshController1.dispose();
refreshController2.dispose();
tabController2.dispose();
super.dispose();
}
// //
void getUnAnnotateList() async { void getUnAnnotateList() async {
WorkStudent data = WorkStudent([], 0); WorkStudent data = WorkStudent([], 0);
@ -85,7 +92,7 @@ class _AnnotateListState extends State<AnnotateList>
refreshController1.finishRefresh(); refreshController1.finishRefresh();
refreshController2.finishRefresh(); refreshController2.finishRefresh();
EasyLoading.dismiss(); EasyLoading.dismiss();
print('state.unAnnotateList.length=${unAnnotateList.length}'); // print('state.unAnnotateList.length=${unAnnotateList.length}');
} }
// //
@ -102,7 +109,7 @@ class _AnnotateListState extends State<AnnotateList>
refreshController1.finishRefresh(); refreshController1.finishRefresh();
refreshController2.finishRefresh(); refreshController2.finishRefresh();
EasyLoading.dismiss(); 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, emptyWidget: data.isEmpty ? const MyEmptyWidget() : null,
controller: controller, controller: controller,
header: MaterialHeader(), header: MaterialHeader(),
footer: TaurusFooter(), footer: MaterialFooter(),
child: completed && isPadFlag child: completed && isPadFlag
? GridView( ? GridView(
padding: EdgeInsets.only( padding: EdgeInsets.only(

View File

@ -27,10 +27,7 @@ class Protocol extends Dialog {
), ),
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
quickText('用户协议与隐私政策', quickText('用户协议与隐私政策', size: 15.sp, color: const Color.fromRGBO(37, 37, 37, 1), fontWeight: FontWeight.bold),
size: 15.sp,
color: const Color.fromRGBO(37, 37, 37, 1),
fontWeight: FontWeight.bold),
Expanded( Expanded(
child: ListView( child: ListView(
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
@ -38,22 +35,15 @@ class Protocol extends Dialog {
children: [ children: [
Text.rich(TextSpan(children: [ Text.rich(TextSpan(children: [
TextSpan( TextSpan(
text: text: '感谢您选择点智学APP ! 我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,请务必审慎阅读',
'感谢您选择点智学APP ! 我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,请务必审慎阅读', style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)),
style: TextStyle(
fontSize: 13.sp,
color: const Color.fromRGBO(51, 51, 51, 1)),
), ),
TextSpan( TextSpan(
text: '《隐私政策》', text: '《隐私政策》',
style: TextStyle( style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor),
fontSize: 13.sp,
color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () async { ..onTap = () async {
Get.toNamed(Routes.agreementPage, arguments: { Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.PRIVACY_GREEMENT.name});
"type": AGREEMENT_KEY.PRIVACY_GREEMENT.name
});
// RouterManager.router.navigateTo( // RouterManager.router.navigateTo(
// context, // context,
// '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.PRIVACY_GREEMENT.name}', // '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.PRIVACY_GREEMENT.name}',
@ -63,20 +53,14 @@ class Protocol extends Dialog {
), ),
TextSpan( TextSpan(
text: '', text: '',
style: TextStyle( style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)),
fontSize: 13.sp,
color: Color.fromRGBO(51, 51, 51, 1)),
), ),
TextSpan( TextSpan(
text: '《用户协议》', text: '《用户协议》',
style: TextStyle( style: TextStyle(fontSize: 13.sp, color: Theme.of(context).primaryColor),
fontSize: 13.sp,
color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer() recognizer: TapGestureRecognizer()
..onTap = () async { ..onTap = () async {
Get.toNamed(Routes.agreementPage, arguments: { Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name});
"type": AGREEMENT_KEY.USER_AGREEMENT.name
});
// RouterManager.router.navigateTo( // RouterManager.router.navigateTo(
// context, // context,
// '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}', // '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}',
@ -85,11 +69,8 @@ class Protocol extends Dialog {
}, },
), ),
TextSpan( TextSpan(
text: text: '内的所有条款,尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2.约定我们的限制责任、免责条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问可通过发邮件至yuanxuanjiaoyu@gmail.com与我们联系。您点击"同意并继续”的行为即表示您已阅读完毕并同意以上协议的全部内容。如您同意以上协议内容,请点击"同意并继续”,开始使用我们的产品和服务!',
'内的所有条款,尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2.约定我们的限制责任、免责条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问可通过发邮件至yuanxuanjiaoyu@gmail.com与我们联系。您点击"同意并继续”的行为即表示您已阅读完毕并同意以上协议的全部内容。如您同意以上协议内容,请点击"同意并继续”,开始使用我们的产品和服务!', style: TextStyle(fontSize: 13.sp, color: const Color.fromRGBO(51, 51, 51, 1)),
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), padding: EdgeInsets.only(top: 15.h),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
top: BorderSide( top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)),
width: 0.5.r, right: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)),
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), child: quickText('退出APP', size: 14.sp),
@ -123,8 +100,7 @@ class Protocol extends Dialog {
Expanded( Expanded(
child: InkWell( child: InkWell(
onTap: () { onTap: () {
StorageService.to StorageService.to.write(AppStorageKey.privacyAgreement.value, true);
.write(AppStorageKey.privacyAgreement.value, true);
Navigator.of(context).pop(true); Navigator.of(context).pop(true);
}, },
child: Container( child: Container(
@ -132,13 +108,10 @@ class Protocol extends Dialog {
padding: EdgeInsets.only(top: 15.h), padding: EdgeInsets.only(top: 15.h),
decoration: BoxDecoration( decoration: BoxDecoration(
border: Border( border: Border(
top: BorderSide( top: BorderSide(width: 0.5.r, color: const Color.fromRGBO(238, 238, 238, 1)),
width: 0.5.r,
color: const Color.fromRGBO(238, 238, 238, 1)),
), ),
), ),
child: quickText('同意并继续', child: quickText('同意并继续', color: Theme.of(context).primaryColor, size: 14.sp),
color: Theme.of(context).primaryColor, size: 14.sp),
), ),
), ),
) )
@ -153,8 +126,7 @@ class Protocol extends Dialog {
/// ///
Future<void> sysProtocol(BuildContext context) async { Future<void> sysProtocol(BuildContext context) async {
bool? sysProtocol = bool? sysProtocol = StorageService.to.hasData(AppStorageKey.privacyAgreement.value);
StorageService.to.hasData(AppStorageKey.privacyAgreement.value);
if (!sysProtocol) { if (!sysProtocol) {
return showDialog( return showDialog(
@ -165,3 +137,114 @@ Future<void> sysProtocol(BuildContext context) async {
); );
} }
} }
///
Future<bool> assistedReadingProtocol(BuildContext context) async {
var flag = await showDialog<bool>(
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: <Widget>[
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),
),
),
)
],
),
],
),
),
);
}
}

View File

@ -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/storage.dart';
import 'package:making_school_asignment_app/common/utils/toast_utils.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/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/routes/app_pages.dart';
import 'package:making_school_asignment_app/common/store/app_storage_key.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; state.isShowPwd.value = !state.isShowPwd.value;
} }
// ///
void toLogin(BuildContext context) async { void toLogin(BuildContext context) async {
if (!state.canLogin.value) return; if (!state.canLogin.value) return;
Utils.hideKeyboard();
state.canLogin.value = false; state.canLogin.value = false;
void toMsg(msg) { void toMsg(msg) {
@ -64,13 +65,15 @@ class LoginLogic extends GetxController with RequestToolMixin {
state.canLogin.value = true; state.canLogin.value = true;
} }
Utils.hideKeyboard();
String userName = state.userNameController.text.trim(); String userName = state.userNameController.text.trim();
String userPwd = state.passwordController.text.trim(); String userPwd = state.passwordController.text.trim();
if (userName == '') return toMsg('请填写用户账号'); if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') 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...'); EasyLoading.show(status: 'loading...');
@ -148,14 +151,14 @@ class LoginLogic extends GetxController with RequestToolMixin {
} }
@override @override
void dispose() { void onClose() {
super.dispose();
state.userNameController state.userNameController
..removeListener(userNameListener) ..removeListener(userNameListener)
..dispose(); ..dispose();
state.passwordController.dispose(); state.passwordController.dispose();
state.pwdFocus.dispose(); state.pwdFocus.dispose();
state.theFocus.dispose(); state.theFocus.dispose();
super.onClose();
} }
/// ///

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.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/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/app_upgrade/upgradeLogic.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
@ -166,7 +167,12 @@ class _LoginPageState extends State<LoginPage> {
obscureText: state.isShowPwd.value, obscureText: state.isShowPwd.value,
// //
// textInputAction: state.isShowPwd.value?TextInputAction.go:TextInputAction.next, // 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( style: TextStyle(
color: const Color(0xFF434343), color: const Color(0xFF434343),
fontSize: 14.sp, fontSize: 14.sp,
@ -281,10 +287,11 @@ class _LoginPageState extends State<LoginPage> {
], ],
), ),
InkWell( InkWell(
onTap: () { onTap: () => easyThrottle('LOGIN_EASYTHROTTLE', () async{
logic.toLogin(context); Utils.hideKeyboard();
// Get.toNamed(Routes.home); await Future.delayed(Duration.zero);
}, WidgetsBinding.instance.addPostFrameCallback((_) => logic.toLogin(context));
}),
child: Obx(() { child: Obx(() {
return Container( return Container(
margin: EdgeInsets.symmetric(vertical: 10.h), margin: EdgeInsets.symmetric(vertical: 10.h),

View File

@ -17,10 +17,15 @@ class WorkLogic extends GetxController with RequestToolMixin, GetTickerProviderS
); );
} }
@override @override
void dispose() { void onClose() {
super.dispose();
tabController.dispose(); tabController.dispose();
super.onClose();
} }
// @override
// void dispose() {
// super.dispose();
// tabController.dispose();
// }
} }

View File

@ -14,7 +14,7 @@ import 'package:syncfusion_flutter_datepicker/datepicker.dart';
import 'work_logic.dart'; import 'work_logic.dart';
class WorkPage extends StatefulWidget { class WorkPage extends StatefulWidget {
const WorkPage({Key? key}) : super(key: key); const WorkPage({super.key});
@override @override
State<WorkPage> createState() => _WorkPageState(); State<WorkPage> createState() => _WorkPageState();