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 :
- Récupérez la valeur de
projectId
, que vous pouvez trouver dans :- Le fichier
firebase.json
- Ou dans le fichier
lib/firebase_options.dart
- Le fichier
- 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 :
- Une version de production avec le package name
com.example.app
- 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.