Commit 8fb5f8606a35fb4b298ad45468c9e3c205f52122

Authored by 吴启风
1 parent d100908a

feat:先声录音状态优化

lib/pages/practice/bloc/topic_picture_bloc.dart
... ... @@ -26,20 +26,6 @@ part 'topic_picture_event.dart';
26 26  
27 27 part 'topic_picture_state.dart';
28 28  
29   -enum VoicePlayState {
30   - ///未知
31   - unKnow,
32   -
33   - ///播放中
34   - playing,
35   -
36   - ///播放完成
37   - completed,
38   -
39   - ///播放终止
40   - stop
41   -}
42   -
43 29 class TopicPictureBloc
44 30 extends BaseSectionBloc<TopicPictureEvent, TopicPictureState> with WidgetsBindingObserver {
45 31 final PageController pageController;
... ... @@ -57,9 +43,6 @@ class TopicPictureBloc
57 43 ///正在评测
58 44 bool _isRecording = false;
59 45  
60   - ///正在播放音频
61   - VoicePlayState _voicePlayState = VoicePlayState.unKnow;
62   -
63 46 int get currentPage => _currentPage + 1;
64 47  
65 48 /// 选择题选中项
... ... @@ -67,8 +50,6 @@ class TopicPictureBloc
67 50  
68 51 bool get isRecording => _isRecording;
69 52  
70   - VoicePlayState get voicePlayState => _voicePlayState;
71   -
72 53 late MethodChannel methodChannel;
73 54  
74 55 late AudioPlayer audioPlayer;
... ... @@ -77,6 +58,8 @@ class TopicPictureBloc
77 58  
78 59 final Color? moduleColor;
79 60  
  61 + final String TAG = 'TopicPictureBloc';
  62 +
80 63 TopicPictureBloc(
81 64 this.context, this.pageController, this.courseLessonId, this.moduleColor)
82 65 : super(TopicPictureInitial()) {
... ... @@ -90,24 +73,12 @@ class TopicPictureBloc
90 73 on<XSVoiceStartEvent>(_voiceXsStart);
91 74 on<XSVoiceStopEvent>(_voiceXsStop);
92 75 on<VoicePlayEvent>(_questionVoicePlay);
  76 + on<OnXSVoiceStateChangeEvent>(_onVoiceXsStateChange);
93 77 on<InitBlocEvent>((event, emit) {
94 78 //音频播放器
95 79 audioPlayer = AudioPlayer();
96 80 audioPlayer.onPlayerStateChanged.listen((event) async {
97   - debugPrint('播放状态变化 _voicePlayState=$_voicePlayState event=$event');
98   - if (event == PlayerState.completed) {
99   - debugPrint('播放完成');
100   - _voicePlayState = VoicePlayState.completed;
101   - }
102   - if (event == PlayerState.stopped) {
103   - debugPrint('播放结束');
104   - _voicePlayState = VoicePlayState.stop;
105   - }
106   -
107   - if (event == PlayerState.playing) {
108   - debugPrint('正在播放中');
109   - _voicePlayState = VoicePlayState.playing;
110   - }
  81 + Log.d('$TAG onPlayerStateChanged event=$event');
111 82 if (isClosed) {
112 83 return;
113 84 }
... ... @@ -130,16 +101,20 @@ class TopicPictureBloc
130 101 if (kDebugMode) {
131 102 print('评测开始');
132 103 }
  104 + _isRecording = true;
  105 + add(OnXSVoiceStateChangeEvent());
133 106 return;
134 107 }
135 108  
136   - if (call.method == 'voiceEnd') {
  109 + if (call.method == 'voiceEnd' || call.method == 'voiceCancel') {
137 110 await audioPlayer.setAudioContext(AudioContext());
138 111 await audioPlayer.setBalance(0.0);
139 112 //评测结束
140 113 if (kDebugMode) {
141   - print('评测结束');
  114 + print(call.method == 'voiceEnd' ? '评测结束' : '评测取消');
142 115 }
  116 + _isRecording = false;
  117 + add(OnXSVoiceStateChangeEvent());
143 118 return;
144 119 }
145 120  
... ... @@ -148,6 +123,8 @@ class TopicPictureBloc
148 123 await audioPlayer.setAudioContext(AudioContext());
149 124 await audioPlayer.setBalance(0.0);
150 125  
  126 + _isRecording = false;
  127 + add(OnXSVoiceStateChangeEvent());
151 128 EasyLoading.showToast('评测失败');
152 129 return;
153 130 }
... ... @@ -157,10 +134,15 @@ class TopicPictureBloc
157 134 });
158 135 }
159 136  
  137 + void _onVoiceXsStateChange(OnXSVoiceStateChangeEvent event,
  138 + Emitter<TopicPictureState> emitter) async {
  139 + emitter(XSVoiceTestState());
  140 + }
  141 +
160 142 @override
161 143 Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
162 144 super.didChangeAppLifecycleState(state);
163   - Log.d('TopicPictureBloc didChangeAppLifecycleState state=$state');
  145 + Log.d('$TAG didChangeAppLifecycleState state=$state');
164 146 if (state == AppLifecycleState.paused) {
165 147 ///切到后台暂停音频播放、录音等
166 148 if (audioPlayer.state == PlayerState.playing) {
... ... @@ -197,7 +179,7 @@ class TopicPictureBloc
197 179 void _pageControllerChange(CurrentPageIndexChangeEvent event,
198 180 Emitter<TopicPictureState> emitter) async {
199 181 await pageResetIfNeed();
200   - debugPrint('翻页 $_currentPage->${event.pageIndex}');
  182 + Log.d('$TAG _pageControllerChange $_currentPage->${event.pageIndex}');
201 183 if (_currentPage == _entity?.topics?.length) {
202 184 return;
203 185 }
... ... @@ -276,8 +258,6 @@ class TopicPictureBloc
276 258 'type': event.type,
277 259 'userId': event.userId.toString()
278 260 });
279   - _isRecording = true;
280   - emitter(XSVoiceTestState());
281 261 }
282 262 }
283 263  
... ... @@ -321,6 +301,10 @@ class TopicPictureBloc
321 301 emitter(VoicePlayStateChange());
322 302 }
323 303  
  304 + bool isAudioPlaying() {
  305 + return audioPlayer.state == PlayerState.playing;
  306 + }
  307 +
324 308 // 题目音频播放
325 309 void _questionVoicePlay(
326 310 VoicePlayEvent event, Emitter<TopicPictureState> emitter) async {
... ... @@ -335,7 +319,6 @@ class TopicPictureBloc
335 319 Future<void> pageResetIfNeed() async {
336 320 _optionSelectItem = -1;
337 321 _isRecording = false;
338   - _voicePlayState = VoicePlayState.stop;
339 322  
340 323 await closePlayerResource();
341 324 await _voiceXsCancel();
... ... @@ -347,7 +330,7 @@ class TopicPictureBloc
347 330 }
348 331  
349 332 Future<void> closePlayerResource() async {
350   - if (voicePlayState == VoicePlayState.playing) {
  333 + if (isAudioPlaying()) {
351 334 await audioPlayer.stop();
352 335 }
353 336 }
... ...
lib/pages/practice/bloc/topic_picture_event.dart
... ... @@ -30,6 +30,9 @@ class XSVoiceResultEvent extends TopicPictureEvent {
30 30 XSVoiceResultEvent(this.message);
31 31 }
32 32  
  33 +///先声评测状态
  34 +class OnXSVoiceStateChangeEvent extends TopicPictureEvent {}
  35 +
33 36 ///音频播放状态变化
34 37 class VoicePlayStateChangeEvent extends TopicPictureEvent {}
35 38  
... ...
lib/pages/practice/topic_picture_page.dart
... ... @@ -311,7 +311,7 @@ class _TopicPicturePage extends StatelessWidget {
311 311 children: [
312 312 SpeakerWidget(
313 313 isPlaying: isCurrentPage &&
314   - bloc.voicePlayState == VoicePlayState.playing,
  314 + bloc.isAudioPlaying(),
315 315 // 控制动画播放
316 316 width: 32.w,
317 317 height: 32.w,
... ... @@ -392,7 +392,7 @@ class _TopicPicturePage extends StatelessWidget {
392 392 children: [
393 393 SpeakerWidget(
394 394 isPlaying: isCurrentPage &&
395   - bloc.voicePlayState == VoicePlayState.playing,
  395 + bloc.isAudioPlaying(),
396 396 width: 32.w,
397 397 height: 32.w,
398 398 onTap: () {
... ... @@ -505,7 +505,7 @@ class _TopicPicturePage extends StatelessWidget {
505 505 children: [
506 506 SpeakerWidget(
507 507 isPlaying: isCurrentPage &&
508   - bloc.voicePlayState == VoicePlayState.playing,
  508 + bloc.isAudioPlaying(),
509 509 // 控制动画播放
510 510 isClickable: !bloc.isRecording,
511 511 // 控制是否可点击
... ...
lib/pages/reading/bloc/reading_bloc.dart
... ... @@ -170,10 +170,11 @@ class ReadingPageBloc
170 170  
171 171 if (call.method == 'voiceFail') {
172 172 //评测失败
173   - _isRecording = false;
174 173 await audioPlayer.setAudioContext(AudioContext());
175 174 await audioPlayer.setBalance(0.0);
176 175  
  176 + _isRecording = false;
  177 + add(OnXSVoiceStateChangeEvent());
177 178 EasyLoading.showToast('评测失败');
178 179 return;
179 180 }
... ...