Обновление Text () на основе пользовательского ввода в TextFormField () внутри контейнера в ListVIew - PullRequest
0 голосов
/ 02 марта 2020

Я новичок, чтобы трепетать, и у меня есть ... проблема с вышеуказанным.

Я получаю данные о нескольких объектах / документах из FireStore и создаю ListView.

Лог c или его отсутствие выглядит следующим образом:

Container
    StreamBuilder
         ListView
             Container
                 Rows, Columns, Text and whatever to display each document from StreamBuilder.

Этот ListView содержит несколько контейнеров, в которых каждый контейнер отображает данные из одного объекта. Внутри каждого контейнера есть TextFormField, который принимает удвоение. Основываясь на этом значении, я хочу изменить Text () в том же контейнере - расчет.

Возможно ли это? Если так - как? Я понимаю, что могу как-то использовать TextEditController, но тогда результат вычисления будет редактируемым. Или?

return new ListView(//
  children: getMedicationItem(asyncSnapshot
    shrinkWrap: true,
    children: asyncSnapshot.data.documents.map((DocumentSnapshot document) {
      MyObject object = new MyObject(document, integerValue);
      backgroundColor = !backgroundColor;
      return new Container(
        color: backgroundColor? Colors.black26: Colors.white,
          child: new Row(
            children: <Widget>[
              new Flexible(
                child: TextFormField(
                  onChanged: (text) {
                    double calculation = 0.0;
                    if (text.length > 0)
                      calculation = double.tryParse(text) * 23;
                    **UPDATE "$calculation" in Text() below** 
                  },
                  keyboardType: TextInputType.number,
                  inputFormatters: [_decimal_validator],
                )
              ),
              new Flexible(
                child: Text("$calculation"),
              )
            ]
          ),
        );
      }
    ).toList(),
  )
);

1 Ответ

1 голос
/ 02 марта 2020

Все, что вам нужно сделать, это использовать setState, чтобы сообщить Flutter, что переменная изменилась, и вы хотите перестроить все виджеты, которые ее используют:

if (text.length > 0){
  setState((){
    calculation = double.tryParse(text) * 23;
  });
}
...