该包提供 API 以方便地将验证和业务规则与应用程序表示形式分离。

特点

  • 以声明式方式表达您的规则。
  • 反馈不必是特定类型的(完全通用的)
  • 将相关规则分组并消除 if else 语句。
  • 支持规则的异步评估。

用法

请查看 /example 以获取完整详细的使用说明。

您可以使用 ruler 声明一个 ValidationRule,它封装了您的验证,当然还有您选择的 negativeFeedback,它可以是任何类型,然后调用 apply

final myName = 'Ahmed';
final arabicName = 'احمد';
final nameRule = ValidationRule(
            ruler: (value) {
              if (RegExp("[A-Za-z]").hasMatch(value)) {
                return true;
              }
              return false;
            },
            negativeFeedback: "Name has to be in English");
final validResult = nameRule.apply(myName); // Returns Valid
final invalidResult = nameRule.apply(arabicName); // Returns Invalid which has a reasons property of the type of the negative feedback passed earlier.

将规则分组可能很方便,您可以子类化 Validator 并覆盖其 rules getter 来声明您的规则。

class NameValidator extends Validator<String, dynamic> {
  @override
  List<ValidationRule<String, dynamic>> get rules => [
      ValidationRule(
            ruler: (value) {
              if (value.isNotEmpty){
                return true;
              }
              return false;
            },
            negativeFeedback: "Name can't be empty"),
        ValidationRule(
            ruler: (value) {
              if (RegExp("[A-Za-z]").hasMatch(value)) {
                return true;
              }
              return false;
            },
            negativeFeedback: "Name has to be in English"),
      ];
}

调用 validate 来获取结果

  
  final aValidName = "Ahmed";
  final invalidName = "";
  final nameValidator = NameValidator();
  final validResult = nameValidator.validate(aValidName); // Returns Valid
  final invalidResult = nameValidator.validate(invalidName); // Returns Invalid with a reasons property

您还可以混入 StringRules,其中包含 notEmpty 等常见规则

class NameValidator extends Validator<String, dynamic> with StringRules {
  @override
  List<ValidationRule<String, dynamic>> get rules => [
        notEmpty<String>(negativeFeedback: "This field can't be empty."),
        max(
            maxLength: 10,
            negativeFeedback: "Name can't be more than 10 characters."),
        ValidationRule(
            ruler: (value) {
              if (RegExp("[A-Za-z]").hasMatch(value)) {
                return true;
              }
              return false;
            },
            negativeFeedback: "Name has to be in English"),
      ];
}

您可以创建 AsyncValidationRuleAsyncValidator,它们都可以包含 ValidationRuleAsyncValidationRules 规则。

验证结果具有一些方便的方法,如 whenmaybeWhenmapmaybeMap。用于如下用途:

// Map validation result objects to String or null for use with the TextFormfield validator function.
nameValidator.validate(val).maybeMap(
    invalid: (invalid) => invalid.reasons.first,
    orElse: () => null,
);
// Side effects based on a validation result.
phoneValidator.validate(val).maybeWhen(
      invalid: (reasons) {
        // show a dialog
      },
      orElse: () {
        // pop the current screen
      },
);

GitHub

查看 Github