【问题标题】:How to call specific validator instead of calling all the validators in same time by using `form.validate()`?如何使用 `form.validate()` 调用特定的验证器而不是同时调用所有的验证器?
【发布时间】:2020-06-16 00:52:44
【问题描述】:

这是代码:

if (form.validate()) {
          // Text forms was validated.
          if (mounted) {
            setState(() {
              _isButtonEnabled = true;
            });
          }
          form.save();
        }

我想为特定的 TextFormField 调用特定的验证器

【问题讨论】:

    标签: flutter dart flutter-form-builder


    【解决方案1】:

    Joao 的回答是正确的,但它也被过度设计了。您可以改为为要独立验证的每个字段声明 GlobalKey:

    GlobalKey<FormFieldState> fieldKey = GlobalKey();
    

    将其分配给您要验证的TextFormField:

    TextFormField(
        key: fieldKey,
        ...
    

    然后使用密钥验证该字段:

    bool valid = fieldKey.currentState.validate();
    

    【讨论】:

    • 你说得对。我在 api 文档上找不到 FormFieldState。谢谢你的回答。
    【解决方案2】:

    您需要使用Form Widget 和它自己的密钥来包装要单独验证的每个字段:

    class TextFormFieldValidation extends StatefulWidget {
      @override
      _TextFormFieldValidationState createState() => _TextFormFieldValidationState();
    }
    
    class _TextFormFieldValidationState extends State<TextFormFieldValidation> {
      List<GlobalKey<FormState>> _formKeysList= [
        GlobalKey<FormState>(),
        GlobalKey<FormState>(),
      ];
    
      @override
      Widget build(BuildContext context) {
        return Column(
          children: <Widget>[
            Form(
              key: _formKeysList[0],
              child: TextFormField(
                validator: (value) => 'Bad',
              ),
            ),
            Form(
              key: _formKeysList[1],
              child: TextFormField(
                validator: (value) => 'Bad',
              ),
            ),
            RaisedButton(
              child: Text('Validate 1'),
              onPressed: () => _formKeysList[0].currentState.validate(),
            ),
            RaisedButton(
              child: Text('Validate 2'),
              onPressed: () => _formKeysList[1].currentState.validate(),
            ),
            RaisedButton(
              child: Text('Reset'),
              onPressed: () => _formKeysList.forEach((key) => key.currentState.reset()),
            ),
          ],
        );
      }
    }
    

    【讨论】:

    • 谢谢@João Soares
    • @BlazhenkaParmakova 如果我的回答解决了您的问题,请将其标记为正确,以帮助其他用户。您也可以投票以提高相关性。
    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2023-03-10
    相关资源
    最近更新 更多