因此,在我的Flutter项目中,我有两条路线,第二条使用SpeechToText包。当我第一次从第一条路由转到第二条路由时,一切都很好,但当我返回并再次转到第二个路由时,onStatus
方法在应该调用的时候没有被调用。
我做了一些调试,发现如下:onStatus
方法设置在SpeechToText().initialize
方法中。如果变量_initWorked
为false,则初始化方法。但是,当我第二次打开路由时,变量已经设置为true
,尽管我有一个完全不同的SpeechToText
实例。
这让我认为它仍然是在操作系统级别上激活的。但我就是找不到完全处理它的方法。有没有办法这样做,是包本身的错误,还是因为完全不同的东西?
如有任何帮助,我们将不胜感激:(
SpeechToText
是Singleton
,您总是得到相同的实例
https://github.com/csdcorp/speech_to_text/blob/1a0864910db88eb83cdde113b447baa7405eaa7e/speech_to_text/lib/speech_to_text.dart#L89
源代码片段
class SpeechToText {
...
static final SpeechToText _instance = SpeechToText.withMethodChannel();
...
factory SpeechToText() => _instance;
要处理SpeechToText
,您可以调用stop()
,它将调用destroyRecognizer()
并执行speechRecognizer?.destroy();
speechRecognizer = null;
https://github.com/csdcorp/speech_to_text/blob/1a0864910db88eb83cdde113b447baa7405eaa7e/speech_to_text/android/src/main/kotlin/com/csdcorp/speech_to_text/SpeechToTextPlugin.kt#L511
Android源代码片段
public class SpeechToTextPlugin : ...
...
private var speechRecognizer: SpeechRecognizer? = null
...
"stop" -> stopListening(result)
...
private fun stopListening(result: Result) {
if (sdkVersionTooLow() || isNotInitialized() || isNotListening()) {
result.success(false)
return
}
debugLog("Stop listening")
handler.post {
run {
speechRecognizer?.stopListening()
}
}
if ( !recognizerStops ) {
destroyRecognizer()
}
notifyListening(isRecording = false)
result.success(true)
debugLog("Stop listening done")
}
...
private fun destroyRecognizer() {
handler.postDelayed( {
run {
debugLog("Recognizer destroy")
speechRecognizer?.destroy();
speechRecognizer = null;
}
}, 50 )
}