attach method

Future<ValidationResult?>? attach(
  1. BuildContext context,
  2. FormKey key,
  3. Object? value,
  4. Validator? validator,
)

Implementation

Future<ValidationResult?>? attach(
    BuildContext context, FormKey key, Object? value, Validator? validator) {
  final oldState = _attachedInputs[key];
  var state = FormValueState(value: value, validator: validator);
  if (oldState == state) {
    return null;
  }
  var lifecycle = oldState == null
      ? FormValidationMode.initial
      : FormValidationMode.changed;
  _attachedInputs[key] = state;
  // validate
  var future = validator?.validate(context, value, lifecycle);
  if (future != null) {
    _validity[key] = future;
  }
  // check for revalidation
  Map<FormKey, Future<ValidationResult?>> revalidate = {};
  for (var entry in _attachedInputs.entries) {
    var k = entry.key;
    var value = entry.value;
    if (key == k) {
      continue;
    }
    if (value.validator != null && value.validator!.shouldRevalidate(key)) {
      revalidate[k] =
          value.validator!.validate(context, value.value, lifecycle);
    }
  }
  for (var entry in revalidate.entries) {
    var k = entry.key;
    var future = entry.value;
    var attachedInput = _attachedInputs[k]!;
    attachedInput = FormValueState(
        value: attachedInput.value, validator: attachedInput.validator);
    _attachedInputs[k] = attachedInput;
    _validity[k] = future;
  }
  WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
    notifyListeners();
  });
  return future;
}