该包提供 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"),
];
}
您可以创建 AsyncValidationRule 和 AsyncValidator,它们都可以包含 ValidationRule 和 AsyncValidationRules 规则。
验证结果具有一些方便的方法,如 when、maybeWhen、map 和 maybeMap。用于如下用途:
// 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
},
);