validate method

  1. @nonVirtual
String? validate(
  1. Map<String, FormFieldState> fields
)

Validates the form field against its validation rules.

  • fields A 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
}