Не створено жодної програми Firebase '[DEFAULT]' - викликайте Firebase.initializeApp () у Flutter та Firebase


184

Я створюю додаток Flutter і вбудував Firebase, але ця помилка постійно з’являється, коли я натискаю кнопку, щоб зареєструватися, увійти або вийти. Я бачив, як інші люди задавали те саме питання, але, здається, жоден не працює для мене. Я використовую flutter та android studio. Може будь-яка допомога?

Це уривок мого коду

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

Нижче наведено виняток

══╡ 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()

Відповіді:


416

Починаючи з 17 серпня 2020 року

Усі версії Firebase оновлені, і тепер вам потрібно зателефонувати Firebase.initializeApp()перед використанням будь-якого продукту Firebase, наприклад:

По-перше, усі продукти firebase_coreFirebase тепер залежать від версії (0.5.0+), тому вам потрібно додати її у pubspec.yamlфайл:

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

Тоді вам потрібно зателефонувати Firebase.initializeApp():

Перший приклад

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

Другий приклад з 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();
  }
}

Третій приклад:

Ініціалізуйте його у initState()виклику, setState()який викликає build()метод.

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

Четвертий приклад:

Ініціалізуйте його в main()методі після викликуWidgetsFlutterBinding.ensureInitialized();

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

Примітка : Вам потрібно зателефонувати лише initializeApp()один раз


47
четвертим прикладом має бути це. Просто не забудьте додати асинхронізацію. Цікаво, чи помітна затримка.
Ryde

15
Так, четвертий приклад - найкращий, просто думав показати всі шляхи, другий - хороший ще й тим, що ви можете просто ініціалізувати, перш ніж отримувати перші дані з камінної бази або бази даних у реальному часі в тому ж FutureBuilder
Пітер Хаддад

5
Дякую, це працює за допомогою # 4. Але якщо натиснути кнопку «назад», коли ви повернетеся до додатка, він говорить те ж саме «Ні Firebase App '[DEFAULT] був створений - виклик Firebase.initializeApp ()» , навіть якщо він знаходиться в основний ()
Октет

4
@MichaelDiCioccio флютер фреймворк використовував віджет, щоб мати можливість взаємодіяти з механізмом флаттера. Коли ви викликаєте, ensureInitislizedце створює екземпляр Widgetbindingі, оскільки Firebase.initializeApp()для використання рідних каналів потрібно використовувати канали платформи, тоді вам потрібно ініалізувати прив'язку. api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/… (канал платформи знаходиться у механізмі флаттера)
Пітер Хаддад,

2
# 4, схоже, не працює з постачальниками (те саме повідомлення про помилку, що і спочатку)
відмова

74
  1. Додати до pubspec.yaml

    firebase_core :
    
  2. додати до main.dart

    import 'package:firebase_core/firebase_core.dart';
    
    void main() async {
       WidgetsFlutterBinding.ensureInitialized();
       await Firebase.initializeApp();
       runApp(MyApp());
    }
    

1
Ці рядки дадуть: lib / main.dart: 6: 9: Помилка: Getter не знайдено: 'Firebase'. очікуємо Firebase.initializeApp (); ^^^^^^^^
Каспар Л. Палгі

Я забув ввести firebase_core. Зробив це. Тепер: Ці рядки дадуть: E / flutter (24294): [ПОМИЛКА: flutter / lib / ui / ui_dart_state.cc (166)] Необроблений виняток: [core / no-app] Жодної програми Firebase "[DEFAULT]" не було створено - виклик Firebase.initializeApp ()
Каспар Л. Палгі

Тут написано firebase.google.com/support/release-notes/android, що: Ядро Firebase-бібліотеки Firebase Android більше не потрібне. Цей SDK включав Firebase SDK для Google Analytics. Тепер, щоб використовувати Analytics або продукт, що рекомендує використовувати Analytics (див. Таблицю нижче), потрібно чітко додати залежність Analytics: com.google.firebase: firebase-analytics: 17.5.0 або com.google.firebase: firebase -аналітика-ktx: 17.5.0.
Kaspar L. Palgi

А як бути, якщо InitializeApp вийде з ладу? Додаток не розпочато. Я не знайшов нічого про цю можливу проблему.
Борис Салімов

@BorisSalimov Оскільки initializeApp()це асинхронний виклик, програма все одно запуститься, навіть якщо не вдасться
21рв

12

Якщо ви хочете підключити Firebase до програми Flutter, вам потрібно ініціалізувати Firebase перед її використанням. Ви можете заявити про це, як зазначено нижче, і це допоможе вам вирішити проблему

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

У відео ви детально дізнаєтеся про помилку


Це показує мені помилку - Наступний NoSuchMethodError було викинуто Builder будівель: I / flutter (5612): Метод 'then' був викликаний null. I / flutter (5612): приймач: null I / flutter (5612): спробував зателефонувати: then (закриття: (динамічне) => null)
Абір Ахсан,

Будь ласка, перейдіть за відео, яке є за посиланням, і ваша проблема буде вирішена. Якщо проблема все ще стикається з помилкою, дайте мені знати.
Раджу Гупта,

10

Ось просте рішення для цього:

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

6

Відповідь @ peter ідеальна !! але якщо ви все ще отримуєте помилку у своєму коді та після флаттера firebase codelab, зверніть увагу, що ці підручники застарілі станом на серпень 2020 року і ще не оновлені. вам потрібно зробити багато інших змін, таких як:

  • замінити .dataна.data()
  • замінити updateDataнаupdate

Сподіваюся, це може допомогти таким новачкам, як я.


6

Якщо ви слідували за відповіддю Петра і все ще отримуєте ту саму помилку, переконайтеся, що будь-що інше, що є у вашій mainфункції, надходить після await Firebase.initializeApp()дзвінка, наприклад:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  runApp(MyApp());
}

Дякую. Відповідь @ Петра все-таки допомогла
Kobby Discount

4

Якщо проблема залишається, коли ви залишаєте програму на головному екрані, ви можете додати це до будь-якого .dartфайлу за допомогою firebase:

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

  @override
  Widget build(BuildContext context) {

Або у випадку 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();
  }
}

Для отримання додаткової інформації перевірте це посилання .


1
Я отримую помилку, навіть якщо я виконую ту ж процедуру, що і документація. ось помилка No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() . Я вже ініціалізував Firebase у віджеті, що містить статус.
Vikrant Agrahari

3

По-перше, додайте цю залежність:

firebase_core :

2-е: у головній функції проекту додайте ці 2 рядки і зробіть функцію асинхронною

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

тепер ви можете нормально використовувати firebase у будь-якому файлі чи віджеті проекту.

Віджет FutureBuilder також буде працювати, але ви повинні додавати його щоразу, коли хочете отримати доступ до Firebase.


2

Вам потрібно додати, await Firebase.initializeApp();що таке Future. Зробіть це всередині файлу дротиків, на якому запущена ваша функція Firebase, як показано нижче:

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

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.