Flutter:表单验证同时验证所有文本字段

Posted

技术标签:

【中文标题】Flutter:表单验证同时验证所有文本字段【英文标题】:Flutter: Form validation validates all textfields together 【发布时间】:2021-04-23 13:07:24 【问题描述】:

我正在尝试验证具有电子邮件和密码字段的登录表单。验证模式设置为onUserInteraction

但当前的行为,即使开始在电子邮件字段上输入,也会验证密码字段。 。 我想要实现的是

    验证单个文本字段。不在一起

    也许,仅在对焦后验证(模糊)

    Form(
      autovalidateMode: AutovalidateMode.onUserInteraction,
      onChanged: () 
        controller.isValidForm.value =
            controller.formKey.currentState.validate();
      ,
      key: controller.formKey,
      child: Column(
        children: <Widget>[
          FormTextField(
            validator: (value) 
              if (value.isEmpty) 
                return 'Please enter an email address';
               else if (!controller.emailRegExp.hasMatch(value)) 
                return 'Invalid email address!';
              
              return null;
            ,
            onSaved: (value) 
              controller.model.emailAddress = value;
            ,
            title: "Email id",
          ),
          UIHelper.verticalSpaceLarge(),
          FormTextField(
            isObscure: controller.isPasswordObsecured.value,
            validator: (value) 
              if (value.isEmpty) 
                return 'Please enter a password';
              
              return null;
            ,
            onSaved: (value) 
              controller.model.password = value;
            ,
            title: "Password",
            isObscureCallBack: controller.changePasswordVisibility,
            isPasswordField: true,
          ),
          UIHelper.verticalSpaceExtraLarge(),
          FormSubmitButton(
            isValidForm: controller.isValidForm.value,
            onPressed: () 
              if (controller.formKey.currentState.validate()) 
                controller.formKey.currentState.save();
                print(controller.model);
                controller.doLogin();
              
            ,
            label: "Login",
          ),
        ],
      ),
    ),
    

【问题讨论】:

这是因为你在 Form 上使用了 onChanged。 尝试删除onChanged: () controller.isValidForm.value = controller.formKey.currentState.validate(); , 如果你想继续使用这种风格,那么你将不得不制作 2 个不同的键。 删除 onChange 对验证行为没有影响 @UjjwalRaijada 验证器仅在被调用时才起作用。它在 onChange 和 FormSubmitButton 上被调用。请尝试删除 onChange 并使用热重载。它应该工作/ 【参考方案1】:

继续我们的谈话......我所做的是,我创建了一个在提交表单时调用的函数。那是检查验证的时间,如果有错误,则会显示错误。 我要验证的代码:

void _submit() async 
  final isValid = _form.currentState!.validate();   // validation
  if (!isValid)      // if validation is false it will return error as per mentioned by you in validator
    return;
  
  _form.currentState!.save();      // if everything is fine, it will save the form and proceed further

  // code from here if the form gets validated


【讨论】:

【参考方案2】:

您应该将autovalidateMode: AutovalidateMode.onUserInteraction 放在FormTextField 内,而不是放在Form 内,以便在用户交互时启用单个文本字段验证(更改/模糊)

Form(
  //not here
  //autovalidateMode: AutovalidateMode.onUserInteraction,
  onChanged: () 
    controller.isValidForm.value =
        controller.formKey.currentState.validate();
  ,
  key: controller.formKey,
  child: Column(
    children: <Widget>[
      FormTextField(
        // put it here
        autovalidateMode: AutovalidateMode.onUserInteraction,
        ...
        title: "Email id",
      ),
      UIHelper.verticalSpaceLarge(),
      FormTextField(
        // and put it here
        autovalidateMode: AutovalidateMode.onUserInteraction,
        ...
        title: "Password",
      ),
      ...
    ],
  ),
),

【讨论】:

以上是关于Flutter:表单验证同时验证所有文本字段的主要内容,如果未能解决你的问题,请参考以下文章

Flutter BLoC 库中带有验证的文本字段

如何防止所有表单字段在填写单个字段时进行验证

表单验证

PHP 表单验证

所有最新浏览器中电子邮件的最佳表单字段验证模式

在 Flutter 小部件测试中,如何验证字段验证错误消息?