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();
}