Flutter表单验证插件bandicoot_validation的使用

Flutter表单验证插件bandicoot_validation的使用

Bandicoot是一个验证模式库,它使创建验证模式变得简单,并且可以将这些验证模式应用于提供的Map。此外,Bandicoot还提供了对映射值进行清理的能力。

创建一个Schema

要创建一个模式,只需初始化一个新的Validator类并添加你希望为每个属性应用的验证规则和/或清理规则。

import 'package:bandicoot_validation/bandicoot_validation.dart';

PasswordRules passwordRules = PasswordRules();

Validator RegisterUserValidator = Validator()
  ..property(
    name:'firstName',
    validators: [IsString()]
  )
  ..property(
    name:'lastName',
    validators: [IsString()]
  )
  ..property(
    name: 'emailAddress',
    validators: [IsEmail()]
  )
  ..property(
    name: 'confirmEmailAddress',
    validators: [MatchesProperty('emailAddress')]
  )
  ..property(
    name: 'password',
    validators: [IsPassword(passwordRules)]
  )
  ..property(
    name:'confirmPassword',
    validators: [MatchesProperty('password')]
  );

void main() {
  Map registerData = {
    'firstName': 'John',
    'lastName': 'Doe',
    'emailAddress': 'example@gmail.com',
    'confirmEmailAddress': 'example@gmail.com',
    'password': 'insecure',
    'confirmPassword': 'insecure'
  };

  List<String> errors = RegisterUserValidator.validate(registerData);

  if (errors.length > 0) {
    // 错误已被返回
  } else {
    // 没有错误!
  }
}

验证规则

以下是可用的验证规则及其描述:

验证规则 描述
Equals(String value) 检查属性是否等于特定值。
IsEmail() 检查属性是否为有效的电子邮件地址。
IsEnum(Enum) 检查属性是否为有效的枚举。
IsInt() 检查属性是否为int类型。
IsPassword(PasswordRules rules) 检查属性是否符合密码规则。
IsString() 检查属性是否为字符串。
IsUUID(String version = 'all') 检查属性是否为有效的UUID。
MatchesProperty(String property) 检查属性是否与另一个属性的值匹配。
Matches(String pattern) 检查属性是否与正则表达式匹配。
Validate(ValidateFunction validate) 检查属性是否通过自定义验证。

清理规则

以下是可用的清理规则及其描述:

清理规则 描述
ToDate() 将值强制转换为DateTime
ToInt() 将字符串值强制转换为num
ToString() 将非字符串值强制转换为String

扩展性

使用Bandicoot,创建自定义验证和清理器非常容易。你只需要创建一个返回ValidationRuleSanitizeRule的函数即可。

示例ValidationRule

import 'package:bandicoot_validation/bandicoot_validation.dart';

ValidationRule IsIn(List<dynamic> array, {String? message}) => ValidationRule(
    message: message,
    constraints: [array],
    validate: (value, arguments) =>
        Future(() => arguments.constraints[0].contains(value)),
    defaultMessage: (arguments) {
      String property = arguments.property;
      String arrayValues = arguments.constraints[0].join(', ');
      return "$property 必须是以下值之一: $arrayValues";
    });

示例SanitizeRule

import 'package:bandicoot_validation/bandicoot_validation.dart';

DateTime? toDate(String string) {
  try {
    return DateTime.parse(string);
  } catch (e) {
    return null;
  }
}

SanitizeRule ToDate() => SanitizeRule(
    constraints: [], sanitize: (value, arguments) => toDate(value));

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

1 回复

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


bandicoot_validation 是一个用于 Flutter 应用的表单验证插件,它提供了简单且灵活的验证规则,帮助开发者轻松地验证表单输入。以下是如何使用 bandicoot_validation 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 bandicoot_validation 依赖:

dependencies:
  flutter:
    sdk: flutter
  bandicoot_validation: ^1.0.0  # 请使用最新版本

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

2. 导入包

在需要使用表单验证的 Dart 文件中导入 bandicoot_validation 包:

import 'package:bandicoot_validation/bandicoot_validation.dart';

3. 创建表单并应用验证规则

接下来,你可以创建一个表单,并应用 bandicoot_validation 提供的验证规则。

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

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

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  final _emailController = TextEditingController();
  final _passwordController = TextEditingController();

  @override
  void dispose() {
    _emailController.dispose();
    _passwordController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Form Validation with Bandicoot'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            children: [
              TextFormField(
                controller: _emailController,
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) => Validator.validateEmail(value),
              ),
              SizedBox(height: 16.0),
              TextFormField(
                controller: _passwordController,
                decoration: InputDecoration(labelText: 'Password'),
                obscureText: true,
                validator: (value) => Validator.validatePassword(value),
              ),
              SizedBox(height: 24.0),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // 表单验证通过,执行提交操作
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(content: Text('Form Submitted Successfully')),
                    );
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 使用验证器

bandicoot_validation 提供了一些内置的验证器,例如 validateEmailvalidatePassword。你也可以创建自定义的验证规则。

内置验证器示例:

  • Validator.validateEmail(String? value): 验证电子邮件地址。
  • Validator.validatePassword(String? value): 验证密码(默认要求至少6个字符)。

自定义验证器示例:

你可以使用 Validator 类的 addRule 方法来添加自定义验证规则。

Validator.addRule('customRule', (value) {
  if (value == null || value.isEmpty) {
    return 'This field is required';
  }
  if (value.length < 5) {
    return 'Value must be at least 5 characters long';
  }
  return null;
});

然后在 validator 中使用自定义规则:

TextFormField(
  decoration: InputDecoration(labelText: 'Custom Field'),
  validator: (value) => Validator.validate('customRule', value),
),

5. 处理表单提交

在表单的提交按钮中,使用 _formKey.currentState!.validate() 来验证表单。如果所有字段都通过验证,validate() 方法将返回 true,你可以继续处理表单提交逻辑。

ElevatedButton(
  onPressed: () {
    if (_formKey.currentState!.validate()) {
      // 表单验证通过,执行提交操作
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Form Submitted Successfully')),
      );
    }
  },
  child: Text('Submit'),
),
回到顶部