TextField с начальным значением внутри StreamBuilder - PullRequest
0 голосов
/ 08 декабря 2018

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

Пример кода:

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 ]

0 голосов
/ 07 января 2019

@ 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,
      );
    });
0 голосов
/ 08 декабря 2018

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

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

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

...