Commit 22f362320722bc706da82d9fd40629dde0345b76
1 parent
aa0d2360
feat:过渡页-练习环节
Showing
9 changed files
with
154 additions
and
60 deletions
lib/pages/practice/bloc/topic_picture_bloc.dart
@@ -9,10 +9,14 @@ import 'package:wow_english/common/extension/string_extension.dart'; | @@ -9,10 +9,14 @@ import 'package:wow_english/common/extension/string_extension.dart'; | ||
9 | import 'package:wow_english/common/request/dao/listen_dao.dart'; | 9 | import 'package:wow_english/common/request/dao/listen_dao.dart'; |
10 | import 'package:wow_english/common/request/exception.dart'; | 10 | import 'package:wow_english/common/request/exception.dart'; |
11 | import 'package:wow_english/models/course_process_entity.dart'; | 11 | import 'package:wow_english/models/course_process_entity.dart'; |
12 | +import 'package:wow_english/pages/section/subsection/base_section/bloc.dart'; | ||
13 | +import 'package:wow_english/pages/section/subsection/base_section/event.dart'; | ||
14 | +import 'package:wow_english/pages/section/subsection/base_section/state.dart'; | ||
12 | import 'package:wow_english/utils/loading.dart'; | 15 | import 'package:wow_english/utils/loading.dart'; |
13 | import 'package:wow_english/utils/toast_util.dart'; | 16 | import 'package:wow_english/utils/toast_util.dart'; |
14 | 17 | ||
15 | import '../../../common/permission/permissionRequestPage.dart'; | 18 | import '../../../common/permission/permissionRequestPage.dart'; |
19 | +import '../../../route/route.dart'; | ||
16 | 20 | ||
17 | part 'topic_picture_event.dart'; | 21 | part 'topic_picture_event.dart'; |
18 | part 'topic_picture_state.dart'; | 22 | part 'topic_picture_state.dart'; |
@@ -28,7 +32,7 @@ enum VoicePlayState { | @@ -28,7 +32,7 @@ enum VoicePlayState { | ||
28 | stop | 32 | stop |
29 | } | 33 | } |
30 | 34 | ||
31 | -class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | 35 | +class TopicPictureBloc extends BaseSectionBloc<TopicPictureEvent, TopicPictureState> { |
32 | 36 | ||
33 | final PageController pageController; | 37 | final PageController pageController; |
34 | 38 | ||
@@ -94,11 +98,15 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -94,11 +98,15 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
94 | _forbiddenWhenCorrect = false; | 98 | _forbiddenWhenCorrect = false; |
95 | debugPrint('播放完成后解除禁止'); | 99 | debugPrint('播放完成后解除禁止'); |
96 | if (event == PlayerState.completed) { | 100 | if (event == PlayerState.completed) { |
97 | - // 答对后且播放完自动翻页 | ||
98 | - pageController.nextPage( | ||
99 | - duration: const Duration(milliseconds: 500), | ||
100 | - curve: Curves.ease, | ||
101 | - ); | 101 | + if (isLastPage()) { |
102 | + showStepPage(); | ||
103 | + } else { | ||
104 | + // 答对后且播放完自动翻页 | ||
105 | + pageController.nextPage( | ||
106 | + duration: const Duration(milliseconds: 500), | ||
107 | + curve: Curves.ease, | ||
108 | + ); | ||
109 | + } | ||
102 | } | 110 | } |
103 | } | 111 | } |
104 | } | 112 | } |
@@ -263,6 +271,9 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -263,6 +271,9 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
263 | showToast('测评成功,分数是$overall',duration: const Duration(seconds: 5)); | 271 | showToast('测评成功,分数是$overall',duration: const Duration(seconds: 5)); |
264 | _isVoicing = false; | 272 | _isVoicing = false; |
265 | emitter(XSVoiceTestState()); | 273 | emitter(XSVoiceTestState()); |
274 | + if (isLastPage()) { | ||
275 | + showStepPage(); | ||
276 | + } | ||
266 | } | 277 | } |
267 | 278 | ||
268 | // 暂时没用上 | 279 | // 暂时没用上 |
@@ -288,6 +299,7 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -288,6 +299,7 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
288 | } | 299 | } |
289 | } | 300 | } |
290 | 301 | ||
302 | + ///播放选择结果音效 | ||
291 | void _playResultSound(bool isCorrect) async { | 303 | void _playResultSound(bool isCorrect) async { |
292 | // await audioPlayer.stop(); | 304 | // await audioPlayer.stop(); |
293 | if (audioPlayer.state == PlayerState.playing && _isResultSoundPlaying == false) { | 305 | if (audioPlayer.state == PlayerState.playing && _isResultSoundPlaying == false) { |
@@ -302,4 +314,26 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | @@ -302,4 +314,26 @@ class TopicPictureBloc extends Bloc<TopicPictureEvent, TopicPictureState> { | ||
302 | await audioPlayer.play(AssetSource('incorrect_voice'.assetMp3)); | 314 | await audioPlayer.play(AssetSource('incorrect_voice'.assetMp3)); |
303 | } | 315 | } |
304 | } | 316 | } |
317 | + | ||
318 | + ///是否是最后一页 | ||
319 | + bool isLastPage() { | ||
320 | + return currentPage == _entity?.topics?.length; | ||
321 | + } | ||
322 | + | ||
323 | + ///展示过渡页 | ||
324 | + void showStepPage() { | ||
325 | + ///如果最后一页是语音问答题,评测完后自动翻页 | ||
326 | + sectionComplete(() { | ||
327 | + popPage( | ||
328 | + data:{ | ||
329 | + 'currentStep':currentPage.toString(), | ||
330 | + 'courseLessonId':courseLessonId, | ||
331 | + 'isLastPage': true, | ||
332 | + 'nextSection': true | ||
333 | + }); | ||
334 | + }, againSectionTap: () { | ||
335 | + debugPrint("WQF 重做"); | ||
336 | + pageController.jumpToPage(0); | ||
337 | + }); | ||
338 | + } | ||
305 | } | 339 | } |
lib/pages/practice/bloc/topic_picture_event.dart
1 | part of 'topic_picture_bloc.dart'; | 1 | part of 'topic_picture_bloc.dart'; |
2 | 2 | ||
3 | @immutable | 3 | @immutable |
4 | -abstract class TopicPictureEvent {} | 4 | +abstract class TopicPictureEvent extends BaseSectionEvent {} |
5 | 5 | ||
6 | class InitBlocEvent extends TopicPictureEvent {} | 6 | class InitBlocEvent extends TopicPictureEvent {} |
7 | 7 |
lib/pages/practice/bloc/topic_picture_state.dart
1 | part of 'topic_picture_bloc.dart'; | 1 | part of 'topic_picture_bloc.dart'; |
2 | 2 | ||
3 | @immutable | 3 | @immutable |
4 | -abstract class TopicPictureState {} | 4 | +abstract class TopicPictureState extends BaseSectionState {} |
5 | 5 | ||
6 | class TopicPictureInitial extends TopicPictureState {} | 6 | class TopicPictureInitial extends TopicPictureState {} |
7 | 7 |
lib/pages/practice/topic_picture_page.dart
@@ -6,6 +6,7 @@ import 'package:wow_english/common/core/user_util.dart'; | @@ -6,6 +6,7 @@ import 'package:wow_english/common/core/user_util.dart'; | ||
6 | import 'package:wow_english/common/extension/string_extension.dart'; | 6 | import 'package:wow_english/common/extension/string_extension.dart'; |
7 | import 'package:wow_english/common/widgets/ow_image_widget.dart'; | 7 | import 'package:wow_english/common/widgets/ow_image_widget.dart'; |
8 | import 'package:wow_english/models/course_process_entity.dart'; | 8 | import 'package:wow_english/models/course_process_entity.dart'; |
9 | +import 'package:wow_english/pages/practice/topic_type.dart'; | ||
9 | import 'package:wow_english/route/route.dart'; | 10 | import 'package:wow_english/route/route.dart'; |
10 | import 'package:wow_english/utils/toast_util.dart'; | 11 | import 'package:wow_english/utils/toast_util.dart'; |
11 | 12 | ||
@@ -71,7 +72,8 @@ class _TopicPicturePage extends StatelessWidget { | @@ -71,7 +72,8 @@ class _TopicPicturePage extends StatelessWidget { | ||
71 | popPage( | 72 | popPage( |
72 | data:{ | 73 | data:{ |
73 | 'currentStep':bloc.currentPage.toString(), | 74 | 'currentStep':bloc.currentPage.toString(), |
74 | - 'courseLessonId':bloc.courseLessonId | 75 | + 'courseLessonId':bloc.courseLessonId, |
76 | + 'isLastPage': bloc.isLastPage(), | ||
75 | }); | 77 | }); |
76 | // Navigator.pop(context); | 78 | // Navigator.pop(context); |
77 | }, | 79 | }, |
@@ -86,13 +88,13 @@ class _TopicPicturePage extends StatelessWidget { | @@ -86,13 +88,13 @@ class _TopicPicturePage extends StatelessWidget { | ||
86 | }, | 88 | }, |
87 | itemBuilder: (BuildContext context,int index){ | 89 | itemBuilder: (BuildContext context,int index){ |
88 | CourseProcessTopics? topics = bloc.entity?.topics![index]; | 90 | CourseProcessTopics? topics = bloc.entity?.topics![index]; |
89 | - if (topics?.type == 1) {//听音选图 | 91 | + if (topics?.type == TopicType.audioImageSelect.value) {//听音选图 |
90 | return _pageViewVoicePictureItemWidget(topics); | 92 | return _pageViewVoicePictureItemWidget(topics); |
91 | - } else if (topics?.type == 2) {//听音选字 | 93 | + } else if (topics?.type == TopicType.audioCharSelect.value) {//听音选字 |
92 | return _pageViewVoiceWordItemWidget(topics); | 94 | return _pageViewVoiceWordItemWidget(topics); |
93 | - } else if (topics?.type == 3) {//看题选字 | 95 | + } else if (topics?.type == TopicType.questionCharSelect.value) {//看题选字 |
94 | return _pageViewWordItemWidget(topics); | 96 | return _pageViewWordItemWidget(topics); |
95 | - } else if (topics?.type == 4) {//看题选图 | 97 | + } else if (topics?.type == TopicType.questionImageSelect.value) {//看题选图 |
96 | return _pageViewItemWidget(topics); | 98 | return _pageViewItemWidget(topics); |
97 | } else {//语音问答 | 99 | } else {//语音问答 |
98 | return _voiceAnswerItem(topics); | 100 | return _voiceAnswerItem(topics); |
lib/pages/practice/topic_type.dart
0 → 100644
1 | +///练习(题型)类型 | ||
2 | +enum TopicType { | ||
3 | + ///听音选图 | ||
4 | + audioImageSelect, | ||
5 | + | ||
6 | + ///听音选字 | ||
7 | + audioCharSelect, | ||
8 | + | ||
9 | + ///看题选字 | ||
10 | + questionCharSelect, | ||
11 | + | ||
12 | + ///看题选图 | ||
13 | + questionImageSelect, | ||
14 | + | ||
15 | + ///语音问答 | ||
16 | + voiceQuestion | ||
17 | +} | ||
18 | + | ||
19 | +extension TopicTypeExtension on TopicType { | ||
20 | + int get value { | ||
21 | + switch (this) { | ||
22 | + case TopicType.audioImageSelect: | ||
23 | + return 1; | ||
24 | + case TopicType.audioCharSelect: | ||
25 | + return 2; | ||
26 | + case TopicType.questionCharSelect: | ||
27 | + return 3; | ||
28 | + case TopicType.questionImageSelect: | ||
29 | + return 4; | ||
30 | + case TopicType.voiceQuestion: | ||
31 | + return 5; | ||
32 | + default: | ||
33 | + throw ArgumentError('Unknown topic type'); | ||
34 | + } | ||
35 | + } | ||
36 | +} |
lib/pages/section/bloc/section_bloc.dart
@@ -46,19 +46,22 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | @@ -46,19 +46,22 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | ||
46 | 46 | ||
47 | CourseProcessEntity? get processEntity => _processEntity; | 47 | CourseProcessEntity? get processEntity => _processEntity; |
48 | 48 | ||
49 | - SectionBloc(this._courseUnitEntity, this._courseUnitDetail, this._pageController, this._listController) : super(LessonInitial()) { | 49 | + SectionBloc(this._courseUnitEntity, this._courseUnitDetail, |
50 | + this._pageController, this._listController) | ||
51 | + : super(LessonInitial()) { | ||
50 | on<RequestDataEvent>(_requestData); | 52 | on<RequestDataEvent>(_requestData); |
51 | - on<RequestExitClassEvent>(_requestExitClass); | ||
52 | on<RequestEndClassEvent>(_requestEndClass); | 53 | on<RequestEndClassEvent>(_requestEndClass); |
53 | on<RequestEnterClassEvent>(_requestEnterClass); | 54 | on<RequestEnterClassEvent>(_requestEnterClass); |
54 | on<RequestVideoLessonEvent>(_requestVideoLesson); | 55 | on<RequestVideoLessonEvent>(_requestVideoLesson); |
55 | on<CurrentUnitIndexChangeEvent>(_pageControllerChange); | 56 | on<CurrentUnitIndexChangeEvent>(_pageControllerChange); |
56 | } | 57 | } |
57 | 58 | ||
58 | - void _requestData(RequestDataEvent event, Emitter<SectionState> emitter) async { | 59 | + void _requestData( |
60 | + RequestDataEvent event, Emitter<SectionState> emitter) async { | ||
59 | try { | 61 | try { |
60 | await loading(() async { | 62 | await loading(() async { |
61 | - _courseSectionDatas = await LessonDao.courseSection(courseUnitId: _courseUnitDetail.id!); | 63 | + _courseSectionDatas = |
64 | + await LessonDao.courseSection(courseUnitId: _courseUnitDetail.id!); | ||
62 | emitter(LessonDataLoadState()); | 65 | emitter(LessonDataLoadState()); |
63 | }); | 66 | }); |
64 | } catch (e) { | 67 | } catch (e) { |
@@ -68,68 +71,84 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | @@ -68,68 +71,84 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | ||
68 | } | 71 | } |
69 | } | 72 | } |
70 | 73 | ||
71 | - void _requestVideoLesson(RequestVideoLessonEvent event, Emitter<SectionState> emitter) async { | 74 | + void _requestVideoLesson( |
75 | + RequestVideoLessonEvent event, Emitter<SectionState> emitter) async { | ||
72 | try { | 76 | try { |
73 | await loading(() async { | 77 | await loading(() async { |
74 | _processEntity = await ListenDao.process(event.courseLessonId); | 78 | _processEntity = await ListenDao.process(event.courseLessonId); |
75 | - emitter(RequestVideoLessonState(event.courseLessonId,event.courseType)); | 79 | + emitter( |
80 | + RequestVideoLessonState(event.courseLessonId, event.courseType)); | ||
76 | }); | 81 | }); |
77 | } catch (e) { | 82 | } catch (e) { |
78 | if (e is ApiException) { | 83 | if (e is ApiException) { |
79 | - showToast(e.message??'请求失败,请检查网络连接'); | 84 | + showToast(e.message ?? '请求失败,请检查网络连接'); |
80 | } | 85 | } |
81 | } | 86 | } |
82 | } | 87 | } |
83 | 88 | ||
84 | - | ||
85 | - void _requestEnterClass(RequestEnterClassEvent event,Emitter<SectionState> emitter) async { | 89 | + void _requestEnterClass( |
90 | + RequestEnterClassEvent event, Emitter<SectionState> emitter) async { | ||
86 | try { | 91 | try { |
87 | await loading(() async { | 92 | await loading(() async { |
88 | - await ListenDao.enterClass(event.courseLessonId); | ||
89 | - emitter(RequestEnterClassState(event.courseLessonId,event.courseType)); | 93 | + await ListenDao.enterClass(event.courseLessonId); |
94 | + emitter(RequestEnterClassState(event.courseLessonId, event.courseType)); | ||
90 | }); | 95 | }); |
91 | } catch (e) { | 96 | } catch (e) { |
92 | if (e is ApiException) { | 97 | if (e is ApiException) { |
93 | - showToast(e.message??'请求失败,请检查网络连接'); | 98 | + showToast(e.message ?? '请求失败,请检查网络连接'); |
94 | } | 99 | } |
95 | } | 100 | } |
96 | } | 101 | } |
97 | 102 | ||
98 | - void _requestExitClass(RequestExitClassEvent event,Emitter<SectionState> emitter) async { | ||
99 | - await ListenDao.exitClass(event.courseLessonId,event.currentStep); | ||
100 | - } | ||
101 | - | ||
102 | - void _requestEndClass(RequestEndClassEvent event,Emitter<SectionState> emitter) async { | ||
103 | - final obj = await ListenDao.endClass(event.courseLessonId,event.currentStep); | 103 | + void _requestEndClass( |
104 | + RequestEndClassEvent event, Emitter<SectionState> emitter) async { | ||
105 | + if (event.isLastPage) { | ||
106 | + await await ListenDao.endClass(event.courseLessonId, event.currentStep, | ||
107 | + currentTime: event.currentTime); | ||
108 | + } else { | ||
109 | + await await ListenDao.exitClass(event.courseLessonId, event.currentStep, | ||
110 | + currentTime: event.currentTime); | ||
111 | + } | ||
112 | + debugPrint("WQF _requestEndClass autoNextSection=${event.autoNextSection}"); | ||
104 | if (event.autoNextSection) { | 113 | if (event.autoNextSection) { |
105 | - final nextCourseSection = getNextCourseSectionBySort(int.parse(event.courseLessonId)); | 114 | + final nextCourseSection = |
115 | + getNextCourseSectionBySort(int.parse(event.courseLessonId)); | ||
116 | + debugPrint("WQF nextCourseSection = $nextCourseSection"); | ||
106 | ///进入课堂 | 117 | ///进入课堂 |
107 | - add(RequestEnterClassEvent(nextCourseSection!.id.toString() ?? '', nextCourseSection.courseType)); | 118 | + add(RequestEnterClassEvent(nextCourseSection!.id.toString(), |
119 | + nextCourseSection.courseType)); | ||
108 | } | 120 | } |
109 | } | 121 | } |
110 | 122 | ||
111 | - void _pageControllerChange(CurrentUnitIndexChangeEvent event, | ||
112 | - Emitter<SectionState> emitter) async { | 123 | + void _pageControllerChange( |
124 | + CurrentUnitIndexChangeEvent event, Emitter<SectionState> emitter) async { | ||
113 | _currentPage = event.unitIndex; | 125 | _currentPage = event.unitIndex; |
114 | emitter(CurrentPageIndexState()); | 126 | emitter(CurrentPageIndexState()); |
115 | } | 127 | } |
116 | 128 | ||
117 | // 未锁定的页数 | 129 | // 未锁定的页数 |
118 | int unlockPageCount() { | 130 | int unlockPageCount() { |
119 | - return _courseUnitEntity.courseUnitVOList?.indexWhereOrNull((element) => element.lock == true) ?? 1; | 131 | + return _courseUnitEntity.courseUnitVOList |
132 | + ?.indexWhereOrNull((element) => element.lock == true) ?? | ||
133 | + 1; | ||
120 | } | 134 | } |
121 | 135 | ||
122 | CourseSectionEntity? getNextCourseSectionBySort(int courseLessonId) { | 136 | CourseSectionEntity? getNextCourseSectionBySort(int courseLessonId) { |
123 | - final curCourseSectionEntity = _courseSectionDatas?.firstWhere((element) => element.id == courseLessonId); | 137 | + final curCourseSectionEntity = _courseSectionDatas |
138 | + ?.firstWhere((element) => element.id == courseLessonId); | ||
124 | final curSort = curCourseSectionEntity?.sortOrder ?? 0; | 139 | final curSort = curCourseSectionEntity?.sortOrder ?? 0; |
125 | - CourseSectionEntity? nextCourseSectionEntity = _courseSectionDatas?.firstWhere((element) => element.sortOrder == curSort + 1); | 140 | + CourseSectionEntity? nextCourseSectionEntity = _courseSectionDatas |
141 | + ?.firstWhere((element) => element.sortOrder == curSort + 1); | ||
126 | if (nextCourseSectionEntity != null) { | 142 | if (nextCourseSectionEntity != null) { |
127 | return nextCourseSectionEntity; | 143 | return nextCourseSectionEntity; |
128 | } else { | 144 | } else { |
129 | ///跨unit选lesson | 145 | ///跨unit选lesson |
130 | - final curCourseUnitDetail = _courseUnitEntity.courseUnitVOList?.firstWhere((element) => element.id == curCourseSectionEntity?.courseUnitId); | 146 | + final curCourseUnitDetail = _courseUnitEntity.courseUnitVOList |
147 | + ?.firstWhere( | ||
148 | + (element) => element.id == curCourseSectionEntity?.courseUnitId); | ||
131 | if (curCourseUnitDetail != null) { | 149 | if (curCourseUnitDetail != null) { |
132 | - final nextCourseUnitDetail = _courseUnitEntity.courseUnitVOList?.firstWhere((element) => element.sortOrder == 0); | 150 | + final nextCourseUnitDetail = _courseUnitEntity.courseUnitVOList |
151 | + ?.firstWhere((element) => element.sortOrder == 0); | ||
133 | if (nextCourseUnitDetail != null) { | 152 | if (nextCourseUnitDetail != null) { |
134 | ///pageView翻页了,可能需要预加载 todo | 153 | ///pageView翻页了,可能需要预加载 todo |
135 | return null; | 154 | return null; |
lib/pages/section/bloc/section_event.dart
@@ -9,6 +9,7 @@ class RequestDataEvent extends SectionEvent {} | @@ -9,6 +9,7 @@ class RequestDataEvent extends SectionEvent {} | ||
9 | class RequestVideoLessonEvent extends SectionEvent { | 9 | class RequestVideoLessonEvent extends SectionEvent { |
10 | final String courseLessonId; | 10 | final String courseLessonId; |
11 | final int courseType; | 11 | final int courseType; |
12 | + | ||
12 | RequestVideoLessonEvent(this.courseLessonId, this.courseType); | 13 | RequestVideoLessonEvent(this.courseLessonId, this.courseType); |
13 | } | 14 | } |
14 | 15 | ||
@@ -16,29 +17,29 @@ class RequestVideoLessonEvent extends SectionEvent { | @@ -16,29 +17,29 @@ class RequestVideoLessonEvent extends SectionEvent { | ||
16 | class RequestEnterClassEvent extends SectionEvent { | 17 | class RequestEnterClassEvent extends SectionEvent { |
17 | final String courseLessonId; | 18 | final String courseLessonId; |
18 | final int courseType; | 19 | final int courseType; |
19 | - RequestEnterClassEvent(this.courseLessonId,this.courseType); | ||
20 | -} | ||
21 | 20 | ||
22 | -///退出课堂 | ||
23 | -class RequestExitClassEvent extends SectionEvent { | ||
24 | - final String courseLessonId; | ||
25 | - final String currentStep; | ||
26 | - final String currentTime; | ||
27 | - RequestExitClassEvent(this.courseLessonId,this.currentStep,this.currentTime); | 21 | + RequestEnterClassEvent(this.courseLessonId, this.courseType); |
28 | } | 22 | } |
29 | 23 | ||
30 | ///结束课堂 | 24 | ///结束课堂 |
31 | class RequestEndClassEvent extends SectionEvent { | 25 | class RequestEndClassEvent extends SectionEvent { |
32 | final String courseLessonId; | 26 | final String courseLessonId; |
33 | final String currentStep; | 27 | final String currentStep; |
34 | - final String currentTime; | 28 | + |
29 | + ///是否是最后一页(决定调结束接口还是退出接口) | ||
30 | + final bool isLastPage; | ||
31 | + final int? currentTime; | ||
32 | + | ||
35 | ///自动进入下一环节 | 33 | ///自动进入下一环节 |
36 | final bool autoNextSection; | 34 | final bool autoNextSection; |
37 | - RequestEndClassEvent(this.courseLessonId,this.currentStep,this.currentTime,{this.autoNextSection = false}); | 35 | + |
36 | + RequestEndClassEvent(this.courseLessonId, this.currentStep, this.isLastPage, | ||
37 | + {this.currentTime, this.autoNextSection = false}); | ||
38 | } | 38 | } |
39 | 39 | ||
40 | ///页面切换 | 40 | ///页面切换 |
41 | class CurrentUnitIndexChangeEvent extends SectionEvent { | 41 | class CurrentUnitIndexChangeEvent extends SectionEvent { |
42 | final int unitIndex; | 42 | final int unitIndex; |
43 | + | ||
43 | CurrentUnitIndexChangeEvent(this.unitIndex); | 44 | CurrentUnitIndexChangeEvent(this.unitIndex); |
44 | } | 45 | } |
lib/pages/section/section_page.dart
@@ -76,8 +76,8 @@ class _SectionPageView extends StatelessWidget { | @@ -76,8 +76,8 @@ class _SectionPageView extends StatelessWidget { | ||
76 | }).then((value) { | 76 | }).then((value) { |
77 | if (value != null) { | 77 | if (value != null) { |
78 | Map<String, dynamic> dataMap = value as Map<String, dynamic>; | 78 | Map<String, dynamic> dataMap = value as Map<String, dynamic>; |
79 | - bloc.add(RequestEndClassEvent(dataMap['courseLessonId']!, '0', | ||
80 | - dataMap['currentTime']!, autoNextSection: dataMap['nextSection'] as bool)); | 79 | + bloc.add(RequestEndClassEvent(dataMap['courseLessonId']!, |
80 | + dataMap['currentTime']!, true, autoNextSection: dataMap['nextSection'] as bool)); | ||
81 | } | 81 | } |
82 | }); | 82 | }); |
83 | return; | 83 | return; |
@@ -99,9 +99,10 @@ class _SectionPageView extends StatelessWidget { | @@ -99,9 +99,10 @@ class _SectionPageView extends StatelessWidget { | ||
99 | arguments: {'courseLessonId': state.courseLessonId}) | 99 | arguments: {'courseLessonId': state.courseLessonId}) |
100 | .then((value) { | 100 | .then((value) { |
101 | if (value != null) { | 101 | if (value != null) { |
102 | - Map<String, String> dataMap = value as Map<String, String>; | ||
103 | - bloc.add(RequestExitClassEvent( | ||
104 | - dataMap['courseLessonId']!, dataMap['currentStep']!, '0')); | 102 | + Map<String, dynamic> dataMap = value as Map<String, dynamic>; |
103 | + bloc.add(RequestEndClassEvent( | ||
104 | + dataMap['courseLessonId']!, dataMap['currentStep']!, | ||
105 | + dataMap['isLastPage']! as bool, autoNextSection: dataMap['nextSection'] as bool)); | ||
105 | } | 106 | } |
106 | }); | 107 | }); |
107 | return; | 108 | return; |
@@ -113,9 +114,10 @@ class _SectionPageView extends StatelessWidget { | @@ -113,9 +114,10 @@ class _SectionPageView extends StatelessWidget { | ||
113 | arguments: {'courseLessonId': state.courseLessonId}) | 114 | arguments: {'courseLessonId': state.courseLessonId}) |
114 | .then((value) { | 115 | .then((value) { |
115 | if (value != null) { | 116 | if (value != null) { |
116 | - Map<String, String> dataMap = value as Map<String, String>; | ||
117 | - bloc.add(RequestExitClassEvent( | ||
118 | - dataMap['courseLessonId']!, dataMap['currentStep']!, '0')); | 117 | + Map<String, dynamic> dataMap = value as Map<String, dynamic>; |
118 | + bloc.add(RequestEndClassEvent( | ||
119 | + dataMap['courseLessonId']!, dataMap['currentStep']!, | ||
120 | + dataMap['isLastPage']! as bool, autoNextSection: dataMap['nextSection'] as bool)); | ||
119 | } | 121 | } |
120 | }); | 122 | }); |
121 | return; | 123 | return; |
lib/pages/section/subsection/base_section/bloc.dart
@@ -14,7 +14,7 @@ abstract class BaseSectionBloc<E extends BaseSectionEvent, | @@ -14,7 +14,7 @@ abstract class BaseSectionBloc<E extends BaseSectionEvent, | ||
14 | 14 | ||
15 | ///这里可以定义一些通用的逻辑 | 15 | ///这里可以定义一些通用的逻辑 |
16 | void sectionComplete(final VoidCallback? nextSectionTap, | 16 | void sectionComplete(final VoidCallback? nextSectionTap, |
17 | - {BuildContext? context}) { | 17 | + {VoidCallback? againSectionTap, BuildContext? context}) { |
18 | // 逻辑来标记步骤为已完成 | 18 | // 逻辑来标记步骤为已完成 |
19 | // 比如更新状态 | 19 | // 比如更新状态 |
20 | if (isCompleteDialogShow) { | 20 | if (isCompleteDialogShow) { |
@@ -38,8 +38,8 @@ abstract class BaseSectionBloc<E extends BaseSectionEvent, | @@ -38,8 +38,8 @@ abstract class BaseSectionBloc<E extends BaseSectionEvent, | ||
38 | flex: 1, | 38 | flex: 1, |
39 | child: GestureDetector( | 39 | child: GestureDetector( |
40 | onTap: () { | 40 | onTap: () { |
41 | - add(SectionAgainEvent() as E); | ||
42 | popPage(); | 41 | popPage(); |
42 | + againSectionTap!(); | ||
43 | }, | 43 | }, |
44 | child: Image.asset('section_finish_again'.assetPng), | 44 | child: Image.asset('section_finish_again'.assetPng), |
45 | ), | 45 | ), |