所以我有一个普通的TextField用来过滤列表
children: products.map((doc) => _buildSingleProduct(doc)).toList(),
,它可以正常工作,然后我在其中添加了文本转语音插件speech_recognition:
,并将其与过滤功能结合使用,一切正常。
问题是当我完成语音过滤后,例如,我想通过写入不再过滤的TextField对其进行添加或更正。
文本字段
child: TextField(
controller: controller,
decoration: InputDecoration(
labelText: allTranslations.text(StringConstant.search),
prefixIcon: Icon(Icons.search),
suffixIcon: IconButton(
icon: Icon(Icons.mic),
onPressed: () {
if (_isAvailable && !_isListening)
_speechRecognition
.listen(locale: "en_US")
.then((result) => print('$result'));
},
),
),
),
如您所见,我使用controller
进行过滤,然后使用麦克风图标将语音结果传递给控制器,如下所示:
_speechRecognition
.setRecognitionResultHandler((String result) => setState(() {
controller = TextEditingController(text: resultText = result);
}));
在这里,我从语音中获取结果,并将其添加到过滤器和控制器的resultText中,以便它出现在textField中。
如果我这样做的话:
_speechRecognition
.setRecognitionResultHandler((String speech) => setState(() => resultText = speech));
一切正常,但是文本显然不会出现在文本字段中。
对于textField过滤,我将状态初始化为将其添加到resultText:
initState() {
initSpeechRecognizer();
controller.addListener(() {
setState(() {
resultText = controller.text;
});
});
super.initState();
}
这是我从数据库返回结果的方式:
return resultText == null || resultText == ""
? buildProducts(id, title, favorite, message, price, doc)
: doc.data['title'].toLowerCase().contains(resultText.toLowerCase())
? buildProducts(id, title, favorite, message, price, doc)
: Container();
您可能会看到我正在搜索标题。
那么问题又来了一次,
1。语音搜索
它出现在textField上并过滤列表
当我按textField更改查询时,它不再过滤。
但是相反的方法可行
用文本过滤列表
它过滤列表
我激活语音转文字功能,它会更改查询并使用新查询过滤列表。
答案 0 :(得分:0)
对于需要解决方案的人来说
_speechRecognition
.setRecognitionResultHandler((String result) => setState(() {
resultText = result;
controller.text = resultText;
}));
您可以从语音中获取结果,将其添加到处理变量中,但是您还需要将该结果添加到控制器中,以便在textField上获取结果。