Мы создаем страницу редактирования данных пользователя, поэтому текстовое поле уже заполнено данными пользователя, и пользователи могут изменять и сохранять их ... Проблема в том, что когда я начинаю вводить символ в текстовое поле, курсор теряется, каждый символ, который Я вхожу (с клавиатуры устройства), курсор переходит к первому символу ... и если я удалю контроллер с моим начальным значением, он будет работать нормально, но тогда я не могу заполнить свое текстовое поле данными пользователей.
Пример кода:
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),
),
),
Я Алсон попробовал: child: StreamBuilder <String> (stream: _bloc.myInitialValueStream, builder: (context, snap) => TextField (украшение: InputDecoration (errorText: snap.error,), onChanged: _bloc.updateAnotherStream, контроллер: TextEditingController ( text: snap.data),),), то только в первый раз, когда я фокусируюсь на текстовом поле, курсор переходит к первому символу ....
Вместо прямого возврата TextField - используйте условие if (snap.hasDate) {return TextField ...} cuz Исходные данные потока всегда равны Null. чек - docs.flutter.io/flutter/widgets/StreamBuilder-class.html
anmol.majhail, сделал но ничего не изменилось ... курсор по-прежнему переходит на первый символ .... = /
что делать, если вы прокомментируете onChanged: _bloc.updateMyStream,
пробовал и ничего не меняется ...
@ViniciusSossella, вы можете помочь мне с решением. Я застрял в подобной ситуации.





Всякий раз, когда вам нужно обновить текст TextController, чтобы иметь возможность редактировать его, вам нужно исправить положение курсора следующим образом
textController.value = textController.value.copyWith(text:<NEW_VALUE>,);
замените NEW_VALUE новым текстом.
@ViniciusSossella, каким было ваше окончательное решение для примера? Я не понял.
Можете привести более подробный пример? Я нахожусь в похожей ситуации и не могу понять.
он помещает курсор в начало, когда я печатаю
позиция курсора идет в середину слова, а иногда сразу после первой буквы, но никогда не в конец, как должно быть
@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 - он вызывает -
onChanged: _bloc.updateMyStream- который обновляет поток - который снова обновляет данные,stream: _bloc.myStreamполучает новые данные, затем он переходит кcontroller: TextEditingController(text: snap.data), который снова обновляет текстовое поле. следовательно, ваш курсор снова переместится к первому символу.