从外部来源向TextField添加文本

时间:2019-06-12 08:59:19

标签: flutter speech-recognition textfield flutter-layout

我在文本字段中添加了语音识别,它可以工作,但是我无法将文本添加到文本字段中,有一种方法可以做到。

文本字段如下:

  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内部。

3 个答案:

答案 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保持以前的样子,请参阅问题。