我在文本字段中添加了语音识别,它可以工作,但是我无法将文本添加到文本字段中,有一种方法可以做到。
文本字段如下:
Widget _buildDescriptionTextField(productBloc) {
return StreamBuilder<Object>(
stream: productBloc.messageStream,
builder: (context, snapshot) {
return TextField(
maxLines: 3,
controller: _controllerMessage,
onChanged: productBloc.messageSink,
decoration: InputDecoration(
labelText: allTranslations.text(StringConstant.description),
errorText: snapshot.error,
suffixIcon: IconButton(icon: Icon(Icons.mic), onPressed: () {
if (_isAvailable && !_isListening)
_speechRecognition
.listen(locale: "en_US")
.then((result) => print('$result'));
},
),
),
);
}
);
}
我有一个蒸汽生成器来手动管理添加的文本,还有一个控制器(如果此页面用于编辑),则将iconButton作为后缀图标I以启动语音识别。当我将结果文本添加到文本窗口小部件之外时,它可以工作,但我需要在texField内部。
答案 0 :(得分:1)
那样做应该行不通吗?
setState(() => _controllerMessage.text = result)
答案 1 :(得分:1)
您需要使用TextEditingController
属性。我假设您将一个声明为_controllerMessage
。
要为您的TextField
设置新值并将光标保持在最后,请使用类似于文档中示例的内容。
例如
_speechRecognition
.listen(locale: "en_US")
.then(_onResult);
// ...
void _onResult(String result) {
setState(() {
_controllerMessage.value = _controllerMessage.value.copyWith(
text: result,
selection: TextSelection(baseOffset: result.length, extentOffset: result.length),
composing: TextRange.empty,
);
});
}
让我知道这是否有帮助。
答案 2 :(得分:0)
所以我所做的只是使用文档中的_speechRecognition.setRecognitionResultHandler
来为textField的控制器设置一个新值,如下所示:
_speechRecognition.setRecognitionResultHandler(
(String speech) => setState(() {
_controllerMessage = new TextEditingController(text: resultText = speech);
})
);
textField保持以前的样子,请参阅问题。