Gérer Unhandled Exception: [core/duplicate-app] dans Flutter


Avatar de Pierre Courtois

Dans ce guide, je vous explique pourquoi l’erreur Unhandled Exception: [core/duplicate-app] se produit et comment la gérer.


Comment gérer l’erreur Unhandled Exception: [core/duplicate-app] dans Flutter ?

Si vous rencontrez l’erreur suivante en travaillant avec Firebase dans Flutter :

Unhandled Exception: [core/duplicate-app] A Firebase App named "[DEFAULT]" already exists

Cela signifie que votre application tente d’initialiser Firebase plus d’une fois avec le même nom d’application par défaut ([DEFAULT]).

Pour corriger ce problème, vous devez spécifier un nom unique pour l’instance Firebase lorsque vous l’initialisez. Pour cela, suivez ces étapes :

  1. Récupérez la valeur de projectId, que vous pouvez trouver dans :
    • Le fichier firebase.json
    • Ou dans le fichier lib/firebase_options.dart
  2. Puis, modifiez votre fonction main() de la manière qui suit :
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    name: "valeur_de_project_id",  // Ajouter cette ligne
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(MyApp());
}

Ceci permet d’éviter l’erreur A Firebase App named "[DEFAULT]" already exists en s’assurant que Firebase utilise un identifiant unique.

Pourquoi cette erreur se produit-elle ?

L’erreur [core/duplicate-app] se produit lorsque Firebase essaie d’être initialisé plusieurs fois dans une même application Flutter. Par défaut, Firebase crée une seule instance nommée [DEFAULT]. Si l’application tente de recréer cette instance, Firebase détecte qu’elle existe déjà et déclenche une erreur.

Ce problème apparaît surtout lorsqu’un projet Flutter est connecté à plusieurs « package names » sur Android ou « bundle identifiers » sur iOS dans le même projet Firebase.

Par exemple, imaginons que ton projet Flutter ait deux variantes :

  1. Une version de production avec le package name com.example.app
  2. Une version de test avec le package name com.example.app.debug

Si ces deux variantes sont reliées au même projet Firebase, Flutter peut tenter d’initialiser Firebase plusieurs fois en conflit avec l’instance [DEFAULT], ce qui déclenche l’erreur.

Cela peut aussi arriver en hot reload ou si un package dans ton projet essaie d’initialiser Firebase alors qu’il l’est déjà.

En spécifiant un nom unique lors de l’initialisation de Firebase, on empêche ce conflit. Au lieu d’essayer de recréer [DEFAULT], Flutter va créer une nouvelle instance séparée qui ne rentrera pas en collision avec l’existante.

L’astuce est d’utiliser le projectId de Firebase comme nom, car cette valeur est unique à ton projet. Ainsi, peu importe le package name utilisé (prod, debug, etc.), Flutter reconnaîtra chaque instance comme distincte et évitera l’erreur.

Avatar de Pierre Courtois