Добавить текст в TextField из внешнего источника - PullRequest
0 голосов
/ 12 июня 2019

Я добавил распознавание речи в текстовое поле, оно работает, но я не могу добавить текст в текстовое поле, есть ли способ сделать это.

текстовое поле выглядит следующим образом:

  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'));
              },
              ),
            ),
          );
        }
    );
  }

У меня есть steam-builder для управления добавленным текстом вручную и контроллер, если эта страница используется для редактирования, а затем как суффиксы со значком iconButtonначать распознавание речи.когда я добавляю текст результата вне текстового виджета, он работает, но он мне нужен внутри texField.

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Вам необходимо использовать 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,
    );
  });
}

Дайте мне знать, помогло ли это.

1 голос
/ 12 июня 2019

Просто делать это должно работать нет?

setState(() => _controllerMessage.text = result)
0 голосов
/ 12 июня 2019

Итак, я просто использовал _speechRecognition.setRecognitionResultHandler из документации, чтобы установить новое значение для контроллера textField, например, так:

    _speechRecognition.setRecognitionResultHandler(
          (String speech) => setState(() {
            _controllerMessage = new TextEditingController(text: resultText = speech);
          })
    );

textField остается прежним, см. Вопрос.

...