Валидатор TextFormField не получает переданное ему значение?

#flutter #textformfield

#flutter #textformfield

Вопрос:

У меня есть приложение для подсчета очков в карточных играх, которое я разрабатываю, и у меня есть одна ошибка, которую я, похоже, не могу понять. Надеюсь, кто-нибудь здесь увидит мою ошибку и / или сможет указать на возможные исправления. У меня есть такой ввод, где вы можете ввести счет для каждого игрока за раунд. Это не что иное, как столбец строк с текстом (), содержащим имена игроков, и текстовым полем () для ввода / редактирования счета.

Изображение, показывающее диалоговое окно ввода / редактирования оценки в приложении

Вот код для строки:

               child: TextFormField(
                key: Key(p.name),
                keyboardType: TextInputType.number,
                initialValue: p.getRoundScore(round)?.toString() ?? '',
                inputFormatters: [LengthLimitingTextInputFormatter(3)],
                validator: (value) {
                  print('validate => ${p.name} : $value');
                  int score = int.tryParse(value);
                  return (score == null amp;amp; value != null) ? "Must be a number" : null;
                },
                onChanged: (value) {
                  print('onChange => ${p.name} : $value');
                  setState(() {
                    int score = int.parse(value);
                    if (round == 9) score *= 2; // Queens round
                    if (round == 10) score *= 3; // Kings round
                    p.updateScore(round, score);
                  });
                },
              ),
 

Если я введу оценки, например, John = 2, Hannah = 1, Tias = 2 и Eric = 0, а затем нажму кнопку сохранить, я получу следующий вывод из моих print () s:

 I/flutter (32660): onChange => John : 2
I/flutter (32660): onChange => Hannah : 1
I/flutter (32660): onChange => Tias : 2
I/flutter (32660): onChange => Eric : 0
I/flutter (32660): validate => John :
I/flutter (32660): validate => Hannah :
I/flutter (32660): validate => Tias :
I/flutter (32660): validate => Eric :
 

И выходные данные проверки в приложении показывают ошибки для каждого поля:

Изображение, показывающее тот же диалог ввода оценки с ошибками проверки

[РЕДАКТИРОВАТЬ] Добавление кода для кнопки сохранения здесь для полноты картины:

    if (_formKey.currentState.validate()) {
      _formKey.currentState.save();
      debugPrint(playerToJson(players));
      Navigator.of(context).pop();
  }                                  }                                  
 

Чего мне здесь не хватает? Я мог бы попытаться удалить onChange и перейти к использованию TextController, но это добавило бы сложности, поскольку у вас может быть 3-6 игроков, и мне пришлось бы иметь несколько контроллеров для его работы…они также казались излишними для того, что мне нужно было сделать.

Я не уверен, почему «значение», передаваемое в validator(), всегда является пустой строкой, я что-то делаю не так? Это ошибка? Есть ли лучший способ сделать это?

Комментарии:

1. можете ли вы изменить null оператор на String, если строка отображается в консоли, что означает, что вы обновляете виджет два раза подряд

2. Я не уверен, что понимаю вас. onChange будет срабатывать снова и снова при каждом нажатии клавиши, и это работает нормально. Средство проверки срабатывает только тогда, когда вы нажимаете кнопку сохранить. Это «должно» означать получение любого текстового значения для этого поля в то время, не так ли? Однако все, что я когда-либо получал, — это «», переданное валидатору.

3. первый ответ правильный, я рекомендую вам возвращать значение из кнопки после проверки не внутри TextFormField

4. Итак, подтвердите это с помощью кнопки сохранения и НЕ используйте возможность проверки, предоставляемую фреймворком?

5. Никакой разницы, все равно получите «», переданное в качестве значения в валидатор для каждого поля.

Ответ №1:

Возможно, вам следует обернуть все ваши поля текстовой формы с помощью виджета формы, используя также глобальный ключ для управления формой. Пожалуйста, также ознакомьтесь с Шагом 1 в руководстве по проверке flutter

Комментарии:

1. Я уже это делаю: Форма (ключ: _formKey, дочерний элемент: столбец (

2. @john Me снова, не уверен, что это относится к вашей проблеме, но почему у вас есть ключ для textformfield? В моем коде есть только один ключ на уровне формы.

Ответ №2:

хорошо, после еще нескольких попыток выясняется, что каким-то образом наличие onChange вызывало мою проблему. Несмотря на то, что все примеры из Google и других показывают, что это вполне приемлемо, когда я комментирую onChange, валидатор получает правильное значение, переданное ему для каждого поля. На самом деле это работает нормально, потому что я действительно должен выполнять работу по сохранению значения в моей модели только после проверки значения, поэтому я просто переместил эту логику в валидатор. Теперь все работает так, как должно.