configure method

Future<void> configure(
  1. String projectId, {
  2. List<String>? platforms,
  3. String? env,
})

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