Flutter表单验证插件form_field_validator的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter表单验证插件form_field_validator的使用

form_field_validator 是一个用于Flutter应用程序中简化表单字段验证的插件,它提供了常见的验证选项。下面将详细介绍如何使用这个插件,并提供完整的示例代码。

使用方法

单个规则验证

您可以直接为 TextFormFieldvalidator 属性分配验证器,而无需手动传递值。例如,对于电子邮件地址的验证:

TextFormField(
  validator: EmailValidator(errorText: '请输入有效的电子邮件地址'),
);

您也可以创建可重用的验证器实例。例如,确保某个字段是必填项:

final requiredValidator = RequiredValidator(errorText: '此字段为必填项');

// 将其分配给validator属性
TextFormField(
  validator: requiredValidator,
);

多规则验证

有时我们需要对同一个输入框应用多个验证规则。可以使用 MultiValidator 来实现这一点。以下是一个密码验证的例子,它要求密码不能为空、长度至少8位并且包含特殊字符:

final passwordValidator = MultiValidator([
  RequiredValidator(errorText: '密码为必填项'),
  MinLengthValidator(8, errorText: '密码长度至少8位'),
  PatternValidator(r'(?=.*?[#?!@$%^&*-])', errorText: '密码必须包含至少一个特殊字符')
]);

String password;

Form(
  key: _formKey,
  child: Column(children: [
    TextFormField(
      obscureText: true,
      onChanged: (val) => password = val,
      validator: passwordValidator,
    ),
    
    // 使用MatchValidator来确认两次输入的密码是否一致
    TextFormField(
      validator: (val) => MatchValidator(errorText: '两次输入的密码不匹配').validateMatch(val, password),
    )
  ]),
);

创建自定义验证器

如果您需要特定业务逻辑下的验证规则,可以通过继承 TextFieldValidator 或者 FieldValidator<T> 类来自定义验证器。这里以验证利比亚电话号码为例:

class LYDPhoneValidator extends TextFieldValidator {
  LYDPhoneValidator({String errorText = '请输入有效的利比亚电话号码'}) : super(errorText);

  @override
  bool get ignoreEmptyValues => true; // 如果为空时不显示错误信息
  
  @override
  bool isValid(String value) {
    return hasMatch(r'^((+|00)?218|0?)?(9[0-9]{8})$', value);
  }
}

// 使用时直接分配给validator属性
TextFormField(
  validator: LYDPhoneValidator(),
);

对于非字符串类型的验证,您可以扩展 FieldValidator<T> 类并实现相应的验证逻辑。

示例Demo

为了更直观地理解上述内容,下面给出一个完整的登录界面示例,包括了用户名和密码两个输入框以及对应的验证规则。

import 'package:flutter/material.dart';
import 'package:form_field_validator/form_field_validator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('表单验证示例')),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: LoginForm(),
        ),
      ),
    );
  }
}

class LoginForm extends StatefulWidget {
  @override
  _LoginFormState createState() => _LoginFormState();
}

class _LoginFormState extends State<LoginForm> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  String email;
  String password;

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          TextFormField(
            decoration: InputDecoration(labelText: '邮箱'),
            validator: MultiValidator([
              RequiredValidator(errorText: '邮箱为必填项'),
              EmailValidator(errorText: '请输入有效的电子邮件地址')
            ]),
            onSaved: (value) => email = value,
          ),
          TextFormField(
            decoration: InputDecoration(labelText: '密码'),
            obscureText: true,
            validator: MultiValidator([
              RequiredValidator(errorText: '密码为必填项'),
              MinLengthValidator(8, errorText: '密码长度至少8位'),
              PatternValidator(r'(?=.*?[#?!@$%^&*-])', errorText: '密码必须包含至少一个特殊字符')
            ]),
            onSaved: (value) => password = value,
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState.validate()) {
                _formKey.currentState.save();
                // 执行登录操作...
                print('Email: $email, Password: $password');
              }
            },
            child: Text('登录'),
          ),
        ],
      ),
    );
  }
}

以上就是关于 form_field_validator 插件的基本介绍及使用方式。通过这些例子,您可以轻松地在自己的项目中集成该插件来进行表单验证。希望这对您有所帮助!


更多关于Flutter表单验证插件form_field_validator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter表单验证插件form_field_validator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用form_field_validator插件进行表单验证的代码示例。这个插件提供了一些方便的验证器,可以用于文本字段(TextField)的验证。

首先,确保你已经在pubspec.yaml文件中添加了form_field_validator依赖:

dependencies:
  flutter:
    sdk: flutter
  form_field_validator: ^4.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个完整的示例代码,展示了如何使用form_field_validator进行表单验证:

import 'package:flutter/material.dart';
import 'package:form_field_validator/form_field_validator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Form Field Validator Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: MyForm(),
        ),
      ),
    );
  }
}

class MyForm extends StatefulWidget {
  @override
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  String _email = '';
  String _password = '';
  String _errorMessage = '';

  void _submit() {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      // 处理表单提交
      print('Email: $_email');
      print('Password: $_password');
      setState(() {
        _errorMessage = 'Form submitted successfully!';
      });
    } else {
      setState(() {
        _errorMessage = 'Please fix the errors in the form.';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          TextFormField(
            decoration: InputDecoration(labelText: 'Email'),
            validator: MultiValidator([
              RequiredValidator(errorText: 'Email is required'),
              EmailValidator(regex: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$', errorText: 'Please enter a valid email'),
            ]),
            onSaved: (value) {
              _email = value!;
            },
          ),
          SizedBox(height: 16),
          TextFormField(
            decoration: InputDecoration(labelText: 'Password'),
            validator: MultiValidator([
              RequiredValidator(errorText: 'Password is required'),
              LengthValidator(min: 6, max: 20, errorText: 'Password must be between 6 and 20 characters'),
            ]),
            obscureText: true,
            onSaved: (value) {
              _password = value!;
            },
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: _submit,
            child: Text('Submit'),
          ),
          SizedBox(height: 16),
          Text(
            _errorMessage,
            style: TextStyle(color: Colors.red),
          ),
        ],
      ),
    );
  }
}

代码解释:

  1. 依赖引入:在pubspec.yaml文件中添加form_field_validator依赖。

  2. 全局键:使用GlobalKey<FormState>()来管理表单的状态。

  3. 表单字段

    • Email:使用TextFormField,并添加了两个验证器:RequiredValidator(必填)和EmailValidator(格式验证)。
    • Password:使用TextFormField,并添加了两个验证器:RequiredValidator(必填)和LengthValidator(长度验证)。
  4. 表单提交:在按钮的onPressed回调中,调用_formKey.currentState!.validate()来验证表单,如果验证通过,则调用_formKey.currentState!.save()保存表单数据,并处理表单提交。

  5. 错误信息:使用Text组件显示错误信息。

这样,你就可以在Flutter中使用form_field_validator插件来进行表单验证了。希望这个示例对你有所帮助!

回到顶部