【问题标题】:Wait for callback to complete in Dart / Flutter在 Dart / Flutter 中等待回调完成
【发布时间】: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


【解决方案1】:

设置setCompletionHandler跟下面一样,将列表中的所有句子一一朗读。

List<String> sentences = ['Hello, World', 'How are you?', 'The quick brown fox jumps over the lazy dog']

int i = 0;

FlutterTts flutterTts = FlutterTts();

await flutterTts.speak(sentences[i]);

flutterTts.setCompletionHandler(() async {
  if (i < sentences.length - 1) {
    i++;
    await flutterTts.speak(sentences[i]);
  }
});

【讨论】:

    【解决方案2】:

    要等待回调,请使用 await 关键字:

    await TTS.setCompletionHandler(() {
      setState(() {
        ttsState = TtsState.stopped;
      });
    });
    

    【讨论】:

      【解决方案3】:

      请原谅 setCompletionHandler)

      你可以使用这样的异步函数:

        Future<void> _speak(String _text) async {
          if (_text != null && _text.isNotEmpty) {
            await flutterTts.awaitSpeakCompletion(true);
            await flutterTts.speak(_text);
          }
        }
      
        readAllSentencesList(List<String> allSentences) async {
          for (int i=0; i<allSentences.length; i++){
            await _speak(allSentences[i]);
          }
        }
      

      别忘了使用最后一个 flutter_tts 库!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-20
        • 2020-11-20
        • 2016-03-09
        • 2016-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-02
        相关资源
        最近更新 更多