createProject function

Future<void> createProject({
  1. String? projectName,
  2. String? org,
  3. String? platformsCsv,
  4. String? androidLang,
  5. String? iosLang,
  6. bool force = false,
  7. bool useFvm = false,
  8. bool skipPubGet = false,
  9. String? kitVersion,
  10. String? kitRepo,
  11. bool? forceDownload,
  12. bool verbose = false,
})

Implementation

Future<void> createProject({
  String? projectName,
  String? org,
  String? platformsCsv,
  String? androidLang,
  String? iosLang,
  bool force = false,
  bool useFvm = false,
  bool skipPubGet = false,
  String? kitVersion,
  String? kitRepo,
  bool? forceDownload,
  bool verbose = false,
}) async {
  print(' ♥ flast v$packageVersion');

  await _checkShell();

  // Tentukan interaktivitas: jika projectName sudah diisi, skip semua prompt
  final interactive = projectName == null;

  final name = projectName ?? _askProjectName();

  final allowOverwrite = await confirmOverwrite(name, force: force);
  if (!allowOverwrite) {
    printBoxMessage('♦ Project creation cancelled.');
    exit(0);
  }

  // Pilihan proyek
  final organization = org ?? (interactive ? _askOrg() : 'com.example');
  final platforms = platformsCsv != null
      ? platformsCsv.split(',').map((e) => e.trim()).toList()
      : (interactive ? _askPlatforms() : ['android', 'ios', 'web']);
  final androidLanguage = androidLang ?? (interactive ? _askAndroidLang() : 'kotlin');
  final iosLanguage = iosLang ?? (interactive ? _askIosLang() : 'swift');

  final shell = Shell();

  // **Starter kit**
  String finalKitRepo = kitRepo ??
      (interactive
          ? Input(
              prompt: 'Enter starter kit repo URL (default: https://github.com/lyrihkaesa/flutter_starter_kit)',
              defaultValue: 'https://github.com/lyrihkaesa/flutter_starter_kit',
            ).interact()
          : null) ??
      'https://github.com/lyrihkaesa/flutter_starter_kit';

  String? finalKitVersion = kitVersion ??
      (interactive
          ? Input(
              prompt: 'Enter starter kit version/tag (leave empty for main)',
              defaultValue: 'main',
            ).interact()
          : null);

  bool finalForceDownload;
  if (interactive && forceDownload == null) {
    finalForceDownload = Confirm(
      prompt: 'Force download starter kit even if cached?',
      defaultValue: false,
    ).interact();
  } else {
    finalForceDownload = forceDownload ?? false;
  }

  await cloneStarterKitZipCached(
    name,
    repoUrl: finalKitRepo,
    tag: finalKitVersion,
    forceDownload: finalForceDownload,
    verbose: verbose,
  );

  await _updatePubspecName(name);

  if (File('.env.example').existsSync()) {
    await runCopy('.env.example', '.env');
  }
  final listPlatform = ['android', 'ios', 'web', 'windows', 'linux', 'macos'];
  printBoxMessage('♦ Cleaning $listPlatform...');
  for (var platform in listPlatform) {
    await safeDelete(platform);
  }

  // FVM setup
  bool shouldUseFvm = useFvm;
  if (interactive && !useFvm) {
    shouldUseFvm = Confirm(
      prompt: 'Do you want to use FVM (Flutter version management)?',
      defaultValue: false,
    ).interact();
  }

  if (shouldUseFvm) {
    await _setupFvmIfNeeded(shell, useFvm: true);
  }

  // Tentukan skipPubGet interaktif
  if (!skipPubGet && interactive) {
    skipPubGet = Confirm(
      prompt: 'Do you want to skip "pub get"?',
      defaultValue: false,
    ).interact();
  }

  // Flag untuk flutter create
  final noPubFlag = skipPubGet ? ' --no-pub ' : ' ';

  // flutter create
  final flutterCmd = shouldUseFvm ? 'fvm flutter' : 'flutter';
  await shell.run(
    '$flutterCmd create$noPubFlag--org $organization --platforms ${platforms.join(",")} '
    '--android-language $androidLanguage --ios-language $iosLanguage .',
  );

  final postSetupResult = await runPostSetup(
    shell: shell,
    interactive: interactive,
    useFvm: shouldUseFvm,
    skipPubGet: skipPubGet,
  );

  _printNextSteps(
    name,
    isUseFvm: shouldUseFvm,
    isRunMason: postSetupResult['isRunMason']!,
    isRunBuildRunner: postSetupResult['isRunBuildRunner']!,
    isSkipPubGet: skipPubGet,
  );
}