Commit d0623cfde9d8fc3f04604441f5546fae59d6c673

Authored by 吴启风
1 parent 819ae43b

feat:绘本作答结果动效

assets/lotties/good.zip
No preview for this file type
assets/lotties/recorder_playback.zip
No preview for this file type
lib/common/widgets/record_playback_widget.dart
... ... @@ -67,7 +67,7 @@ class _RecorderPlaybackWidgetState extends State<RecorderPlaybackWidget>
67 67 }
68 68  
69 69 Future<void> _loadComposition() async {
70   - _futureComposition = AssetLottie('assets/lotties/recorder_back.zip').load();
  70 + _futureComposition = AssetLottie('assets/lotties/recorder_playback.zip').load();
71 71 }
72 72  
73 73 void _playAnimation() {
... ...
lib/pages/reading/bloc/reading_bloc.dart
... ... @@ -5,6 +5,7 @@ import &#39;package:flutter/services.dart&#39;;
5 5 import 'package:flutter_bloc/flutter_bloc.dart';
6 6 import 'package:flutter_easyloading/flutter_easyloading.dart';
7 7 import 'package:permission_handler/permission_handler.dart';
  8 +import 'package:wow_english/common/extension/string_extension.dart';
8 9 import 'package:wow_english/pages/reading/widgets/ReadingModeType.dart';
9 10 import 'package:wow_english/pages/section/subsection/base_section/bloc.dart';
10 11 import 'package:wow_english/pages/section/subsection/base_section/event.dart';
... ... @@ -14,13 +15,17 @@ import &#39;../../../common/core/user_util.dart&#39;;
14 15 import '../../../common/permission/permissionRequester.dart';
15 16 import '../../../common/request/dao/listen_dao.dart';
16 17 import '../../../common/request/exception.dart';
  18 +import '../../../common/utils/click_with_music_controller.dart';
  19 +import '../../../common/utils/show_star_reward_dialog.dart';
17 20 import '../../../models/course_process_entity.dart';
  21 +import '../../../models/voice_result_type.dart';
18 22 import '../../../route/route.dart';
19 23 import '../../../utils/loading.dart';
20 24  
21 25 import '../../../utils/log_util.dart';
22 26  
23 27 part 'reading_event.dart';
  28 +
24 29 part 'reading_state.dart';
25 30  
26 31 enum VoicePlayState {
... ... @@ -340,8 +345,8 @@ class ReadingPageBloc
340 345 ///开始录音
341 346 void startRecord(String content) async {
342 347 // 调用封装好的权限检查和请求方法
343   - bool result =
344   - await requestPermission(context, Permission.microphone, "录音", "用于开启录音,识别您的开口作答并给出反馈");
  348 + bool result = await requestPermission(
  349 + context, Permission.microphone, "录音", "用于开启录音,识别您的开口作答并给出反馈");
345 350 if (result) {
346 351 methodChannel.invokeMethod('startVoice', {
347 352 'word': content,
... ... @@ -357,27 +362,35 @@ class ReadingPageBloc
357 362 final result = args['result'] as Map;
358 363 Log.d("_voiceXsResult result=$result");
359 364 final overall = result['overall'].toString();
360   - EasyLoading.showToast('测评成功,分数是$overall',
361   - duration: const Duration(seconds: 2));
  365 +
  366 + ///todo 后面可以考虑要不要传自己的服务器
  367 + final recordFileUrl = args['audioUrl'].toString();
  368 + int score = int.parse(overall);
362 369 currentPageData()?.recordScore = overall;
363   - currentPageData()?.recordUrl = args['audioUrl'] + '.mp3';
  370 + currentPageData()?.recordUrl = recordFileUrl.assetMp3;
364 371  
365   - ///完成录音后紧接着播放录音
366   - await _playRecordAudioInner();
367   - if (isLastPage()) {
368   - sectionComplete(() {
369   - popPage(data: {
370   - 'currentStep': currentPage,
371   - 'courseLessonId': courseLessonId,
372   - 'isCompleted': true,
373   - 'nextSection': true
374   - });
375   - }, againSectionTap: () {
376   - _resetLocalResult();
377   - pageController.jumpToPage(0);
378   - });
  372 + final voiceResult = VoiceResultType.fromScore(score);
  373 + if (voiceResult.lottieFilePath != null) {
  374 + showCheerRewardDialog(context, lottieFile: voiceResult.lottieFilePath!);
379 375 }
380   - // emitter(FeedbackState());
  376 + await ClickWithMusicController.instance
  377 + .playMusicAndPerformAction(context, voiceResult.audioType, () async {
  378 + ///完成录音后紧接着播放录音
  379 + await _playRecordAudioInner();
  380 + if (isLastPage()) {
  381 + sectionComplete(() {
  382 + popPage(data: {
  383 + 'currentStep': currentPage,
  384 + 'courseLessonId': courseLessonId,
  385 + 'isCompleted': true,
  386 + 'nextSection': true
  387 + });
  388 + }, againSectionTap: () {
  389 + _resetLocalResult();
  390 + pageController.jumpToPage(0);
  391 + });
  392 + }
  393 + });
381 394 }
382 395  
383 396 ///终止评测
... ...
lib/pages/reading/reading_page.dart
... ... @@ -8,6 +8,7 @@ import &#39;package:wow_english/route/route.dart&#39;;
8 8  
9 9 import '../../common/core/app_consts.dart';
10 10 import '../../common/core/user_util.dart';
  11 +import '../../common/widgets/record_playback_widget.dart';
11 12 import '../../common/widgets/recorder_widget.dart';
12 13 import '../../common/widgets/speaker_widget.dart';
13 14 import '../../models/course_process_entity.dart';
... ... @@ -186,8 +187,6 @@ class _ReadingPage extends StatelessWidget {
186 187 ),
187 188 RecorderWidget(
188 189 isPlaying: bloc.isRecording,
189   - isClickable:
190   - bloc.voicePlayState != VoicePlayState.playing,
191 190 width: 60.w,
192 191 height: 60.w,
193 192 onTap: () {
... ... @@ -202,23 +201,15 @@ class _ReadingPage extends StatelessWidget {
202 201 SizedBox(
203 202 width: 10.w,
204 203 ),
205   - GestureDetector(
206   - onTap: () {
207   - if (bloc.isRecording) {
208   - return;
209   - }
210   - bloc.add(PlayRecordAudioEvent());
211   - },
212   - child: Visibility(
213   - visible: bloc.currentPageData()?.recordUrl != null,
214   - child: Image.asset(
215   - bloc.isRecordAudioPlaying
216   - ? 'record_pause'.assetWebp
217   - : 'record_play'.assetWebp,
218   - height: 33.h,
219   - width: 33.w,
220   - ),
221   - )),
  204 + RecorderPlaybackWidget(
  205 + isClickable: !bloc.isRecording && bloc.currentPageData()?.recordUrl != null,
  206 + isPlaying: bloc.isRecordAudioPlaying,
  207 + width: 42.w,
  208 + height: 42.w,
  209 + onTap: () {
  210 + bloc.add(PlayRecordAudioEvent());
  211 + },
  212 + )
222 213 ],
223 214 ),
224 215 ),
... ...