#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, валидатор получает правильное значение, переданное ему для каждого поля. На самом деле это работает нормально, потому что я действительно должен выполнять работу по сохранению значения в моей модели только после проверки значения, поэтому я просто переместил эту логику в валидатор. Теперь все работает так, как должно.