Флаттер: текстовое поле в ListView.builder - PullRequest
0 голосов
/ 08 сентября 2018

Привет всем, у меня есть некоторые данные в Cloud Firestore и ListView.builder для загрузки данных в него. В этом ListView.builder у меня есть Network.Image, ListTile, чтобы показать заголовок и подзаголовок, и другой ListTile, который имеет Textfield, чтобы добавить комментарий и иконку. Моя цель - получить текст текстового поля и отобразить его как alertDialog при нажатии кнопки. До сих пор я добавлял контроллер в текстовое поле, но всякий раз, когда я вводил что-либо в текстовое поле, он изменял все текстовые поля. Я попытался создать список, чтобы указать уникальный контроллер, чтобы я мог остановить все изменения в текстовых полях, но мне не удалось. Есть ли способ, которым я могу сделать это. Все эти текстовые поля и кнопки значков должны быть уникальными, поэтому при щелчке по кнопке значка мне нужно увидеть текст набранного текстового поля.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Возможно, вы захотите создать новый тип настраиваемого виджета для каждой строки .

Вы можете использовать

  • TextEditingController (где вы вызываете соответствующий контроллер on click или
  • TextField обратный вызов onChanged (где вы сохраняете новое значение для соответствующий пункт on change

В обоих случаях у вас есть несколько неприятный список текстовых контроллеров или строковых значений .

Помните, ListView.builder будет собирать только те элементы, которые находятся в или около области просмотра (при прокрутке).

строитель вызывается только для тех детей, которые на самом деле видны

Это означает, что вы можете построить одну и ту же строку несколько раз (

Рассмотрите возможность использования собственного виджета для каждой строки (расширение StatefulWidget)

Это облегчит координацию, связанную со всеми ролями, и подтолкнет любое результирующее состояние дальше вниз по дереву к конечным узлам

При использовании TextEditingController:

  • у вас есть только один контроллер для беспокойства
  • вызов _textController.dispose() в методе dispose() виджета

При использовании обратного вызова onChanged (доступно для TextField, а не TextFormField)

  • создать переменную String как состояние в пользовательском виджете inputValue
  • обрабатывать нулевые случаи
  • читать из этого при нажатии кнопки

Похоже, TextEditingController может быть самым простым, но я хотел бы упомянуть оба варианта для вашего рассмотрения.

0 голосов
/ 08 сентября 2018

Попробуйте использовать

List<TextEditingController> _controllers = new List();

И внутри вашего ListView.builder добавьте новый контроллер для каждого элемента.

ListView.builder(
            itemBuilder: (context,index){
              _controllers.add(new TextEditingController());

              //Your code here

            }),

Для доступа к тексту контроллера вам понадобится значение индекса

_controllers[index].text

Обязательно избавьтесь от всех текстовых контроллеров в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...