From d0623cfde9d8fc3f04604441f5546fae59d6c673 Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Sat, 3 Aug 2024 10:49:11 +0800 Subject: [PATCH] feat:绘本作答结果动效 --- assets/lotties/good.zip | Bin 9765 -> 0 bytes assets/lotties/recorder_playback.zip | Bin 15248 -> 0 bytes lib/common/widgets/record_playback_widget.dart | 2 +- lib/pages/reading/bloc/reading_bloc.dart | 53 +++++++++++++++++++++++++++++++++-------------------- lib/pages/reading/reading_page.dart | 29 ++++++++++------------------- 5 files changed, 44 insertions(+), 40 deletions(-) diff --git a/assets/lotties/good.zip b/assets/lotties/good.zip index 5ecb036..877c551 100644 Binary files a/assets/lotties/good.zip and b/assets/lotties/good.zip differ diff --git a/assets/lotties/recorder_playback.zip b/assets/lotties/recorder_playback.zip index dfb9c9a..d75099a 100644 Binary files a/assets/lotties/recorder_playback.zip and b/assets/lotties/recorder_playback.zip differ diff --git a/lib/common/widgets/record_playback_widget.dart b/lib/common/widgets/record_playback_widget.dart index 233df88..62bafe0 100644 --- a/lib/common/widgets/record_playback_widget.dart +++ b/lib/common/widgets/record_playback_widget.dart @@ -67,7 +67,7 @@ class _RecorderPlaybackWidgetState extends State } Future _loadComposition() async { - _futureComposition = AssetLottie('assets/lotties/recorder_back.zip').load(); + _futureComposition = AssetLottie('assets/lotties/recorder_playback.zip').load(); } void _playAnimation() { diff --git a/lib/pages/reading/bloc/reading_bloc.dart b/lib/pages/reading/bloc/reading_bloc.dart index d3e304b..e3d16bb 100644 --- a/lib/pages/reading/bloc/reading_bloc.dart +++ b/lib/pages/reading/bloc/reading_bloc.dart @@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/pages/reading/widgets/ReadingModeType.dart'; import 'package:wow_english/pages/section/subsection/base_section/bloc.dart'; import 'package:wow_english/pages/section/subsection/base_section/event.dart'; @@ -14,13 +15,17 @@ import '../../../common/core/user_util.dart'; import '../../../common/permission/permissionRequester.dart'; import '../../../common/request/dao/listen_dao.dart'; import '../../../common/request/exception.dart'; +import '../../../common/utils/click_with_music_controller.dart'; +import '../../../common/utils/show_star_reward_dialog.dart'; import '../../../models/course_process_entity.dart'; +import '../../../models/voice_result_type.dart'; import '../../../route/route.dart'; import '../../../utils/loading.dart'; import '../../../utils/log_util.dart'; part 'reading_event.dart'; + part 'reading_state.dart'; enum VoicePlayState { @@ -340,8 +345,8 @@ class ReadingPageBloc ///开始录音 void startRecord(String content) async { // 调用封装好的权限检查和请求方法 - bool result = - await requestPermission(context, Permission.microphone, "录音", "用于开启录音,识别您的开口作答并给出反馈"); + bool result = await requestPermission( + context, Permission.microphone, "录音", "用于开启录音,识别您的开口作答并给出反馈"); if (result) { methodChannel.invokeMethod('startVoice', { 'word': content, @@ -357,27 +362,35 @@ class ReadingPageBloc final result = args['result'] as Map; Log.d("_voiceXsResult result=$result"); final overall = result['overall'].toString(); - EasyLoading.showToast('测评成功,分数是$overall', - duration: const Duration(seconds: 2)); + + ///todo 后面可以考虑要不要传自己的服务器 + final recordFileUrl = args['audioUrl'].toString(); + int score = int.parse(overall); currentPageData()?.recordScore = overall; - currentPageData()?.recordUrl = args['audioUrl'] + '.mp3'; + currentPageData()?.recordUrl = recordFileUrl.assetMp3; - ///完成录音后紧接着播放录音 - await _playRecordAudioInner(); - if (isLastPage()) { - sectionComplete(() { - popPage(data: { - 'currentStep': currentPage, - 'courseLessonId': courseLessonId, - 'isCompleted': true, - 'nextSection': true - }); - }, againSectionTap: () { - _resetLocalResult(); - pageController.jumpToPage(0); - }); + final voiceResult = VoiceResultType.fromScore(score); + if (voiceResult.lottieFilePath != null) { + showCheerRewardDialog(context, lottieFile: voiceResult.lottieFilePath!); } - // emitter(FeedbackState()); + await ClickWithMusicController.instance + .playMusicAndPerformAction(context, voiceResult.audioType, () async { + ///完成录音后紧接着播放录音 + await _playRecordAudioInner(); + if (isLastPage()) { + sectionComplete(() { + popPage(data: { + 'currentStep': currentPage, + 'courseLessonId': courseLessonId, + 'isCompleted': true, + 'nextSection': true + }); + }, againSectionTap: () { + _resetLocalResult(); + pageController.jumpToPage(0); + }); + } + }); } ///终止评测 diff --git a/lib/pages/reading/reading_page.dart b/lib/pages/reading/reading_page.dart index 46667f6..f427558 100644 --- a/lib/pages/reading/reading_page.dart +++ b/lib/pages/reading/reading_page.dart @@ -8,6 +8,7 @@ import 'package:wow_english/route/route.dart'; import '../../common/core/app_consts.dart'; import '../../common/core/user_util.dart'; +import '../../common/widgets/record_playback_widget.dart'; import '../../common/widgets/recorder_widget.dart'; import '../../common/widgets/speaker_widget.dart'; import '../../models/course_process_entity.dart'; @@ -186,8 +187,6 @@ class _ReadingPage extends StatelessWidget { ), RecorderWidget( isPlaying: bloc.isRecording, - isClickable: - bloc.voicePlayState != VoicePlayState.playing, width: 60.w, height: 60.w, onTap: () { @@ -202,23 +201,15 @@ class _ReadingPage extends StatelessWidget { SizedBox( width: 10.w, ), - GestureDetector( - onTap: () { - if (bloc.isRecording) { - return; - } - bloc.add(PlayRecordAudioEvent()); - }, - child: Visibility( - visible: bloc.currentPageData()?.recordUrl != null, - child: Image.asset( - bloc.isRecordAudioPlaying - ? 'record_pause'.assetWebp - : 'record_play'.assetWebp, - height: 33.h, - width: 33.w, - ), - )), + RecorderPlaybackWidget( + isClickable: !bloc.isRecording && bloc.currentPageData()?.recordUrl != null, + isPlaying: bloc.isRecordAudioPlaying, + width: 42.w, + height: 42.w, + onTap: () { + bloc.add(PlayRecordAudioEvent()); + }, + ) ], ), ), -- libgit2 0.22.2