getFormBuilderErrors function

List<FormBuilderError> getFormBuilderErrors({
  1. List<FormFieldDef>? fields,
  2. required List<FieldResults> results,
  3. required String formId,
  4. required WidgetRef ref,
})

Implementation

List<FormBuilderError> getFormBuilderErrors(
    {List<FormFieldDef>? fields,
    required List<FieldResults> results,
    required String formId,
    required WidgetRef ref}) {
  List<FormBuilderError> errors = [];

  List<FormFieldDef> finalFields =
      fields ?? ref.read(formFieldsStorageNotifierProvider(formId));

  for (final field in finalFields) {
    final FieldResults? result =
        results.firstWhereOrNull((item) => item.id == field.id);
    // Skip validation if no result is found.
    if (result == null) continue;
    // skip validation if the field is hidden.
    if (field.hideField == true) continue;
    // skip validation if the field is locked.
    if (field.disabled == true) continue;

    // Run the validators in order and add the results to the errors.
    int validatorPosition = 0;
    for (final FormBuilderValidator validator in field.validators ?? []) {
      // Start by invalidating previous errors.
      ref
          .read(formBuilderErrorNotifierProvider(
                  formId, field.id, validatorPosition)
              .notifier)
          .clearError();

      final errorResult = validator.validator(result);

      if (!errorResult) {
        final errorOutput = FormBuilderError(
          fieldId: field.id,
          formId: formId,
          reason: validator.reason,
          validatorPosition: validatorPosition,
        );

        errors.add(errorOutput);

        ref
            .read(formBuilderErrorNotifierProvider(
                    formId, field.id, validatorPosition)
                .notifier)
            .setError(errorOutput);
      }

      validatorPosition++;
    }
  }

  return errors;
}