Я создаю приложение Flutter и интегрировал Firebase, но я продолжаю получать эту ошибку, когда нажимаю кнопку для регистрации, входа в систему или выхода из системы. Я видел, как другие люди задавали тот же вопрос, но мне кажется, что ни один из них не работает. Я использую Flutter и Android Studio. Как исправить эту проблему?

Это отрывок из моего кода

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

class _HomeScreenState extends State {
  @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"),
          )
        )
      )
    );
  }
}

Ниже выброшенное исключение

══╡ ИСКЛЮЧЕНИЕ, ЗАХВАТЫВАЕМО ЖЕСТОМ ╞═════════════════════════════════════════════ ══════════════════════════════
При обработке жеста возникло следующее исключение FirebaseException:
[core / no-app] Приложение Firebase "[DEFAULT]" не создано - вызовите Firebase.initializeApp ()

Когда было сгенерировано исключение, это был стек:

# 0 MethodChannelFirebase.app (пакет: firebase_core_platform_interface / src / method_channel / method_channel_firebase.dart: 118: 5)
# 1 Firebase.app (пакет: firebase_core / src / firebase.dart: 52: 41)
# 2 FirebaseAuth.instance (пакет: firebase_auth / src / firebase_auth.dart: 37: 47)
# 3 _HomeScreenState.build. <Анонимное закрытие> (пакет: cosytok / screen / home.dart: 20:28)
# 4 _InkResponseState._handleTap (пакет: flutter / src / material / ink_well.dart: 992: 19)
# 5 _InkResponseState.build. <Анонимное закрытие> (пакет: flutter / src / material / ink_well.dart: 1098: 38)
# 6 GestureRecognizer.invokeCallback (пакет: flutter / src / gestures / распознаватель.dart: 184: 24)
# 7 TapGestureRecognizer.handleTapUp (пакет: flutter / src / gestures / tap.dart: 524: 11)
# 8 BaseTapGestureRecognizer._checkUp (пакет: flutter / src / gestures / tap.dart: 284: 5)
# 9 BaseTapGestureRecognizer.handlePrimaryPointer (пакет: flutter / src / gestures / tap.dart: 219: 7)
# 10 PrimaryPointerGestureRecognizer.handleEvent (пакет: flutter / src / gestures / распознаватель.dart: 477: 9)
# 11 PointerRouter._dispatch (пакет: flutter / src / gestures / pointer_router.dart: 78: 12)
# 12 PointerRouter._dispatchEventToRoutes. <Анонимное закрытие> (пакет: flutter / src / gestures / pointer_router.dart: 124: 9)
# 13 _LinkedHashMapMixin.forEach (dart: collection-patch / compact_hash.dart: 377: 8)
# 14 PointerRouter._dispatchEventToRoutes (пакет: flutter / src / gestures / pointer_router.dart: 122: 18)
# 15 PointerRouter.route (пакет: flutter / src / gestures / pointer_router.dart: 108: 7)
# 16 GestureBinding.handleEvent (пакет: flutter / src / gestures / binding.dart: 220: 19)
# 17 GestureBinding.dispatchEvent (пакет: flutter / src / gestures / binding.dart: 200: 22)
# 18 GestureBinding._handlePointerEvent (пакет: flutter / src / gestures / binding.dart: 158: 7)
# 19 GestureBinding._flushPointerEventQueue (пакет: flutter / src / gestures / binding.dart: 104: 7)
# 20 GestureBinding._handlePointerDataPacket (пакет: flutter / src / gestures / binding.dart: 88: 7)
# 24 _invoke1 (dart: ui / hooks.dart: 267: 10)
# 25 _dispatchPointerDataPacket (dart: ui / hooks.dart: 176: 5)
(исключено 3 кадра из dart: async)

Обработчик: "onTap"
Распознаватель:
  TapGestureRecognizer # f0104
═════════════════════════════════════════════════ ═════════════════════════════════════════════════

════════ Исключение, обнаруженное жестом ═════════════════════════════════════ ═════════════════════════
При обработке жеста возникло следующее исключение FirebaseException:
[core / no-app] Приложение Firebase "[DEFAULT]" не создано - вызовите Firebase.initializeApp ()

Ответы (15)

Начиная с 17 августа 2020 года

Все версии Firebase были обновлены, и теперь вам нужно вызвать Firebase.initializeApp () перед использованием любого продукта Firebase, например:

Во-первых, все продукты Firebase теперь зависят от версии firebase_core (0.5.0+), поэтому вам нужно добавить ее в файл pubspec.yaml:

зависимости:
  трепетать:
    sdk: flutter
  firebase_core: ^ 0.5.0
  # cloud_firestore: ^ 0.14.0 другие зависимости firebase

Затем вам нужно вызвать 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 {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("test"),
        ),
        body: FutureBuilder(
          future: getData(),
          builder: (context, AsyncSnapshot 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 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 () один раз

Сначала добавьте эту зависимость:

firebase_core :

Второе: в основной функции проекта добавьте эти две строки и сделайте функцию асинхронной:

void main() async {
    // These two lines
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();

    //
    runApp(MyApp());
}

Теперь вы можете нормально использовать Firebase в любом файле или виджете в проекте.

Виджет FutureBuilder тоже будет работать, но вы должны добавлять его каждый раз, когда хотите получить доступ к Firebase.

Flutter Web с Firebase

Если вы используете Flutter Web с Firebase, убедитесь, что у вас установлены SDK в теге body вашего . / Web / index.html

  
  

Кроме того, убедитесь, что вы вызываете firebase.initializeApp (...) с параметрами конфигурации в index.html.

  

Наконец, настройте firebase, как описано в Ответ Питера Хаддада:

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

Use This for flutter :

   const firebaseConfig = {

    apiKey: "",
    authDomain: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: "",
    measurementId: ""
    };
   
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.getAnalytics(app);

Instead of this

   const firebaseConfig = {

    apiKey: "",
    authDomain: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: "",
    measurementId: ""
    };

    // Initialize Firebase
    const app = initializeApp(firebaseConfig);
    const analytics = getAnalytics(app);
  1. Добавить в pubspec.yaml

    firebase_core:
    
  2. добавить в main.dart

    import 'package: firebase_core / firebase_core.dart';
    
    void main () async {
       WidgetsFlutterBinding.ensureInitialized ();
       ждать Firebase.initializeApp ();
       запуститьApp (MyApp ());
    }
    

вам нужно добавить await FirebaseApp.initializeApp () в основную функцию, не забудьте добавить await в основную функцию

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

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

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}

Проблема для меня заключалась в том, что я инициализировал его без ожидания:

void main() async {
    WidgetsFlutterBinding.ensureInitialized();
    Firebase.initializeApp();

Правильный способ:

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

В моем случае это произошло из-за того, что для веб-версии вам нужно вручную добавить в файл index.html не только зависимость .js, но и конфигурацию. См. Веб-установка.

Мы склонны забывать, что для большинства вещей Flutter компилируется в цель без необходимости изменять что-либо, зависящее от цели, но в этом случае нужно добавить конфигурацию для каждой цели.

В файле main.dart необходимо добавить dependencie import 'package: firebase_core / firebase_core.dart'; и вызвать Firebase.initializeApp ()метод следующим образом:

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

//modify the main method
void main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    runApp(const MyApp());
}

Вы можете инициализировать в файле main.dart, а также используя FutureBuilder.

 future: Firebase.initializeApp(),

Посмотрите на этот пример.

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

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      // Initialize FlutterFire
      future: Firebase.initializeApp(),
      builder: (context, snapshot) {
       return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'NEWSAPI.org',
          home: SplashScreen(),
       
          routes: {
            SPLASH_SCREEN: (BuildContext context) => SplashScreen(),
          },);
      },
    );
  }
}

Ответ Питера: идеально!! Но , если вы по-прежнему получаете ошибку в своем коде, и следуя кодовой метке Flutter Firebase, обратите внимание, что эти руководства устарели по состоянию на август 2020 года и еще не обновлены.

Вам нужно сделать много других изменений, например:

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

Если у вас все еще есть проблема, когда вы выходите из приложения на главный экран, вы можете добавить это в любой .dart файл, используя Firebase:

class App extends StatelessWidget {

  final Future _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 {
  // 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();
  }
}

Для получения дополнительной информации проверьте по этой ссылке.

Если вы следовали ответу Питера и по-прежнему получаете ту же ошибку, убедитесь, что что-то еще, что у вас есть в вашей функции main, появляется после await Firebase.initializeApp () вызов, вот так:

void main () async {
  WidgetsFlutterBinding.ensureInitialized ();
  ждать Firebase.initializeApp ();
  FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled (true);
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  запуститьApp (MyApp ());
}

С августа 2017 года все службы Firebase были обновлены, так что вам нужно вызвать Firebase.initializeApp () в своем основном, прежде чем вы сможете использовать какой-либо из продуктов Firebase, например:

Если вы хотите использовать плагин firebase_core в приложении flutter, добавьте в свой файл pubspec.yaml firebase_core, как показано ниже

dependencies:
  flutter:
    sdk: flutter
  firebase_core : ^1.2.0

Затем вызовите Firebase.initializeApp (): в своем приложении. то же, что и ниже:

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

2022 WebDevInsider