Flutter数据验证插件dartx_validation的使用

Flutter数据验证插件dartx_validation的使用

dartx_validation 是一个用于简化Dart对象验证的库。它受到了 javax.validation 的启发。

示例

定义验证规则

首先,我们定义一个包含验证规则的类:

import 'package:dartx_validation/dartx_validation.dart';

@Valid()
class FooSize {
  @Size(min: 1)
  final List<String> list;

  FooSize(this.list);
}

自动生成验证器

上述定义将自动生成一个验证器类 FooSizeValidator,该类可以验证 FooSize 对象是否符合定义的规则:

class FooSizeValidator {
  List<ValidationError> validate(FooSize model) {
    var errors = <ValidationError>[];
    if (model.list!.length < 1)
      errors.add(ValidationError('list', '必须包含至少1个元素'));
    return errors;
  }
}

使用验证器

接下来,我们可以使用上述生成的验证器来验证 FooSize 对象:

void main() {
  // 创建一个有效的FooSize对象
  var validModel = FooSize(['item1']);
  var validator = FooSizeValidator();
  
  // 验证有效的对象
  var validErrors = validator.validate(validModel);
  print('Valid Model Errors: ${validErrors.isEmpty}'); // 输出: Valid Model Errors: true
  
  // 创建一个无效的FooSize对象
  var invalidModel = FooSize([]);
  var invalidErrors = validator.validate(invalidModel);
  
  // 打印错误信息
  print('Invalid Model Errors:');
  for (var error in invalidErrors) {
    print('${error.field}: ${error.message}');
  }
}

输出结果

当运行上述代码时,将会输出以下结果:

Valid Model Errors: true
Invalid Model Errors:
list: 必须包含至少1个元素

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

1 回复

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


dartx_validation 是一个用于 Flutter 应用中的数据验证插件,它提供了一种简单且灵活的方式来验证表单数据。通过使用 dartx_validation,你可以轻松地定义验证规则,并在用户输入数据时进行实时验证。

安装 dartx_validation

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

dependencies:
  flutter:
    sdk: flutter
  dartx_validation: ^0.1.0  # 请使用最新版本

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

使用 dartx_validation

1. 基本用法

dartx_validation 提供了一系列内置的验证规则,如 requiredemailminLengthmaxLength 等。你可以将这些规则应用到你的数据模型或表单字段中。

import 'package:dartx_validation/dartx_validation.dart';

void main() {
  // 创建一个验证器
  final validator = Validator({
    'username': [Required(), MinLength(3)],
    'email': [Required(), Email()],
    'password': [Required(), MinLength(6)],
  });

  // 验证数据
  final data = {
    'username': 'abc',
    'email': 'example@example.com',
    'password': 'password123',
  };

  final result = validator.validate(data);

  if (result.isValid) {
    print('Validation passed!');
  } else {
    print('Validation failed:');
    result.errors.forEach((field, errors) {
      print('$field: ${errors.join(', ')}');
    });
  }
}

2. 自定义验证规则

你可以通过继承 ValidationRule 类来创建自定义的验证规则。

class CustomRule extends ValidationRule {
  [@override](/user/override)
  String get errorMessage => 'Value must be exactly "custom"';

  [@override](/user/override)
  bool isValid(dynamic value) {
    return value == 'custom';
  }
}

void main() {
  final validator = Validator({
    'customField': [CustomRule()],
  });

  final data = {
    'customField': 'custom',
  };

  final result = validator.validate(data);

  if (result.isValid) {
    print('Validation passed!');
  } else {
    print('Validation failed:');
    result.errors.forEach((field, errors) {
      print('$field: ${errors.join(', ')}');
    });
  }
}

3. 在 Flutter 表单中使用

你可以将 dartx_validation 与 Flutter 的 TextFormField 结合使用,实现表单的实时验证。

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

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

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

  final validator = Validator({
    'username': [Required(), MinLength(3)],
    'email': [Required(), Email()],
    'password': [Required(), MinLength(6)],
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: [
          TextFormField(
            controller: _usernameController,
            decoration: InputDecoration(labelText: 'Username'),
            validator: (value) {
              final result = validator.validateField('username', value);
              return result.isValid ? null : result.errors.join(', ');
            },
          ),
          TextFormField(
            controller: _emailController,
            decoration: InputDecoration(labelText: 'Email'),
            validator: (value) {
              final result = validator.validateField('email', value);
              return result.isValid ? null : result.errors.join(', ');
            },
          ),
          TextFormField(
            controller: _passwordController,
            decoration: InputDecoration(labelText: 'Password'),
            obscureText: true,
            validator: (value) {
              final result = validator.validateField('password', value);
              return result.isValid ? null : result.errors.join(', ');
            },
          ),
          ElevatedButton(
            onPressed: () {
              if (_formKey.currentState!.validate()) {
                // 表单验证通过
                print('Form is valid');
              }
            },
            child: Text('Submit'),
          ),
        ],
      ),
    );
  }
}
回到顶部