initializeForm method

void initializeForm(
  1. String componentName,
  2. FormDefinition formJson,
  3. Map<String, dynamic>? existingData,
  4. DisplayMode mode,
)

Implementation

void initializeForm(String componentName, FormDefinition formJson,
    Map<String, dynamic>? existingData, DisplayMode mode) async {
  formDefinitions[componentName] = formJson;
  formValidation = formJson.formValidation;
  displayMode = mode;
  values.clear();
  errors.clear();
  touched.clear();
  fieldsDisabled.clear();

  await Future.delayed(Duration(milliseconds: 100));

  int startIndex = formJson.startWithIndex ?? 0;

  // Handle repeatable sections with existing data
  if (formJson.repeatable == true &&
      existingData != null &&
      formJson.sections != null) {
    for (var section in formJson.sections!) {
      if (section.fields.isNotEmpty) {
        // Get the array path for repeatables
        final firstFieldName = section.fields.first.name;
        final arrayPath = deriveRepeatableArrayPath(firstFieldName);

        if (arrayPath != null) {
          // Get the nested value (array) for this section
          final result = getNestedValue(existingData, arrayPath);

          if (result != null && result is List && result.isNotEmpty) {
            // Update startWithIndex based on existing data length
            startIndex = result.length - 1;
            formJson.startWithIndex = startIndex;
          }
        }
      }
    }
  }

  for (int index = 0; index <= startIndex; index++) {
    allFields.addAll(extractFields(formJson, index: index));
  }

  if (existingData != null) {
    values.addAll(flattenObject(existingData));
  }

  // Set default values & disabled fields
  for (var field in allFields) {
    await processFieldLogic(field);
  }

  notifyListeners();
}