【问题标题】:TextFormField validator is not getting a value passed to it?TextFormField 验证器没有获得传递给它的值?
【发布时间】:2020-11-24 17:36:27
【问题描述】:

我正在开发一个纸牌游戏计分应用程序,但我有一个似乎无法解决的错误。希望这里有人看到我的错误,或者可以指出潜在的修复。我有这样的输入,您可以在其中输入每个玩家的得分。它只不过是一列包含球员姓名的 Text() 和用于输入/编辑分数的 TextFormField() 的行。

Image showing the score input/edit dialog in the app

这是该行的代码:

              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 && 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 :

应用中的验证输出显示每个字段的错误:

Image showing the same score entry dialog with the validation errors

[编辑]为了完整起见,在此处添加保存按钮的代码:

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

我在这里缺少什么?我可以尝试删除 onChange 并转而使用 TextController 但这会增加复杂性,因为您可以拥有 3-6 名玩家,而且我必须拥有多个控制器才能使其工作......对于我来说,它们似乎也有点矫枉过正需要做的。

我不确定为什么传递给验证器()的“值”总是一个空字符串,我做错了什么吗?这是一个错误吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 如果控制台中显示的字符串意味着您连续两次更新小部件,您能否将null 语句更改为字符串
  • 我不确定我是否关注你。 onChange 将在每次按键时一遍又一遍地触发,并且效果很好。验证器仅在您单击保存按钮时触发。那“应该”得到当时该字段的任何文本值,不是吗?我得到的只是 "" 传递给验证器。
  • 第一个答案是正确的,我建议你在验证后从按钮返回值而不是在TextFormField
  • 那么在保存按钮中验证它而不使用框架提供的验证功能?
  • 没有区别,仍然将“”作为值传递给每个字段的验证器。

标签: flutter textformfield


【解决方案1】:

也许您应该使用 Form-Widget 包装所有 TextFormFields,同时使用全局键来管理表单。另请参阅flutter validation tutorial中的第 1 步

【讨论】:

  • 我已经这样做了:Form( key: _formKey, child: Column(
  • @john 我再次,不确定它是否与您的问题有关,但为什么您有 textformfield 的密钥?在我的代码中,表单级别只有一个键。
【解决方案2】:

好的,经过更多的挖掘,似乎以某种方式拥有 onChange 导致了我的问题。尽管来自 Google 和其他人的所有示例都表明这是完全可以接受的,但当我注释掉 onChange 时,验证器会为每个字段传递给它的正确值。这实际上效果很好,因为我真的应该在验证值之后才将值保存到我的模型中,所以我只是将该逻辑移到验证器中。现在一切正常。

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2021-07-23
    • 1970-01-01
    • 2013-02-01
    • 2021-12-08
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多