FIREBASE_NOT_INITIALIZED flutter runtime_error ai_generated true

FirebaseException: Firebase not initialized. Make sure to call Firebase.initializeApp() before using any Firebase service.

ID: flutter/firebase-initialization-race

Also available as: JSON · Markdown · 中文
90%Fix Rate
86%Confidence
1Evidence
2024-02-14First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Flutter 3.22.0 active
firebase_core 2.24.0 active
firebase_auth 4.16.0 active

Root Cause

A Firebase service method was called before Firebase.initializeApp() completed, often due to a race condition in asynchronous initialization.

generic

中文

在 Firebase.initializeApp() 完成之前调用了 Firebase 服务方法,通常是由于异步初始化中的竞态条件。

Official Documentation

https://firebase.flutter.dev/docs/overview#initialization

Workarounds

  1. 95% success Ensure Firebase.initializeApp() is called at the top level of main.dart before runApp(). Use await and wrap in a try-catch. Example: void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
    Ensure Firebase.initializeApp() is called at the top level of main.dart before runApp(). Use await and wrap in a try-catch. Example: void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
  2. 90% success Use a FutureBuilder or a splash screen that waits for initialization. Example: FutureBuilder(future: Firebase.initializeApp(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return MyApp(); } else { return SplashScreen(); } })
    Use a FutureBuilder or a splash screen that waits for initialization. Example: FutureBuilder(future: Firebase.initializeApp(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return MyApp(); } else { return SplashScreen(); } })
  3. 85% success If using multiple Firebase instances, call Firebase.initializeApp() with the specific options for each instance before accessing their services.
    If using multiple Firebase instances, call Firebase.initializeApp() with the specific options for each instance before accessing their services.

中文步骤

  1. Ensure Firebase.initializeApp() is called at the top level of main.dart before runApp(). Use await and wrap in a try-catch. Example: void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); runApp(MyApp()); }
  2. Use a FutureBuilder or a splash screen that waits for initialization. Example: FutureBuilder(future: Firebase.initializeApp(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return MyApp(); } else { return SplashScreen(); } })
  3. If using multiple Firebase instances, call Firebase.initializeApp() with the specific options for each instance before accessing their services.

Dead Ends

Common approaches that don't work:

  1. Call Firebase.initializeApp() synchronously by removing async/await. 95% fail

    Firebase.initializeApp() is inherently asynchronous; removing await causes it to return a Future that may not complete before service calls.

  2. Move Firebase.initializeApp() to the initState() of every widget that uses Firebase. 80% fail

    Multiple calls to initializeApp() are not harmful but do not guarantee the timing; the race condition persists if widgets initialize independently.