run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
Future<void> run() async {
final appName = argResults?.rest.firstOrNull;
if (appName == null) {
throw UsageException('Missing app name.', usage);
}
final template = argResults?['template'] as String?;
final bundleId =
argResults?['bundle-id'] as String? ??
_logger.prompt('Bundle ID', defaultValue: 'com.example.app');
final platforms = _resolvePlatforms(argResults?['platforms'] as String?);
final config = template == 'starter'
? const StarterConfig(
useRiverpod: true,
useDio: true,
languages: StarterLanguage.values,
)
: _promptCustomConfig();
final created = await _processRunner.run(
message: 'Creating Flutter project',
executable: 'flutter',
arguments: [
'create',
appName,
'--org',
bundleId,
'--platforms',
platforms.map((platform) => platform.name).join(','),
],
failureMessage: 'Flutter create failed',
successMessage: 'Flutter project created',
);
if (!created) return;
final brick = Brick.path(await resolveTemplatePath('starter'));
final generator = await MasonGenerator.fromBrick(brick);
final packageName = _toPackageName(appName);
final languages = _normalizeLanguages(config.languages);
await generator.generate(
DirectoryGeneratorTarget(Directory(appName)),
vars: {
'package_name': packageName,
'display_name': packageName.toDisplayName(),
'use_riverpod': config.useRiverpod,
'use_dio': config.useDio,
'base_locale': StarterLanguage.en.code,
},
);
removeUnselectedTranslations(
projectDirectory: Directory(appName),
selectedLanguages: languages,
);
writeFlkitManifest(
projectDirectory: Directory(appName),
packageName: packageName,
useRiverpod: config.useRiverpod,
useDio: config.useDio,
languages: languages,
baseLocale: StarterLanguage.en,
);
ensureEnvironmentFiles(Directory(appName));
ensureEnvFilesAreIgnored(Directory(appName));
final dependenciesInstalled = await _processRunner.run(
message: 'Installing starter dependencies',
executable: 'flutter',
arguments: ['pub', 'get'],
workingDirectory: appName,
failureMessage: 'flutter pub get failed',
successMessage: 'Starter dependencies installed',
);
if (!dependenciesInstalled) return;
final translationsGenerated = await _processRunner.run(
message: 'Generating translations',
executable: 'dart',
arguments: ['run', 'slang'],
workingDirectory: appName,
failureMessage: 'Slang generation failed',
successMessage: 'Translations generated',
);
if (!translationsGenerated) return;
_logger
..success('Done')
..info('')
..info('Next steps:')
..info(' cd $appName')
..info(' dart run slang')
..info(' dart run build_runner build --delete-conflicting-outputs')
..info(' flutter run');
}