首页 > 解决方案 > 在 Dart / Flutter 中等待回调完成

问题描述

目前正在使用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);

标签: flutterdarttext-to-speech

解决方案


原谅 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 库!


推荐阅读