runBuild function
Runs Flutter build with optional flavor via an interactive menu.
User selects target (apk, appbundle, ios, ipa), optionally a build mode for
APK (release / debug / profile), and optionally a flavor name; then
ProcessRunner.runFlutter runs
flutter build <target> [--debug|--profile] [--flavor <name>].
Implementation
Future<void> runBuild() async {
if (!FlutterProjectDetector.ensureFlutterProject()) return;
ConsoleLog.title('Flutter build');
final targetIndex = Select(
prompt: 'Select build target:',
options: buildTargets,
).interact();
final target = buildTargets[targetIndex];
String buildMode = 'release';
if (target == 'apk') {
final modeOptions = ['release', 'debug', 'profile'];
final modeIndex = Select(
prompt: 'Select build mode for APK:',
options: modeOptions,
).interact();
buildMode = modeOptions[modeIndex];
}
final flavorOptions = ['None', 'Enter flavor name'];
final flavorChoice = Select(
prompt: 'Add flavor?',
options: flavorOptions,
).interact();
String? flavor;
if (flavorChoice == 1) {
flavor = Input(
prompt: 'Flavor name (e.g. dev, staging, prod):',
).interact();
if (flavor.trim().isEmpty) flavor = null;
}
final args = <String>['build'];
switch (target) {
case 'apk':
args.add('apk');
break;
case 'appbundle':
args.add('appbundle');
break;
case 'ios':
args.add('ios');
break;
case 'ipa':
args.add('ipa');
break;
default:
ConsoleLog.error('Unknown target: $target');
return;
}
// For APK we allow choosing debug/profile; release is the default.
if (target == 'apk') {
if (buildMode == 'debug') {
args.add('--debug');
} else if (buildMode == 'profile') {
args.add('--profile');
} else {
// Explicit release (equivalent to default `flutter build apk`).
args.add('--release');
}
}
if (flavor != null && flavor.isNotEmpty) {
args.add('--flavor');
args.add(flavor);
}
ConsoleLog.step('Running: flutter ${args.join(' ')}');
final code = await ProcessRunner.runFlutter(args);
if (code == 0) {
ConsoleLog.success('Build completed successfully.');
} else {
ConsoleLog.error('Build failed with exit code $code');
}
}