generate method

Future<void> generate({
  1. VoidCallBack? onBeforeFirebase,
})

Generates the complete Flutter project with all configured features.

This method orchestrates the entire project generation process including:

  • Creating the Flutter project structure
  • Generating screens and routing
  • Configuring Firebase (if enabled)
  • Setting up Docker (if web + docker enabled)
  • Generating localization files (if multiple languages selected)

onBeforeFirebase - Optional callback executed before Firebase configuration

Throws Exception if project creation fails.

Implementation

Future<void> generate({VoidCallBack? onBeforeFirebase}) async {
  final progress = logger.progress('Creating Flutter app: $projectName');

  try {
    // Step 1: Create Flutter project
    await _createFlutterProject();
    progress.update('Creating Flutter app: $projectName');

    // Step 2: Generate folder structure
    await _generateFolderStructure();
    progress.update('Setting up project structure');

    // Step 3: Generate pubspec.yaml with all dependencies
    await _generatePubspec();
    progress.update('Configuring dependencies');

    // Step 4: Generate theme
    await _generateTheme();
    progress.update('Generating theme');

    // Step 5: Generate reusable widgets
    await _generateEnhancedReusableWidgets();

    // Step 6: Generate chatbot if enabled
    if (includeChatbot) {
      await _generateChatbot();
    }

    // Step 7: Generate Firebase operations if enabled
    if (includeFirebase && firebaseModules.isNotEmpty) {
      await _generateFirebaseOperations();
    }

    await _generateUtilityModules();
    await _configureNative();

    // Step 8: Generate screens
    await _generateScreens();

    // Step 9: Generate router
    await _generateRouter();

    // Step 10: Generate main.dart
    await _generateMainFile();

    // Step 11: Replace default test with a compatible smoke test
    await _generateTestFile();

    // Step 12: Run flutter pub get
    await _runFlutterPubGet();

    // Step 13: Enable Flutter Web if requested
    if (includeWeb) {
      await _enableFlutterWeb();
    }

    // Step 14: Generate Docker setup if Web + Docker enabled
    if (includeWeb && includeDocker) {
      await _generateDockerSetup();
    }

    // Step 15: Generate localization files
    if (selectedLanguages.isNotEmpty && selectedLanguages.length > 1) {
      await _generateLocalization();
    }
    // Step 16: Generate README.md
    await _generateReadme();

    // Complete the progress before Firebase config
    progress.complete('Project created successfully!');

    // Step 16: Configure Firebase AFTER completing progress
    // This is crucial - Firebase config needs interactive input
    if (includeFirebase) {
      onBeforeFirebase?.call();
      await _configureFirebase();
    }

    logger
        .success('✨ Project generated successfully with $themeColor theme!');
  } catch (e, st) {
    progress.fail('Failed to create project');
    logger.err('Error: $e');
    logger.detail(st.toString());
    rethrow;
  }
}