Flutter输入验证插件input_validator的使用

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

Flutter输入验证插件input_validator的使用

通过有效的方式来验证输入值。

安装

运行以下命令:

flutter pub add input_validator

使用

make 方法会在验证通过时返回 null

/// 导入包
import 'package:input_validator/input_validator.dart';

/// 基本示例
InputValidator.make(rules:"required|min_length:6", value:"password");

规则(Rules)

规则参数是一个字符串,它指导如何处理值。您可以提供尽可能多的规则,这些规则应该用 | 符号分隔。某些规则需要额外的参数,如 rule:param,param,这里的参数由逗号分隔。例如,您想获取用户性别,可以设置为 male,female,other。查看可用的验证规则及其解释。

值(Value)

值是要进行验证的有效载荷。

自定义验证消息

可以通过 messages 参数传递给 make 方法。它接受 Map<String, dynamic>。消息键应与规则名称匹配。消息值应为 StringCustomHandler。 示例:

InputValidator.make(
    rules:"required|min_length:6",
    value:null,
    messages:{
        "required": "密码是必需的。",
    },
);

自定义规则

以下是自定义规则的一个示例:

/// 强密码验证,
/// 最少一个大写字母
/// 最少一个小写字母
/// 最少一个数字
/// 最少一个特殊字符
/// 允许的常见字符(! @ # $ & * ~)
InputValidator.make(
    rules:"strongPassword",
    value:null,
    messages:{
        "strongPassword": CustomHandler(onHandle: (payload, _) {
            String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#$&*~]).{8,}$';
            RegExp regExp = new RegExp(pattern);
            return regExp.hasMatch(payload) ? null:"无效的密码!";
        })
    },
);

表单构建器

通过表单构建器来构建表单。请参阅示例标签中的完整示例。

var _form = InputValidator.builder(
    fields: {
        "full_name": FieldData(rules: "required|min_length:4"),
        "username": FieldData(rules: "required|min_length:4"),
        "age": FieldData(rules: "required|min:10"),
    },
);

Container(
    child: _form.build(context, child: (state) => ...)
)

可用验证规则

以下是所有可用验证规则及其功能的列表:

  • 必填(Required)
  • 最小值(Min)
  • 最大值(Max)
  • 数字(Numeric)
  • 大小(Size)
  • 长度(Length)
  • 最大长度(Max Length)
  • 最小长度(Min Length)
  • 电子邮件(Email)
  • 在列表中(In)
  • 日期(Date)
  • 日期范围(Date Between)
  • 日期之前(Date Before)
  • 日期之后(Date After)
  • 日期之前包含(Date Before Inclusive)
  • 日期之后包含(Date After Inclusive)
  • 自定义规则(Custom Rule)

必填(Required)

字段在输入数据中必须存在且不能为空。如果字段为空,则认为它是空的:

  • 值为 null
  • 值为一个空字符串

最小值(Min)

字段在验证时必须具有最小值且不能为空,并且该值应该是可转换为数值的。

// 示例
InputValidator.make(value: "5", rules: "min:10");
// 结果:至少提供10个字符。

最大值(Max)

字段在验证时必须具有最大值且不能为空,并且该值应该是可转换为数值的。

// 示例
InputValidator.make(value: "15", rules: "max:10");
// 结果:最大限制为10。

数字(Numeric)

字段在验证时必须是可以转换为数值的。

// 示例
InputValidator.make(value: "abc", rules: "numeric");
// 结果:无效的数字输入。

大小(Size)

字段在验证时必须是可以转换为数值的,并且大小应等于给定的大小。

// 示例
InputValidator.make(value: "5", rules: "size:10");
// 结果:大小应该是10。

长度(Length)

将调用 toString() 方法处理值,并检查字符串的长度是否与给定长度匹配。

// 示例
InputValidator.make(value: "5", rules: "length:10");
// 结果:输入应该是10个字符。

最小长度(Min Length)

将调用 toString() 方法处理值,并检查字符串的长度是否与给定长度匹配。

// 示例
InputValidator.make(value: "5", rules: "min_length:10");
// 结果:至少提供5个字符。

最大长度(Max Length)

将调用 toString() 方法处理值,并检查字符串的长度是否与给定长度匹配。

// 示例
InputValidator.make(value: "15", rules: "max_length:10");
// 结果:最多提供10个字符。

电子邮件(Email)

将使用正则表达式模式进行检查。您可以覆盖 Custom Handler 来自定义模式。

// 示例
InputValidator.make(value: "example@gmail", rules: "email");
// 结果:无效的电子邮件地址。

在列表中(In)

字段在验证时必须包含在给定的值列表中。

// 示例
InputValidator.make(value: "world", rules: "in:1,hello,world");
// 结果:无错误。

日期(Date)

有效的日期,可以使用 DateTime.parse() 解析。

// 示例
InputValidator.make(value: "date", rules: "date");
// 结果:无效的日期。

日期范围(Date Between)

有效的日期,可以使用 DateTime.parse() 解析。确保给定的日期在最小日期和最大日期之间。

// 示例 'date_between:min,max'
InputValidator.make(value: "2021-04-10", rules: "date_between:2021-05-17,2021-07-17");
// 结果:日期超出范围。

日期之前(Date Before)

有效的日期,可以使用 DateTime.parse() 解析。确保给定的日期早于检查日期。也可以尝试 Date Before Inclusive

// 示例 'date_before:date'
InputValidator.make(value: "2021-04-10", rules: "date_before:2021-05-17");
// 结果:无错误。

日期之后(Date After)

有效的日期,可以使用 DateTime.parse() 解析。确保给定的日期晚于检查日期。也可以尝试 Date After Inclusive

// 示例 'date_after:date'
InputValidator.make(value: "2021-04-10", rules: "date_after:2021-05-17");
// 结果:提供更晚的日期。

日期之后包含(Date After Inclusive)

有效的日期,可以使用 DateTime.parse() 解析。确保给定的日期晚于或等于检查日期。

// 示例 'date_after_inclusive:date'
InputValidator.make(value: "2021-05-17", rules: "date_after_inclusive:2021-05-17");
// 结果:无错误。

日期之前包含(Date Before Inclusive)

有效的日期,可以使用 DateTime.parse() 解析。确保给定的日期早于或等于检查日期。

// 示例 'date_before_inclusive:date'
InputValidator.make(value: "2021-05-17", rules: "date_before_inclusive:2021-05-17");
// 结果:无错误。

示例代码

以下是一个完整的示例代码,展示了如何使用 input_validator 插件来验证表单字段:

import 'dart:math';

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Input Validator',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  /// 初始化表单构建器字段
  final formBuilder = InputValidator.builder(fields: {
    "full_name": FieldData(rules: "required|min_length:4"),
    "email": FieldData(rules: "required|email"),
    "password": FieldData(
      rules: "required|min_length:6|max_length:16|strong",
      messages: {
        "strong": CustomHandler(
          onHandle: (payload, _) {
            String p = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$';
            return payload != null && RegExp(p).hasMatch(payload)
                ? null
                : "需要大写字母、小写字母、数字和符号。";
          },
        ),
      },
    ),
    "username": FieldData(rules: "required|min_length:4"),
  });

  [@override](/user/override)
  void dispose() {
    /// 释放表单构建器的流
    formBuilder.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("输入验证演示"),
      ),
      body: formBuilder.build(
        context: context,
        child: (formState) {
          return Column(
            children: [
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
                child: Row(
                  children: [
                    Expanded(
                      child: TextField(
                        onChanged: (value) async {
                          if (formState.add("username", value)) {
                            formState.setState = "CHECKING_USERNAME";
                            var isValid = await checkUsername(value);
                            if (!isValid) {
                              formState.setError("username", "用户名不可用。");
                            } else {
                              formState.setError("username", null);
                            }
                            formState.setState = "STABLE";
                          }
                        },
                        decoration: InputDecoration(
                          icon: Icon(Icons.person),
                          labelText: "用户名",
                          errorText: formState.getError("username"),
                        ),
                      ),
                    ),
                    if (formState.currentState == "CHECKING_USERNAME")
                      CircularProgressIndicator()
                  ],
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
                child: TextField(
                  onChanged: (value) => formState.add("full_name", value),
                  decoration: InputDecoration(
                    icon: Icon(Icons.edit),
                    labelText: "全名",
                    errorText: formState.getError("full_name"),
                  ),
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
                child: TextField(
                  onChanged: (value) => formState.add("email", value),
                  decoration: InputDecoration(
                    icon: Icon(Icons.email),
                    labelText: "电子邮件",
                    errorText: formState.getError("email"),
                  ),
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
                child: TextField(
                  onChanged: (value) => formState.add("password", value),
                  decoration: InputDecoration(
                    icon: Icon(Icons.lock_open),
                    labelText: "密码",
                    errorText: formState.getError("password"),
                  ),
                ),
              ),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
                child: ElevatedButton(
                  onPressed: !formState.hasError && formState.currentState != "CHECKING_USERNAME"
                      ? () {
                          if (formState.validate()) {
                            print(formState.formData);
                          } else {
                            print("无效的输入");
                          }
                        }
                      : null,
                  child: Text("提交"),
                ),
              ),
            ],
          );
        },
      ),
    );
  }

  Future<bool> checkUsername(String value) {
    var used = ["test", "hello", "utpal", "sarkar"];
    int d = Random(0).nextInt(2);
    return Future.delayed(Duration(seconds: d), () {
      return !used.contains(value);
    });
  }
}

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

1 回复

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


当然,input_validator 是一个在 Flutter 中非常有用的插件,用于处理各种输入验证场景。以下是一个如何使用 input_validator 插件的示例代码案例。

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

dependencies:
  flutter:
    sdk: flutter
  input_validator: ^x.y.z  # 替换为最新版本号

然后,运行 flutter pub get 以获取依赖包。

接下来是一个简单的示例,展示如何在 Flutter 应用中使用 input_validator 进行输入验证:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Input Validator Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Input Validator Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (!EmailValidator().isValid(value)) {
                    return 'Please enter a valid email address.';
                  }
                  return null;
                },
                onChanged: (value) {
                  setState(() {
                    _email = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(labelText: 'Password'),
                validator: (value) {
                  if (value.length < 6) {
                    return 'Password must be at least 6 characters long.';
                  }
                  // 你可以添加更多的验证规则,比如包含字母和数字等
                  return null;
                },
                obscureText: true,
                onChanged: (value) {
                  setState(() {
                    _password = value;
                  });
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () async {
                  if (_formKey.currentState!.validate()) {
                    // 如果验证通过,执行进一步操作,比如提交表单
                    setState(() {
                      _errorMessage = '';
                    });
                    // 这里可以添加提交表单的逻辑
                    print('Email: $_email');
                    print('Password: $_password');
                  } else {
                    // 如果验证失败,显示错误信息
                    setState(() {
                      _errorMessage = 'Please fix the errors in the form.';
                    });
                  }
                },
                child: Text('Submit'),
              ),
              SizedBox(height: 10),
              Text(_errorMessage),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的表单,包含两个文本字段:一个用于输入电子邮件,另一个用于输入密码。我们使用 EmailValidator 类来验证电子邮件地址的有效性,并手动检查密码的长度。如果表单验证失败,会显示一个错误信息。

注意,input_validator 插件提供了多种预定义的验证器,例如 EmailValidator, PhoneNumberValidator, UrlValidator 等,你可以根据需要进行选择和使用。同时,你也可以自定义验证逻辑来满足特定的需求。

回到顶部