【发布时间】:2020-02-22 08:15:11
【问题描述】:
目前正在使用 flutter_tts 库编写一个 Flutter 应用。
我有一个句子列表要读出,但目前无法等待 setCompletionHandler() 完成。
如何等待 setCompletionHandler() 回调完成,然后再转到下一个字符串?目前,TTS.speak() 函数立即结束,while 循环立即递增,因此它只读出列表中的最后一句。
// code shortened for brevity
FlutterTts TTS;
TtsState ttsState = TtsState.stopped;
get isPlaying => ttsState == TtsState.playing;
get isStopped => ttsState == TtsState.stopped;
List<String> sentences = ['Hello, World', 'How are you?', 'The quick brown fox jumps over the lazy dog'];
@override
void initState() {
super.initState();
TTS = FlutterTts();
}
void readOutSentences(sentences) async {
int i = 0;
bool readCompleted = false;
while (i < sentences.length) {
readCompleted = await runSpeak(sentences[i].toString());
if (readCompleted)
i++;
}
}
Future<bool> runSpeak(String currentSentence) async {
TTS.setStartHandler(() {
setState(() {
ttsState = TtsState.playing;
});
});
TTS.setCompletionHandler(() {
setState(() {
ttsState = TtsState.stopped;
});
});
await TTS.speak(currentSentence);
return true;
}
readOutSentences(sentences);
【问题讨论】:
-
你要等待哪个函数?
-
TTS.setCompletionHandler() 在 TTS.speak() 完成后运行。在增加 while 循环之前需要等待/监听 TTS.setCompletionHandler() 函数。
-
您不应该在 runSpeak 之外声明完成和启动处理程序并在该函数中调用它们吗?我认为因为你只是在函数中声明完成和启动处理程序,Dart 只是调用 TTS.speak(currentSentence) 因为其他两个只是声明。
标签: flutter dart text-to-speech