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),
        ),
  ),

Вы застряли в цикле - вы вводите данные в TextField - он вызывает - onChanged: _bloc.updateMyStream - который обновляет поток - который снова обновляет данные, stream: _bloc.myStream получает новые данные, затем он переходит к controller: TextEditingController(text: snap.data), который снова обновляет текстовое поле. следовательно, ваш курсор снова переместится к первому символу.

anmol.majhail 08.12.2018 14:24

Я Алсон попробовал: child: StreamBuilder <String> (stream: _bloc.myInitialValueStream, builder: (context, snap) => TextField (украшение: InputDecoration (errorText: snap.error,), onChanged: _bloc.updateAnotherStream, контроллер: TextEditingController ( text: snap.data),),), то только в первый раз, когда я фокусируюсь на текстовом поле, курсор переходит к первому символу ....

Vinicius Sossella 08.12.2018 14:37

Вместо прямого возврата TextField - используйте условие if (snap.hasDate) {return TextField ...} cuz Исходные данные потока всегда равны Null. чек - docs.flutter.io/flutter/widgets/StreamBuilder-class.html

anmol.majhail 08.12.2018 14:43

anmol.majhail, сделал но ничего не изменилось ... курсор по-прежнему переходит на первый символ .... = /

Vinicius Sossella 08.12.2018 14:53

что делать, если вы прокомментируете onChanged: _bloc.updateMyStream,

anmol.majhail 08.12.2018 15:08

пробовал и ничего не меняется ...

Vinicius Sossella 08.12.2018 15:21

@ViniciusSossella, вы можете помочь мне с решением. Я застрял в подобной ситуации.

sagar suri 05.01.2019 18:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
7
8 331
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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

@ViniciusSossella, каким было ваше окончательное решение для примера? Я не понял.

rickdroio 19.12.2018 17:53

Можете привести более подробный пример? Я нахожусь в похожей ситуации и не могу понять.

sagar suri 05.01.2019 18:35

он помещает курсор в начало, когда я печатаю

temirbek 16.02.2019 10:24

позиция курсора идет в середину слова, а иногда сразу после первой буквы, но никогда не в конец, как должно быть

John Smith Optional 10.07.2019 19:23

@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);

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

Работает как шарм. Большое спасибо.

Arunjith R S 05.11.2021 22:08

Другие вопросы по теме