Commit 820997e60600aa3f953e49bab5b06ea4c6ebf9ad
1 parent
66a7e3e7
feat:过渡页-绘本环节
Showing
5 changed files
with
66 additions
and
24 deletions
lib/pages/reading/bloc/reading_bloc.dart
| @@ -6,11 +6,15 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | @@ -6,11 +6,15 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | ||
| 6 | import 'package:flutter_easyloading/flutter_easyloading.dart'; | 6 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
| 7 | import 'package:permission_handler/permission_handler.dart'; | 7 | import 'package:permission_handler/permission_handler.dart'; |
| 8 | import 'package:wow_english/pages/reading/widgets/ReadingModeType.dart'; | 8 | import 'package:wow_english/pages/reading/widgets/ReadingModeType.dart'; |
| 9 | +import 'package:wow_english/pages/section/subsection/base_section/bloc.dart'; | ||
| 10 | +import 'package:wow_english/pages/section/subsection/base_section/event.dart'; | ||
| 11 | +import 'package:wow_english/pages/section/subsection/base_section/state.dart'; | ||
| 9 | 12 | ||
| 10 | import '../../../common/core/user_util.dart'; | 13 | import '../../../common/core/user_util.dart'; |
| 11 | import '../../../common/request/dao/listen_dao.dart'; | 14 | import '../../../common/request/dao/listen_dao.dart'; |
| 12 | import '../../../common/request/exception.dart'; | 15 | import '../../../common/request/exception.dart'; |
| 13 | import '../../../models/course_process_entity.dart'; | 16 | import '../../../models/course_process_entity.dart'; |
| 17 | +import '../../../route/route.dart'; | ||
| 14 | import '../../../utils/loading.dart'; | 18 | import '../../../utils/loading.dart'; |
| 15 | 19 | ||
| 16 | import '../../../utils/log_util.dart'; | 20 | import '../../../utils/log_util.dart'; |
| @@ -33,7 +37,8 @@ enum VoicePlayState { | @@ -33,7 +37,8 @@ enum VoicePlayState { | ||
| 33 | stop | 37 | stop |
| 34 | } | 38 | } |
| 35 | 39 | ||
| 36 | -class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | 40 | +class ReadingPageBloc |
| 41 | + extends BaseSectionBloc<ReadingPageEvent, ReadingPageState> { | ||
| 37 | final PageController pageController; | 42 | final PageController pageController; |
| 38 | 43 | ||
| 39 | final String courseLessonId; | 44 | final String courseLessonId; |
| @@ -211,7 +216,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -211,7 +216,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 211 | } | 216 | } |
| 212 | 217 | ||
| 213 | ///播放原音音频 | 218 | ///播放原音音频 |
| 214 | - Future<void> _playOriginalAudioInner(String? audioUrl) async { | 219 | + void _playOriginalAudioInner(String? audioUrl) async { |
| 215 | if (_isRecordAudioPlaying) { | 220 | if (_isRecordAudioPlaying) { |
| 216 | _isRecordAudioPlaying = false; | 221 | _isRecordAudioPlaying = false; |
| 217 | } | 222 | } |
| @@ -219,7 +224,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -219,7 +224,7 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 219 | "_playOriginalAudio _isRecordAudioPlaying=$_isRecordAudioPlaying _isOriginAudioPlaying=$_isOriginAudioPlaying url=$audioUrl"); | 224 | "_playOriginalAudio _isRecordAudioPlaying=$_isRecordAudioPlaying _isOriginAudioPlaying=$_isOriginAudioPlaying url=$audioUrl"); |
| 220 | if (_isOriginAudioPlaying) { | 225 | if (_isOriginAudioPlaying) { |
| 221 | _isOriginAudioPlaying = false; | 226 | _isOriginAudioPlaying = false; |
| 222 | - await audioPlayer.stop(); | 227 | + audioPlayer.stop(); |
| 223 | } else { | 228 | } else { |
| 224 | _isOriginAudioPlaying = true; | 229 | _isOriginAudioPlaying = true; |
| 225 | audioUrl ??= currentPageData()?.audioUrl ?? ''; | 230 | audioUrl ??= currentPageData()?.audioUrl ?? ''; |
| @@ -265,8 +270,17 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -265,8 +270,17 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 265 | } | 270 | } |
| 266 | 271 | ||
| 267 | void nextPage() { | 272 | void nextPage() { |
| 268 | - if (_currentPage >= dataCount() - 1) { | ||
| 269 | - ///todo 最后一页了 | 273 | + if (currentPage >= dataCount()) { |
| 274 | + sectionComplete(() { | ||
| 275 | + popPage(data: { | ||
| 276 | + 'currentStep': currentPage, | ||
| 277 | + 'courseLessonId': courseLessonId, | ||
| 278 | + 'isCompleted': true, | ||
| 279 | + 'nextSection': true | ||
| 280 | + }); | ||
| 281 | + }, againSectionTap: () { | ||
| 282 | + pageController.jumpToPage(0); | ||
| 283 | + }); | ||
| 270 | } else { | 284 | } else { |
| 271 | _currentPage += 1; | 285 | _currentPage += 1; |
| 272 | pageController.nextPage( | 286 | pageController.nextPage( |
| @@ -291,14 +305,14 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -291,14 +305,14 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 291 | 305 | ||
| 292 | void startRecord(String content) async { | 306 | void startRecord(String content) async { |
| 293 | // 调用封装好的权限检查和请求方法 | 307 | // 调用封装好的权限检查和请求方法 |
| 294 | - bool result = await permissionCheckAndRequest( | ||
| 295 | - context, | ||
| 296 | - Permission.microphone, | ||
| 297 | - "录音" | ||
| 298 | - ); | 308 | + bool result = |
| 309 | + await permissionCheckAndRequest(context, Permission.microphone, "录音"); | ||
| 299 | if (result) { | 310 | if (result) { |
| 300 | - methodChannel.invokeMethod( | ||
| 301 | - 'startVoice', {'word': content, 'type': '0', 'userId': UserUtil.getUser()?.id.toString()}); | 311 | + methodChannel.invokeMethod('startVoice', { |
| 312 | + 'word': content, | ||
| 313 | + 'type': '0', | ||
| 314 | + 'userId': UserUtil.getUser()?.id.toString() | ||
| 315 | + }); | ||
| 302 | } | 316 | } |
| 303 | } | 317 | } |
| 304 | 318 | ||
| @@ -313,7 +327,20 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -313,7 +327,20 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 313 | currentPageData()?.recordScore = overall; | 327 | currentPageData()?.recordScore = overall; |
| 314 | currentPageData()?.recordUrl = args['audioUrl'] + '.mp3'; | 328 | currentPageData()?.recordUrl = args['audioUrl'] + '.mp3'; |
| 315 | ///完成录音后紧接着播放录音 | 329 | ///完成录音后紧接着播放录音 |
| 316 | - _playRecordAudioInner(); | 330 | + await _playRecordAudioInner(); |
| 331 | + if (isLastPage()) { | ||
| 332 | + sectionComplete(() { | ||
| 333 | + popPage(data: { | ||
| 334 | + 'currentStep': currentPage, | ||
| 335 | + 'courseLessonId': courseLessonId, | ||
| 336 | + 'isCompleted': true, | ||
| 337 | + 'nextSection': true | ||
| 338 | + }); | ||
| 339 | + }, againSectionTap: () { | ||
| 340 | + _resetLocalResult(); | ||
| 341 | + pageController.jumpToPage(0); | ||
| 342 | + }); | ||
| 343 | + } | ||
| 317 | // emitter(FeedbackState()); | 344 | // emitter(FeedbackState()); |
| 318 | } | 345 | } |
| 319 | 346 | ||
| @@ -338,8 +365,11 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -338,8 +365,11 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 338 | nextPage(); | 365 | nextPage(); |
| 339 | } | 366 | } |
| 340 | 367 | ||
| 341 | - Log.d("_onAudioPlayComplete _isOriginAudioPlaying=$_isOriginAudioPlaying _voicePlayState=$_voicePlayState recordUrl=${currentPageData()?.recordUrl?.isNotEmpty}"); | ||
| 342 | - if (_isOriginAudioPlaying && _voicePlayState == VoicePlayState.completed && currentPageData()?.recordUrl?.isNotEmpty != true) { | 368 | + Log.d( |
| 369 | + "_onAudioPlayComplete _isOriginAudioPlaying=$_isOriginAudioPlaying _voicePlayState=$_voicePlayState recordUrl=${currentPageData()?.recordUrl?.isNotEmpty}"); | ||
| 370 | + if (_isOriginAudioPlaying && | ||
| 371 | + _voicePlayState == VoicePlayState.completed && | ||
| 372 | + currentPageData()?.recordUrl?.isNotEmpty != true) { | ||
| 343 | ///如果刚刚完成原音播放&&录音为空,则开始录音 | 373 | ///如果刚刚完成原音播放&&录音为空,则开始录音 |
| 344 | startRecord(currentPageData()?.word ?? ''); | 374 | startRecord(currentPageData()?.word ?? ''); |
| 345 | } | 375 | } |
| @@ -354,11 +384,21 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | @@ -354,11 +384,21 @@ class ReadingPageBloc extends Bloc<ReadingPageEvent, ReadingPageState> { | ||
| 354 | _isRecordAudioPlaying = false; | 384 | _isRecordAudioPlaying = false; |
| 355 | } | 385 | } |
| 356 | 386 | ||
| 357 | - void _onVoiceXsStateChange( | ||
| 358 | - OnXSVoiceStateChangeEvent event, | ||
| 359 | - Emitter<ReadingPageState> emitter | ||
| 360 | - ) async { | 387 | + void _onVoiceXsStateChange(OnXSVoiceStateChangeEvent event, |
| 388 | + Emitter<ReadingPageState> emitter) async { | ||
| 361 | emitter(XSVoiceTestState()); | 389 | emitter(XSVoiceTestState()); |
| 362 | } | 390 | } |
| 363 | -} | ||
| 364 | 391 | ||
| 392 | + ///是否是最后一页 | ||
| 393 | + bool isLastPage() { | ||
| 394 | + return currentPage == dataCount(); | ||
| 395 | + } | ||
| 396 | + | ||
| 397 | + ///重置数据 | ||
| 398 | + void _resetLocalResult() { | ||
| 399 | + _entity?.readings?.forEach((element) { | ||
| 400 | + element.recordScore = null; | ||
| 401 | + element.recordUrl = null; | ||
| 402 | + }); | ||
| 403 | + } | ||
| 404 | +} |
lib/pages/reading/bloc/reading_event.dart
| 1 | part of 'reading_bloc.dart'; | 1 | part of 'reading_bloc.dart'; |
| 2 | 2 | ||
| 3 | @immutable | 3 | @immutable |
| 4 | -abstract class ReadingPageEvent {} | 4 | +abstract class ReadingPageEvent extends BaseSectionEvent {} |
| 5 | 5 | ||
| 6 | ///页面初始化 | 6 | ///页面初始化 |
| 7 | class InitBlocEvent extends ReadingPageEvent {} | 7 | class InitBlocEvent extends ReadingPageEvent {} |
lib/pages/reading/bloc/reading_state.dart
| 1 | part of 'reading_bloc.dart'; | 1 | part of 'reading_bloc.dart'; |
| 2 | 2 | ||
| 3 | @immutable | 3 | @immutable |
| 4 | -abstract class ReadingPageState {} | 4 | +abstract class ReadingPageState extends BaseSectionState {} |
| 5 | 5 | ||
| 6 | class ReadingPageInitial extends ReadingPageState {} | 6 | class ReadingPageInitial extends ReadingPageState {} |
| 7 | 7 |
lib/pages/reading/reading_page.dart
| @@ -88,8 +88,9 @@ class _ReadingPage extends StatelessWidget { | @@ -88,8 +88,9 @@ class _ReadingPage extends StatelessWidget { | ||
| 88 | onPressed: () { | 88 | onPressed: () { |
| 89 | popPage( | 89 | popPage( |
| 90 | data:{ | 90 | data:{ |
| 91 | - 'currentStep':bloc.currentPage.toString(), | ||
| 92 | - 'courseLessonId':bloc.courseLessonId | 91 | + 'currentStep':bloc.currentPage, |
| 92 | + 'courseLessonId':bloc.courseLessonId, | ||
| 93 | + 'isCompleted':bloc.isLastPage(), | ||
| 93 | } | 94 | } |
| 94 | ); | 95 | ); |
| 95 | }, | 96 | }, |
lib/pages/section/bloc/section_bloc.dart
| @@ -111,6 +111,7 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | @@ -111,6 +111,7 @@ class SectionBloc extends Bloc<SectionEvent, SectionState> { | ||
| 111 | if (event.autoNextSection) { | 111 | if (event.autoNextSection) { |
| 112 | final nextCourseSection = | 112 | final nextCourseSection = |
| 113 | getNextCourseSection(int.parse(event.courseLessonId)); | 113 | getNextCourseSection(int.parse(event.courseLessonId)); |
| 114 | + debugPrint("WQF nextCourseSection: $nextCourseSection"); | ||
| 114 | ///进入课堂 | 115 | ///进入课堂 |
| 115 | add(RequestEnterClassEvent(nextCourseSection!.id.toString(), | 116 | add(RequestEnterClassEvent(nextCourseSection!.id.toString(), |
| 116 | nextCourseSection.courseType)); | 117 | nextCourseSection.courseType)); |