validate method
Validates the form field against its validation rules.
fieldsA map of form field states for cross-field validation.
Returns an error message if validation fails, otherwise returns null.
Implementation
@nonVirtual
String? validate(Map<String, FormFieldState> fields) {
bool _isBlank(dynamic value) {
if (value == null) return true;
if (value is String) return value.trim().isEmpty;
if (value is Iterable) return value.isEmpty;
return false;
}
// 1) Optional: if Optional passes, skip everything
final optionalRule = rules.whereType<Optional>().firstOrNull;
if (optionalRule != null && optionalRule.validate(value, fields)) {
return null;
}
// 2) RequiredIf: if NOT required and value is blank => skip everything
final requiredIfRule = rules.whereType<RequiredIf>().firstOrNull;
if (requiredIfRule != null) {
final requiredNow = requiredIfRule.isRequired(fields);
if (!requiredNow && _isBlank(value)) {
return null; // not required + empty => OK, skip other rules
}
}
// 3) Validate the rest (excluding Optional; RequiredIf will pass/fail itself)
for (final rule in rules) {
if (rule is Optional) continue;
if (!rule.validate(value, fields)) {
return rule.message(label);
}
}
return null; // All good
}