在Flutter和Firebase中,没有创建任何Firebase应用程序“[DEFAULT]” - 请调用Firebase.initializeApp()。

476
我正在构建一个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()

2
你现在应该使用Dart-only的方式来初始化Firebase。 - CopsOnRoad
我通过将pubspec.yaml中的所有软件包更新到最新版本来解决了这个问题。 - zackygaurav
29个回答

836

自2020年8月17日起开始

所有Firebase版本均已更新,现在您必须在使用任何Firebase产品之前调用Firebase.initializeApp(),例如:

首先,所有Firebase产品现在都依赖于firebase_core版本(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(() {});
    });
  }

第四个示例:

在调用WidgetsFlutterBinding.ensureInitialized();之后,在main()方法中对其进行初始化。

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

注意:您只需要调用initializeApp()一次


124
第四个例子应该是这个。只需记得添加异步操作。不知道延迟是否会明显。 - Ryde
27
第四个示例是最好的,只是想展示所有方法,第二个也很不错,因为你可以在同一个FutureBuilder中从Firestore或实时数据库获取第一组数据之前初始化。 - Peter Haddad
8
谢谢,使用#4可以正常运行。但是如果你按“返回”按钮,在回到应用程序时,即使在main()中也会显示同样的信息:“没有创建Firebase App '[DEFAULT]' - 调用Firebase.initializeApp()”。 - Octet
5
Flutter框架使用WidgetBinding与Flutter引擎交互。当您调用ensureInitialized时,它将创建一个WidgetBinding实例,并且由于Firebase.initializeApp()需要使用平台通道调用本地代码,因此需要初始化绑定。https://api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/ensureInitialized.html(平台通道在Flutter引擎中) - Peter Haddad
10
似乎不能与服务提供商一起使用(与最初相同的错误消息)。 - castaway
显示剩余21条评论

191
  1. Add to pubspec.yaml

    firebase_core :
    
  2. add to main.dart

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

3
这几行代码会报错:lib/main.dart:6:9: 错误:找不到Getter方法:'Firebase'。 await Firebase.initializeApp(); ^^^^^^^^ - Kaspar L. Palgi
1
我忘记导入 firebase_core 了。已经导入了。现在这些行会报错:E/flutter (24294):[ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [core/no-app]未创建 Firebase 应用程序“[DEFAULT]”-请调用 Firebase.initializeApp()。 - Kaspar L. Palgi
1
如果initializeApp崩溃了怎么办?应用程序将无法启动。我没有找到任何关于这个可能问题的信息。 - Boris Salimov
1
@BorisSalimov 因为 initializeApp() 是一个异步调用,即使它失败了,应用程序仍然会启动。 - 21rw
@Umuko 是的,如果我们要使用FutureBuilder和异常处理,那么这是正确的,但在runApp()之前使用await可能会导致问题。 - Boris Salimov
显示剩余4条评论

30

仅使用Dart进行初始化(推荐)

  • 使用CLI在所有平台上初始化Firebase。

  • 无需添加任何本地代码。

  • 无需下载任何Google服务文件。

  1. 安装FlutterFire CLI

dart pub global activate flutterfire_cli
  • (可选) 将以下行添加到您的~/.zshrc文件中并保存

  • export PATH="$PATH":"$HOME/.pub-cache/bin"
    
  • 运行configure

    flutterfire configure
    
  • 按下enter键以配置所有平台

    在此输入图像描述

  • 现在你应该有一个lib/firebase_options.dart文件,将其导入到你的main.dart中并使用Firebase.initializeApp

    import 'firebase_options.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      // This is the last thing you need to add. 
      await Firebase.initializeApp(
        options: DefaultFirebaseOptions.currentPlatform,
      );
    
      runApp(...);
    }
    

  • 迁移至仅使用Dart初始化:

    如果您已经有一个现有的应用程序,可以按以下方式进行迁移。

    • Android:

      1. <flutter-project>/android/app中删除google-services.json文件:

        enter image description here

      2. <flutter-project>/android/build.gradle文件中删除以下行:

        enter image description here

      3. <flutter-project>/android/app/build.gradle文件中删除以下行:

        enter image description here

    • iOS

      在Xcode中打开<flutter-project>/ios/Runner.xcworkspace文件并从Runner中删除GoogleService-Info.plist文件。

      enter image description here

    • macOS

      在Xcode中打开<flutter-project>/macos/Runner.xcworkspace文件并从Runner中删除GoogleService-Info.plist文件。

      enter image description here

    更多信息,请查看此处


    1
    这是我找到的唯一有效的解决方案,非常感谢伙计!我一直在使用基于平台的方法,并没有意识到有新的实现方式。当我尝试添加iOS应用程序时,遇到了这个错误,但通过创建一个新项目并按照这个解决方案操作,问题得以解决。 - Rajesh
    我无法导入 'firebase_options.dart',同时也找不到 DefaultFirebaseOptions.currentPlatform。是否有什么需要更新的? - Sweta Jain
    在第四步之后,是否生成了一个名为 firebase_options.dart 的文件,@SwetaJain? - CopsOnRoad
    2
    这个 Firebase CLI 解决方案也是我找到的最好的。您可以在此处找到 Flutter 文档:https://firebase.google.com/docs/flutter/setup - Dorian
    在我的情况下,我还必须安装firebase-tools才能使其工作。无论如何,这是唯一对我有效的方法 :)。(2023年2月27日) - Pixie Dust
    在我的情况下,我必须做一些与CopsOnRoad的答案不同的小事情,但在CopsOnRoad的答案和@Dorian提供的网址(firebase.google.com/docs/flutter/setup)之间,它修复了我的错误。 - undefined

    19
    自2017年8月以来,所有 Firebase 服务都已更新,因此您必须在主函数中调用 Firebase.initializeApp(),然后才能使用 Firebase 产品。例如:

    如果您想在 Flutter 应用程序中使用 firebase_core 插件,则需要在 pubspec.yaml 文件中添加以下内容:

    dependencies:
      flutter:
        sdk: flutter
      firebase_core: ^1.19.1
    
    然后在你的应用程序中调用 Firebase.initializeApp(),就像下面的示例一样:
    import 'package:firebase_core/firebase_core.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      runApp(MyApp());
    }
    

    19
    如果您按照彼得的答案进行操作,但仍然遇到相同的错误,请确保您在main功能中的任何其他内容都在await Firebase.initializeApp()调用之后,就像这样:
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
      FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
      runApp(MyApp());
    }
    

    16

    首先,添加此依赖项:

    firebase_core :
    

    第二步:在项目的主函数中添加以下两行代码,并将函数设置为异步:

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

    现在您可以在项目中的任何文件或小部件中正常使用Firebase。

    FutureBuilder小部件也可以工作,但每次想要访问Firebase时都必须添加它。


    10

    Peter的回答完美的,但如果你的代码仍然出现错误并且遵循Flutter Firebase codelab,请注意这些教程已经过时,截至2020年8月尚未更新。

    您需要进行许多其他更改,例如:

    • .data()替换.data
    • update替换updateData

    9
    自从 Flutter 版本 2.8 起,FlutterFire 可以在所有平台上使用 Firebase.initializeApp 函数从 Dart 初始化。相比于从 Firebase 控制台下载 .json 和 .plist 文件并将它们放到 Flutter 项目文件夹中,这是一种更简单和更快速的初始化 firebase 项目的方法,因为这可能会导致多个警告。我已经遇到过几次这个问题,以下是我解决问题的方法。
    在 Firebase 控制台(按照此处的步骤)创建项目并安装 Firebase CLI (请点击此处)后,请按照以下步骤进行:
    如果您已使用 flutterfire configure 配置了 firebase 项目,则可以跳过第 1 步,直接进行第 4 步。
    1. From your project root terminal, command:

        $ flutterfire configure   
          // This requires the Firebase CLI to work.
      
    2. Select firebase project by hitting return or enter.

    3. insert the bundle ID. You can get this by right clicking the ios folder > then click'Open in xcode'. The Bundle Identifier will appear in the right white panel and you'll have to type this in the terminal manually when prompted.

    如果您已经安装了firebase_core插件,请按照步骤5继续操作。
    1. Install the latest version of the firebase_core plugin by running this command from your project root directory:

       $ flutter pub add firebase_core  // Adds to pubspec.yaml
      
    2. Add imports to the main file:

       import 'package:firebase_core/firebase_core.dart'; // 
       import 'firebase_options.dart'; // Generated file
      
    3. Update your main function to initialize firebase with this async function:

        Future<void> main() async {
         WidgetsFlutterBinding.ensureInitialized();
         await Firebase.initializeApp(options: 
         DefaultFirebaseOptions.currentPlatform);
         runApp(const YourAppName());
        }
      

    请查看FlutterFire文档获取更多信息。


    9

    使用Firebase的Flutter Web

    如果您正在使用Firebase的Flutter Web,请确保已经在./web/index.htmlbody标签中安装了SDK。

      <script src="https://www.gstatic.com/firebasejs/8.2.9/firebase-app.js"></script>
      <script src="https://www.gstatic.com/firebasejs/8.2.9/firebase-analytics.js"></script>
    

    此外,请确保您在 index.html 中使用配置参数调用 firebase.initializeApp(...)
      <script>
        // Your web app's Firebase configuration
        // For Firebase JS SDK v7.20.0 and later, measurementId is optional
        var firebaseConfig = {
          apiKey: "AIz...",
          authDomain: "...",
          databaseURL: "https://<project-name>.firebaseio.com",
          projectId: "...",
          storageBucket: "<project-name>.appspot.com",
          messagingSenderId: "...",
          appId: "...",
          measurementId: "..."
        };
        firebase.initializeApp(firebaseConfig);
        firebase.analytics();
      </script>
    

    最后按照Peter Haddad的回答中所述配置Firebase:

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

    不要将敏感数据放在 .html 文件中,这样不安全。 - Roman Soviak
    @user7856586,你觉得在这种情况下哪些数据是敏感数据? - Jens
    1
    抱歉,我的意思是我们还应该在Gcloud上修复规则,因为将裸数据存储在HTML文件中并不安全。请看这里 - Roman Soviak

    8

    您需要添加await Firebase.initializeApp();,它是一个Future。请将其添加到运行Firebase函数的Dart文件中,如下所示:

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接