TextField с начальным значением внутри StreamBuilder

Мы создаем страницу редактирования данных пользователя, поэтому текстовое поле уже заполнено пользовательскими данными, и пользователи могут изменять и сохранять их... Проблема в том, что когда я начинаю вводить символ в текстовое поле, курсор теряется, каждый символ, который Я ввожу (с клавиатуры устройства) курсор переходит к первому символу... и если я удаляю контроллер с моим начальным значением, он работает нормально, но тогда я не могу заполнить свое текстовое поле данными пользователя.

Пример кода:

child: StreamBuilder<String>(
    stream: _bloc.myStream,
    builder: (context, snap) => TextField(
          decoration: InputDecoration(
            hintText: 'example',
            labelText: 'Name',
            errorText: snap.error,
          ),
          onChanged: _bloc.updateMyStream,
          controller: TextEditingController(text: snap.data),
        ),
  ),

2 ответа

Решение

Всякий раз, когда вам нужно обновить текст TextController, чтобы иметь возможность редактировать его, вам нужно исправить положение курсора, как это

textController.value = textController.value.copyWith(text:<NEW_VALUE>,);

замените NEW_VALUE новым текстом.

@XoXo вот полный код, но вы можете сделать это по-своему.

TextEditingController _controller = TextEditingController();

return StreamBuilder<String>(
    stream: _bloc.myStream,
    builder: (context, snap) {
      _controller.value =
          _controller.value.copyWith(text: snap.data);

      return TextField(
        decoration: InputDecoration(
          hintText: 'ex: Centro',
          labelText: 'Bairro',
          errorText: snap.error,
        ),
        onChanged: _bloc.updateMyStream,
        controller: _controller,
      );
    });

Чтобы курсор находился в конце текста, при редактировании текстового контроллера подумайте о том, чтобы также отредактировать контроллер выделения следующим образом:

controller.text = newText;
controller.selection = controller.selection.copyWith(baseOffset: newText.length, extentOffset: newText.length);

Надеюсь, это помогло!

Если твой TextField находится внутри StatefulWidget(наверное), лучше сделай задание внутри didChangeDependenciesметод. Типичный пример:

  @override
  void didChangeDependencies() {
    textEditingController.value = TextEditingValue(text: bloc.valueController.value);
    super.didChangeDependencies();
  }
Другие вопросы по тегам