Merge remote-tracking branch 'origin/mcy_new' into mcy_new
This commit is contained in:
commit
bd8ef8bb57
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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((_) {});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 全对评分
|
// 全对评分
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 是否展示用户附加功能
|
/// 是否展示用户附加功能
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue