import 'package:bloc/bloc.dart';
import 'package:meta/meta.dart';
import 'package:template_mobile/core/sevices/speech_recognition_service.dart';
import 'package:template_mobile/core/state/event/speech_recognition_event.dart';
import 'package:template_mobile/core/state/state/speech_recognition_state.dart';
class SpeechRecognitionBloc
extends Bloc<SpeechRecognitionEvent, SpeechRecognitionState> {
final SpeechRecognitionService speechRecognitionService;
SpeechRecognitionBloc({
@required this.speechRecognitionService,
}) : assert(speechRecognitionService != null) {
speechRecognitionService.errors.stream.listen((errorResult) {
add(SpeechRecognitionErrorEvent(
error: "${errorResult.errorMsg} - ${errorResult.permanent}",
));
});
speechRecognitionService.statuses.stream.listen((status) {
if (state is SpeechRecognitionRecognizedState) {
var currentState = state as SpeechRecognitionRecognizedState;
if (currentState.finalResult) {
add(SpeechRecognitionStatusChangedEvent());
}
}
});
speechRecognitionService.words.stream.listen((speechResult) {
add(SpeechRecognitionRecognizedEvent(
words: speechResult.recognizedWords,
finalResult: speechResult.finalResult,
));
});
}
@override
SpeechRecognitionState get initialState =>
SpeechRecognitionUninitializedState();
@override
Stream<SpeechRecognitionState> mapEventToState(
SpeechRecognitionEvent event) async* {
if (event is SpeechRecognitionInitEvent) {
var hasSpeech = await speechRecognitionService.initSpeech();
if (hasSpeech) {
yield SpeechRecognitionAvailableState();
} else {
yield SpeechRecognitionUnavailableState();
}
}
if (event is SpeechRecognitionStartPressEvent) {
yield SpeechRecognitionStartPressedState();
add(SpeechRecognitionStartEvent());
}
if (event is SpeechRecognitionStartEvent) {
speechRecognitionService.startListening();
yield SpeechRecognitionStartedState();
}
if (event is SpeechRecognitionStopPressEvent) {
yield SpeechRecognitionStopPressedState();
add(SpeechRecognitionStopEvent());
}
if (event is SpeechRecognitionStopEvent) {
speechRecognitionService.stopListening();
yield SpeechRecognitionStopedState();
}
if (event is SpeechRecognitionCancelEvent) {
speechRecognitionService.cancelListening();
yield SpeechRecognitionCanceledState();
}
if (event is SpeechRecognitionRecognizedEvent) {
yield SpeechRecognitionRecognizedState(
words: event.words, finalResult: event.finalResult);
if (event.finalResult == true &&
speechRecognitionService.statuses.value == 'notListening') {
await Future.delayed(Duration(milliseconds: 50));
add(SpeechRecognitionStatusChangedEvent());
}
}
if (event is SpeechRecognitionErrorEvent) {
yield SpeechRecognitionErrorState(error: event.error);
await Future.delayed(Duration(milliseconds: 50));
add(SpeechRecognitionInitEvent());
await Future.delayed(Duration(milliseconds: 50));
add(SpeechRecognitionStartPressEvent());
}
if (event is SpeechRecognitionStatusChangedEvent) {
yield SpeechRecognitionStatusState();
add(SpeechRecognitionStartPressEvent());
}
}
}