setState () очищает данные в флаттере данных элемента формы - PullRequest
0 голосов
/ 01 сентября 2018

Я новичок, чтобы трепетать и экспериментировать с Sateful виджетом. Дело в том, что в моем макете экрана пользовательского интерфейса у меня есть два разных виджета

  1. Виджет DropdownButton
  2. TextFormField, который содержит номер карты.

Когда я пытался обновить выбранное значение раскрывающегося списка в виджете DropdownButton, он автоматически очищает текст в TextFormField. Требуется ли сохранять текст в глобальной переменной для восстановления каждый раз, когда мы вызываем метод setState () для обновления значений?

Form UI screenshot

Вот код для виджетов, DropdownButton

 new Padding(
              padding: const EdgeInsets.all(15.0),
              child: new Column(
                children: <Widget>[
                  DropdownButton<String>(
                    value: _referPractice,
                    isDense: true,
                    hint: new Text(CONST_SELECT),
                    items: _stdCodesList.map((value) {
                      return new DropdownMenuItem<String>(
                        value: value.dialCode,
                        child: new Text("${value.code} ${value.dialCode}"),
                      );
                    }).toList(),
                    onChanged: (String newValue) {
                      setState(() {
                        _referPractice = newValue;  // here I`m trying to update selected value. 
                      });
                    },
                  )
                ],
              )),

TextFormField

TextFormField(
                controller: _textController,
                keyboardType: TextInputType.number,
                style: new TextStyle(
                  fontWeight: FontWeight.w200,
                  color: Colors.black,
                  fontSize: 18.0,
                ),
                decoration: new InputDecoration(
                    hintText: HING_ENTER_NUMBER,
                    suffixIcon: CircleIconButton(
                      onPressed: () {
                        this.setState(() {
                          _textController.clear();
                        });
                      },
                    )),
                maxLines: 1,
                validator: (value) {
                  if (value.isEmpty) {
                    return ERROR_CARD_DETAILS;
                  }
                },
              ),

Я понимаю, что Stateful виджет перестраивает виджет каждый раз, когда он вызывает setState, но как мне сохранить данные для данных формы, которые еще нигде не хранятся.

Предложения, пожалуйста! Заранее спасибо.

1 Ответ

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

С данным кодом одна ошибка, о которой я могу вспомнить, - это создание TextEditingController каждый раз.

@override
Widget build(BuildContext context) {
  var _textController = TextEditingController(); //problem
  // build and return widgets

Это должно быть в вне из build метода. Мы можем получить его в constructor или initState.

Если у вас _textController за пределами build , можете ли вы добавить еще код?

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