configure method
Configures FlutterFire for the current project using the
provided projectId.
Includes exponential backoff retry logic to handle cases where a newly created project's API hasn't propagated across Google's backend yet.
The platforms parameter specifies which platforms to configure
(e.g., 'android', 'ios', 'macos', 'web', 'windows').
The env parameter specifies the target environment name (e.g., 'dev').
Implementation
Future<void> configure(String projectId, {List<String>? platforms, String? env}) async {
print('āļø Configuring FlutterFire...');
try {
await run('flutterfire', ['--version']);
} catch (e) {
print('ā FlutterFire CLI not installed');
print('š Run: dart pub global activate flutterfire_cli');
rethrow;
}
final defaultAndroidPackage = detectAndroidPackageName();
final defaultIosBundle = detectIosBundleId();
print('š Detected default Android package: $defaultAndroidPackage');
print('š Detected default iOS bundle ID: $defaultIosBundle');
final finalAndroidPackage = defaultAndroidPackage ?? 'com.example.app';
final finalIosBundle = defaultIosBundle ?? 'com.example.app';
// 1. Configure default environment
print('\nāļø [Default Environment] Configuring apps in Firebase...');
await _runFlutterFireConfigure(
projectId: projectId,
platforms: platforms,
androidPackageName: finalAndroidPackage,
iosBundleId: finalIosBundle,
androidOut: 'android/app/google-services.json',
iosOut: 'ios/Runner/GoogleService-Info.plist',
outPath: 'lib/firebase_options.dart',
);
// 2. Configure custom/dev environment if specified
if (env != null && env.isNotEmpty) {
print('\nāļø [$env Environment] Configuring apps in Firebase...');
final envAndroidPackage = '$finalAndroidPackage.$env';
final envIosBundle = '$finalIosBundle.$env';
// Ensure target directories exist
Directory('lib/config/$env').createSync(recursive: true);
Directory('ios/Runner/$env').createSync(recursive: true);
Directory('android/app/src/$env').createSync(recursive: true);
await _runFlutterFireConfigure(
projectId: projectId,
platforms: platforms,
androidPackageName: envAndroidPackage,
iosBundleId: envIosBundle,
androidOut: 'android/app/src/$env/google-services.json',
iosOut: 'ios/Runner/$env/GoogleService-Info.plist',
outPath: 'lib/config/$env/firebase_options.dart',
);
}
}