run method

  1. @override
Future<void> run()
override

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');
}