Nie utworzono aplikacji Firebase „[DEFAULT]” - wywołaj Firebase.initializeApp () w Flutter i Firebase

181

Tworzę flutter App i mam zintegrowaną Firebase, ale wciąż pojawia się ten błąd, gdy klikam przycisk, aby się zarejestrować, zalogować lub wylogować. Widziałem innych ludzi, którzy zadawali to samo pytanie, ale wydaje mi się, że żadna z nich nie działa. Używam Fluttera i Android Studio. Czy może jakaś pomoc?

To jest fragment mojego kodu

    class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.red,
      body: Center(
        child: Container(
          child: RaisedButton(
            onPressed: () {            
              FirebaseAuth.instance.signOut().then((value) {
                Navigator.pushReplacement(
                    context,
                    MaterialPageRoute(
                        builder: (context) =>
                            LoginScreen()));
              });
            },
            child: Text("Logout"),
          )
        )
      )
    );
  }
}

Poniżej znajduje się zgłoszony wyjątek

══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()

When the exception was thrown, this was the stack:
#0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
#1      Firebase.app (package:firebase_core/src/firebase.dart:52:41)
#2      FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
#3      _HomeScreenState.build.<anonymous closure> (package:cosytok/screens/home.dart:20:28)
#4      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:992:19)
#5      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:1098:38)
#6      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:184:24)
#7      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:524:11)
#8      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:284:5)
#9      BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:219:7)
#10     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:477:9)
#11     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:78:12)
#12     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:124:9)
#13     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:377:8)
#14     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:122:18)
#15     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:108:7)
#16     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:220:19)
#17     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:200:22)
#18     GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:158:7)
#19     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:104:7)
#20     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:88:7)
#24     _invoke1 (dart:ui/hooks.dart:267:10)
#25     _dispatchPointerDataPacket (dart:ui/hooks.dart:176:5)
(elided 3 frames from dart:async)

Handler: "onTap"
Recognizer:
  TapGestureRecognizer#f0104
════════════════════════════════════════════════════════════════════════════════════════════════════

════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The following FirebaseException was thrown while handling a gesture:
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
Rabat Kobby
źródło

Odpowiedzi:

412

Od 17 sierpnia 2020 r

Wszystkie wersje Firebase zostały zaktualizowane i teraz musisz zadzwonić Firebase.initializeApp()przed użyciem dowolnego produktu Firebase, na przykład:

Po pierwsze, wszystkie produkty firebase_coreFirebase są teraz zależne od wersji (0.5.0+), dlatego musisz dodać ją do pubspec.yamlpliku:

dependencies:
  flutter:
    sdk: flutter
  firebase_core : ^0.5.0
  # cloud_firestore: ^0.14.0 other firebase dependencies

Następnie musisz zadzwonić Firebase.initializeApp():

Pierwszy przykład

import 'package:flutter/material.dart';

// Import the firebase_core plugin
import 'package:firebase_core/firebase_core.dart';

void main() {
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      // Initialize FlutterFire
      future: Firebase.initializeApp(),
      builder: (context, snapshot) {
        // Check for errors
        if (snapshot.hasError) {
          return SomethingWentWrong();
        }

        // Once complete, show your application
        if (snapshot.connectionState == ConnectionState.done) {
          return MyAwesomeApp();
        }

        // Otherwise, show something whilst waiting for initialization to complete
        return Loading();
      },
    );
  }
}

Drugi przykład z Firestore:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstRoute(title: 'First Route'),
    );
  }
}

class FirstRoute extends StatefulWidget {
  FirstRoute({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _FirstRouteState createState() => _FirstRouteState();
}

class _FirstRouteState extends State<FirstRoute> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("test"),
        ),
        body: FutureBuilder(
          future: getData(),
          builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.connectionState == ConnectionState.done) {
              return Column(
                children: [
                  Container(
                    height: 27,
                    child: Text(
                      "Name: ${snapshot.data.data()['name']}",
                      overflow: TextOverflow.fade,
                      style: TextStyle(fontSize: 20),
                    ),
                  ),
                ],
              );
            } else if (snapshot.connectionState == ConnectionState.none) {
              return Text("No data");
            }
            return CircularProgressIndicator();
          },
        ));
  }

  Future<DocumentSnapshot> getData() async {
    await Firebase.initializeApp();
    return await FirebaseFirestore.instance
        .collection("users")
        .doc("docID")
        .get();
  }
}

Trzeci przykład:

Zainicjuj go, initState()a następnie wywołaj, setState()który wywoła build()metodę.

  @override
  void initState() {
    super.initState();
    Firebase.initializeApp().whenComplete(() { 
      print("completed");
      setState(() {});
    });
  }

Czwarty przykład:

Zainicjuj go w main()metodzie po wywołaniuWidgetsFlutterBinding.ensureInitialized();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

Uwaga : wystarczy zadzwonić initializeApp()tylko raz

Peter Haddad
źródło
47
4. przykład powinien być tym. Pamiętaj tylko, aby dodać asynchroniczne. Zastanawiam się, czy opóźnienie jest zauważalne.
Ryde
15
Tak, czwarty przykład jest najlepszy, po prostu pomyślano, aby pokazać wszystkie sposoby, drugi jest dobry również dlatego, że możesz po prostu zainicjować przed pobraniem pierwszych danych z firestore lub bazy danych czasu rzeczywistego w tym samym FutureBuilder
Peter Haddad
5
Dzięki, działa na # 4. Ale jeśli naciśniesz przycisk „Wstecz”, kiedy wrócisz do aplikacji, zobaczysz to samo „Nie utworzono aplikacji Firebase '[DOMYŚLNIE]' - wywołaj Firebase.initializeApp ()”, nawet jeśli jest w main ()
Octet
4
@MichaelDiCioccio framework flutter wykorzystał wiązanie widgetów, aby móc współdziałać z silnikiem flutter. Kiedy wywołujesz ensureInitislized, tworzy instancję Widgetbindingi ponieważ Firebase.initializeApp()musi używać kanałów platformy do wywołania natywnego, a następnie musisz zainicjować powiązanie. api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/… (kanał platformy jest w silniku flutter)
Peter Haddad
2
# 4 Wydaje się, że nie działa z dostawcami (ten sam komunikat o błędzie, co początkowo)
rozbitek
74
  1. Dodaj do pubspec.yaml

    firebase_core :
    
  2. dodaj do main.dart

    import 'package:firebase_core/firebase_core.dart';
    
    void main() async {
       WidgetsFlutterBinding.ensureInitialized();
       await Firebase.initializeApp();
       runApp(MyApp());
    }
    
Muhammad Ashraf
źródło
1
Te wiersze dadzą: lib / main.dart: 6: 9: Error: Getter not found: „Firebase”. await Firebase.initializeApp (); ^^^^^^^^
Kaspar L. Palgi
Zapomniałem zaimplementować firebase_core. Zrobił to. Teraz: te wiersze dadzą: E / flutter (24294): [BŁĄD: flutter / lib / ui / ui_dart_state.cc (166)] Nieobsługiwany wyjątek: [core / no-app] Żadna aplikacja Firebase „[DOMYŚLNA]” nie została utworzono - zadzwoń do Firebase.initializeApp ()
Kaspar L. Palgi
Tutaj jest napisane firebase.google.com/support/release-notes/android, że: Firebase-core biblioteki Firebase na Androida nie jest już potrzebny. Ten pakiet SDK zawierał Firebase SDK dla Google Analytics. Teraz, aby korzystać z Analytics lub produktu, który zaleca korzystanie z Analytics (patrz tabela poniżej), musisz wyraźnie dodać zależność Analytics: com.google.firebase: firebase-analytics: 17.5.0 lub com.google.firebase: firebase -analytics-ktx: 17.5.0.
Kaspar L. Palgi
A co jeśli initializeApp ulegnie awarii? Aplikacja nie zostanie uruchomiona. Nie znalazłem nic na temat tego prawdopodobnie problemu.
Borys Salimow
@BorisSalimov Ponieważ initializeApp()jest to wywołanie asynchroniczne, aplikacja nadal będzie się uruchamiać, nawet jeśli się nie powiedzie
21rw
12

Jeśli chcesz połączyć firebase z aplikacją flutter, musisz zainicjować firebase przed użyciem. Możesz to zadeklarować, jak podano poniżej, a to pomoże Ci rozwiązać problem

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}

W filmie szczegółowo omówisz błąd

Raju Gupta
źródło
Pokazuje mi błąd - wyrzucono następujący NoSuchMethodError Builder Builder: I / flutter (5612): Metoda 'then' została wywołana na null. I / flutter (5612): Receiver: null I / flutter (5612): Próbowano dzwonić: then (Zamknięcie: (dynamiczne) => Null)
Abir Ahsan
Proszę śledzić wideo, które jest w linku, twój problem zostanie rozwiązany. Jeśli nadal napotykasz błąd, daj mi znać.
Raju Gupta
10

Oto proste rozwiązanie:

void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp(),);
}
Farrukh Sajjad
źródło
6

Odpowiedź @ petera jest doskonała !! ale jeśli nadal otrzymujesz błąd w kodzie i podążasz za flutter firebase codelab, pamiętaj, że te samouczki są nieaktualne od sierpnia 2020 r. i nie zostały jeszcze zaktualizowane. musisz wprowadzić wiele innych zmian, takich jak:

  • wymienić .dataz.data()
  • wymienić updateDatazupdate

Mam nadzieję, że może to pomóc niektórym początkującym, takim jak ja.

Muhammad
źródło
6

Jeśli zastosowałeś się do odpowiedzi Petera i nadal otrzymujesz ten sam błąd, sprawdź, czy mainpo await Firebase.initializeApp()wywołaniu pojawi się cokolwiek innego, co masz w funkcji , na przykład:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  runApp(MyApp());
}
J. Saw
źródło
Dzięki. Odpowiedź @ Petera pomogła jednak
Kobby Discount
4

Jeśli nadal masz problem po opuszczeniu aplikacji na ekranie głównym, możesz dodać to do dowolnego .dartpliku za pomocą firebase:

class App extends StatelessWidget {
  
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {

Lub w przypadku StatefulWidget:

import 'package:flutter/material.dart';

// Import the firebase_core plugin
import 'package:firebase_core/firebase_core.dart';

void main() {
  runApp(App());
}

class App extends StatefulWidget {
  _AppState createState() => _AppState();
}

class _AppState extends State<App> {
  // Set default `_initialized` and `_error` state to false
  bool _initialized = false;
  bool _error = false;

  // Define an async function to initialize FlutterFire
  void initializeFlutterFire() async {
    try {
      // Wait for Firebase to initialize and set `_initialized` state to true
      await Firebase.initializeApp();
      setState(() {
        _initialized = true;
      });
    } catch(e) {
      // Set `_error` state to true if Firebase initialization fails
      setState(() {
        _error = true;
      });
    }
  }

  @override
  void initState() {
    initializeFlutterFire();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    // Show error message if initialization failed
    if(_error) {
      return SomethingWentWrong();
    }

    // Show a loader until FlutterFire is initialized
    if (!_initialized) {
      return Loading();
    }

    return MyAwesomeApp();
  }
}

Więcej informacji znajdziesz pod tym linkiem .

Mehdi Rezzag Hebla
źródło
1
Otrzymuję błąd, nawet jeśli wykonuję tę samą procedurę, co w przypadku dokumentacji. tutaj jest błąd No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() . Zainicjowałem już Firebase w widżecie stanowym.
Vikrant Agrahari
3

1. dodaj tę zależność:

firebase_core :

Drugi: w głównej funkcji projektu dodaj te 2 linie i ustaw funkcję asynchroniczną

 void main() async {
  // these 2 lines
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  //
  runApp(MyApp());
}

teraz możesz normalnie używać Firebase w dowolnym pliku lub widżecie w projekcie.

Widżet FutureBuilder również będzie działał, ale musisz go dodawać za każdym razem, gdy chcesz uzyskać dostęp do firebase.

Abdelrahman Tarek
źródło
2

Musisz dodać, await Firebase.initializeApp();który jest plikiem Future. Zrób to w pliku dart, który uruchamia funkcję Firebase, jak poniżej:

import 'package:firebase_core/firebase_core.dart';
...

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}
giftmarimo
źródło