createProject function
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,
})
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,
);
}