buildFlutter method
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,
);
}