Flutter表单验证插件validator_generator的使用

Flutter表单验证插件validator_generator的使用

概述

validator_generator 是一个用于生成表单验证器的 Dart 构建系统插件。通过在类上添加注解,该插件会在构建时生成相应的验证器类。

安装

要配置项目以使用 validator_generator,请在 pubspec.yaml 文件中添加依赖:

dependencies:
  validator_annotation: ^x.x.x

dev_dependencies:
  build_runner: ^x.x.x
  validator_generator: ^x.x.x

然后运行以下命令来获取依赖项:

flutter pub get

示例

假设你有一个名为 UserModel 的类,它包含两个字段:emailpassword。我们希望为这些字段添加验证规则,并生成相应的验证器类。

步骤 1: 添加注解

首先,在 UserModel 类上添加 @ClassValidator 注解,并在每个字段上添加适当的验证注解。

import 'package:validator_annotation/validator_annotation.dart';

part 'user_model.validator.dart';

@ClassValidator(
  // 只获取第一个错误
  stopWhenFirstError: false,
  // 验证函数命名约定
  namingConvention: NamingConvention.snack_case,
)
class UserModel {
  // 对 email 字段应用非空字符串验证
  @IsNotEmptyStringValidator()
  // 对 email 字段应用电子邮件验证
  @IsEmailValidator(
    // 自定义字段名
    fieldName: 'email',
    // 自定义错误消息
    errorMessage: '不是有效的电子邮件',
  )
  final String email;

  @IsNotEmptyStringValidator()
  final String password;

  const UserModel({
    required this.email,
    required this.password,
  });
}
步骤 2: 运行构建工具

运行以下命令以生成相应的验证器类文件 user_model.validator.dart

dart run build_runner build
步骤 3: 查看生成的验证器类

构建完成后,会生成 user_model.validator.dart 文件。以下是生成的文件内容:

// GENERATED CODE - DO NOT MODIFY BY HAND

// ignore_for_file: non_constant_identifier_names

part of 'user_model.dart';

// **************************************************************************
// ValidatorModelGenerator
// **************************************************************************

class UserModelValidator {
  static String? validate_email(String value) {
    final validatorAnnotations = [
      const IsNotEmptyStringValidator(),
      const IsEmailValidator(fieldName: 'email', errorMessage: '不是有效的电子邮件')
    ];
    return validateField(
      value,
      validatorAnnotations,
    );
  }

  static String? validate_password(String value) {
    final validatorAnnotations = [const IsNotEmptyStringValidator()];
    return validateField(
      value,
      validatorAnnotations,
    );
  }

  static ValidationResult validate(UserModel instance) {
    // 验证数据
    final validationDatas = [
      ValidationData(
        instanceMemberSymbol: 'email',
        valueToValidate: instance.email,
        annotations: [
          const IsNotEmptyStringValidator(),
          const IsEmailValidator(
              fieldName: 'email', errorMessage: '不是有效的电子邮件')
        ],
      ),
      ValidationData(
        instanceMemberSymbol: 'password',
        valueToValidate: instance.password,
        annotations: [const IsNotEmptyStringValidator()],
      )
    ];

    // 验证器选项
    const stopWhenFirstError = false;
    return validateInstance(
      validationDatas,
      stopWhenFirstError: stopWhenFirstError,
    );
  }
}

使用验证器

现在你可以使用生成的验证器类来验证 UserModel 实例。

void main() {
  final user = UserModel(email: '', password: '');

  final validationResult = UserModelValidator.validate(user);

  if (validationResult.isValid) {
    print('表单验证通过');
  } else {
    print('表单验证失败');
    validationResult.errors.forEach((error) {
      print(error.message);
    });
  }
}

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

1 回复

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


validator_generator 是一个用于生成 Flutter 表单验证代码的插件。它可以帮助你自动生成表单字段的验证逻辑,减少手动编写重复代码的工作量。以下是如何使用 validator_generator 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 validator_generatorbuild_runner 依赖:

dependencies:
  flutter:
    sdk: flutter
  validators: ^0.3.0  # 或者其他版本

dev_dependencies:
  build_runner: ^2.1.0
  validator_generator: ^1.0.0  # 或者其他版本

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

2. 创建数据模型类

接下来,你需要创建一个数据模型类,并使用 [@Validator](/user/Validator) 注解来标记需要验证的字段。

import 'package:validator_generator/validator_generator.dart';

part 'user_model.g.dart'; // 生成的代码文件

[@Validator](/user/Validator)()
class UserModel {
  @RequiredValidator(errorMessage: "Username is required")
  String? username;

  @EmailValidator(errorMessage: "Invalid email address")
  String? email;

  @MinLengthValidator(6, errorMessage: "Password must be at least 6 characters")
  String? password;
}

3. 生成验证代码

运行以下命令来生成验证代码:

flutter pub run build_runner build

这将会生成一个 user_model.g.dart 文件,其中包含了自动生成的验证逻辑。

4. 使用生成的验证器

你可以在 Flutter 表单中使用生成的验证器。例如:

import 'package:flutter/material.dart';
import 'user_model.dart'; // 导入生成的文件

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

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  final _userModel = UserModel();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          TextFormField(
            decoration: InputDecoration(labelText: 'Username'),
            validator: _userModel.validateUsername,
            onSaved: (value) => _userModel.username = value,
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Email'),
            validator: _userModel.validateEmail,
            onSaved: (value) => _userModel.email = value,
          ),
          TextFormField(
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: _userModel.validatePassword,
            onSaved: (value) => _userModel.password = value,
          ),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                _formKey.currentState!.save();
                // 处理表单提交
              }
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}

5. 运行应用

现在你可以运行你的 Flutter 应用,并看到表单验证功能已经自动生成并集成到你的应用中。

6. 自定义验证器

如果你需要自定义验证器,可以在 [@Validator](/user/Validator) 注解中添加自定义的验证逻辑。例如:

[@Validator](/user/Validator)()
class UserModel {
  [@CustomValidator](/user/CustomValidator)(
    validate: (value) {
      if (value != null && value.contains('admin')) {
        return "Username cannot contain 'admin'";
      }
      return null;
    },
    errorMessage: "Invalid username"
  )
  String? username;
}
回到顶部