buildFlutter method

Future<BuildStepResult> buildFlutter({
  1. required String platform,
})

flutter build <platform> --release inside the Flutter app project. Returns BuildStepResult.skipped when the platform is not in config.platforms (defensive — buildAll filters by the list, but a direct invocation might pass anything).

Implementation

Future<BuildStepResult> buildFlutter({required String platform}) async {
  final String label = 'Flutter build $platform';

  if (!config.template.isFlutterApp) {
    return BuildStepResult.skipped(
      BuildStepKind.flutterPlatform,
      label,
      reason: 'Template ${config.template.displayName} is not a Flutter app.',
    );
  }

  if (!config.template.supportedPlatforms.contains(platform)) {
    return BuildStepResult.skipped(
      BuildStepKind.flutterPlatform,
      label,
      reason: 'Platform "$platform" is not supported by '
          '${config.template.displayName}.',
    );
  }

  if (!config.platforms.contains(platform)) {
    return BuildStepResult.skipped(
      BuildStepKind.flutterPlatform,
      label,
      reason: 'Platform "$platform" is not enabled in setup_config.env.',
    );
  }

  final Directory projectDir = Directory(_flutterAppPath);
  if (!projectDir.existsSync()) {
    return BuildStepResult.failed(
      BuildStepKind.flutterPlatform,
      label,
      reason: 'Project directory not found: ${projectDir.path}',
    );
  }

  info('Building Flutter $platform...');

  final ProcessResult? result = await _runner.runWithRetry(
    'flutter',
    <String>['build', platform, '--release'],
    workingDirectory: projectDir.path,
    operationName: 'flutter build $platform',
  );

  if (result == null || !result.success) {
    return BuildStepResult.failed(
      BuildStepKind.flutterPlatform,
      label,
      reason: result?.stderr.trim() ?? 'flutter build $platform failed.',
    );
  }

  final String outputPath = p.join(projectDir.path, 'build', platform);
  return BuildStepResult.success(
    BuildStepKind.flutterPlatform,
    label,
    outputPath: outputPath,
  );
}