submit method

Future<void> submit(
  1. BlocxFormEventSubmit event,
  2. Emitter<BlocxFormState<F, E>> emit
)
inherited

Handles form submission.

The form is fully validated before any submit hook or use case is run. If validation fails, or if any required async field work is still pending, submission is blocked.

Implementation

Future<void> submit(
  BlocxFormEventSubmit event,
  Emitter<BlocxFormState<F, E>> emit,
) async {
  try {
    await validateForm(formData, forceFullValidation: true);

    if (!isFormSubmittable) {
      emitState(emit);
      return;
    }

    final proceed = await doBeforeSubmit(emit);
    if (!proceed) {
      emitState(emit);
      return;
    }

    emit(
      BlocxFormStateSubmittingForm(
        formData: formData,
        step: stepIndex,
      ),
    );

    final result = await submitUseCaseTask.execute();

    if (result.isFailure) {
      handleError(result.error!, emit);
      emitState(emit);
      return;
    }

    final shouldEmit = await onFormSubmitted(emit, result);
    if (shouldEmit) {
      emit(
        BlocxFormStateFormSubmitted(
          submittedData: result.data,
          formData: formData,
        ),
      );
    }

    emitState(emit);
  } catch (e, s) {
    emitState(emit);
    handleError(e, emit, stacktrace: s);
  }
}