尚未创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

Ken*_*usu 297 dart firebase flutter google-cloud-firestore

我正在构建一个 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"),
          )
        )
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是抛出的异常

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"),
          )
        )
      )
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*dad 641

从 2020 年 8 月 17 日开始

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

首先,所有 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
Run Code Online (Sandbox Code Playgroud)

然后你必须打电话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();
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

第三个例子:

initState()then call 中初始化它,setState()这将调用该build()方法。

  @override
  void initState() {
    super.initState();
    Firebase.initializeApp().whenComplete(() { 
      print("completed");
      setState(() {});
    });
  }
Run Code Online (Sandbox Code Playgroud)

第四个例子:

main()调用后在方法中初始化WidgetsFlutterBinding.ensureInitialized();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 第四个例子应该是它。只需记住添加异步即可。我想知道延迟是否明显。 (87认同)
  • 是的,第四个示例是最好的一个,只是想展示所有方法,第二个示例也很好,因为您可以在同一个 FutureBuilder 中从 firestore 或实时数据库获取第一个数据之前进行初始化 (20认同)
  • 谢谢,它可以使用#4。但是,如果您按“后退”按钮,当您返回应用程序时,它会显示相同的内容“没有创建 Firebase 应用程序‘[DEFAULT]’ - 调用 Firebase.initializeApp()”,即使它位于 main() 中 (6认同)
  • #4 似乎不适用于提供者(与最初相同的错误消息) (5认同)
  • @MichaelDiCioccio flutter 框架使用 widgetbinding 能够与 flutter 引擎交互。当您调用“ensureInitislized”时,它会创建“Widgetbinding”的实例,并且由于“Firebase.initializeApp()”需要使用平台通道来调用本机,因此您需要初始化该绑定。https://api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/ensureInitialized.html(平台通道位于flutter引擎中) (4认同)
  • @PeterHaddad 我是 Flutter 开发新手,但这里有点困惑。对于第四个选项有很多支持,但是如果您没有互联网连接并且应用程序在启动时崩溃或滞后,那么该选项不会失败吗?看起来至少使用选项 3,您可以呈现加载屏幕或其他内容,并通知用户您处于离线状态或需要网络连接。如果“Firebase.initializeApp()”实际上是设备上的进程,我可能会弄错。 (4认同)
  • 使用“FutureBuilder”将在每次热重载时完全重建小部件树,因此最后一个是最佳选择 (2认同)
  • 关于#1,Loading() 和 SomethingWentWrong() 可以是什么?如果我只是将 Text() 放在那里,它会抱怨 - “找不到方向性小部件” (2认同)
  • 将出现红屏错误 2 秒,然后正确加载。如何限制红屏? (2认同)

Muh*_*raf 133

  1. 添加到 pubspec.yaml

    firebase_core :
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加到 main.dart

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

  • 这些行将给出:lib/main.dart:6:9: Error: Getter not found: 'Firebase'。等待 Firebase.initializeApp(); ^^^^^^^^ (2认同)
  • 我忘记导入 firebase_core。做过某事。现在:这些行将给出: E/flutter (24294): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has was创建 - 调用 Firebase.initializeApp() (2认同)

Cop*_*oad 34

仅 Dart 初始化(推荐)

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

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

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

  1. 安装 FlutterFire CLI

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

    export PATH="$PATH":"$HOME/.pub-cache/bin"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 跑过configure

    flutterfire configure
    
    Run Code Online (Sandbox Code Playgroud)
  4. 按此键enter配置所有平台

    在此输入图像描述

  5. 您现在应该有一个lib/firebase_options.dart文件。将此文件导入到您的main.dart并使用Firebase.initializeApp.

    dart pub global activate flutterfire_cli
    
    Run Code Online (Sandbox Code Playgroud)

迁移到仅 Dart 初始化:

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

  • 安卓:

    1. 从以下位置删除google-services.json文件<flutter-project>/android/app

      在此输入图像描述

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

      在此输入图像描述

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

      在此输入图像描述

  • iOS系统

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

    在此输入图像描述

  • 苹果系统

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

    在此输入图像描述

更多信息可以在这里找到

  • 这个 firebase cli 解决方案也是我发现的最好的。您可以在这里找到 flutter 文档:https://firebase.google.com/docs/flutter/setup (2认同)

ola*_*mmy 20

自 2017 年 8 月以来,所有 Firebase 服务均已更新,因此您必须在 main 中调用 Firebase.initializeApp() 才能使用任何 Firebase 产品,例如:

如果您想在 flutter 应用程序中使用 firebase_core 插件,请在 pubspec.yaml 文件中添加 firebase_core ,如下所示

dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.19.1
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序中调用 Firebase.initializeApp(): 。与下面的内容相同:

import 'package:firebase_core/firebase_core.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*tim 11

从 Flutter 版本 2.8 开始,现在可以使用 Firebase.initializeApp 函数在所有平台上从 Dart 初始化 FlutterFire。有一种更简单、更快捷的方法来初始化 Firebase 项目,而不是从 Firebase 控制台下载 .json 和 .plist 文件并将它们放入 Flutter 项目文件夹中,这可能会导致多个警告。这是我多次遇到的问题,以下是我的解决方法。

在此处的 Firebase 控制台步骤中创建项目并在此处安装 Firebase CLI后,请继续执行以下步骤:

如果您已经使用 flutterfire configure 配置了 firebase 项目,则可以跳过步骤 1 并跳转到步骤 4。

  1. 从项目根终端,命令:

      $ flutterfire configure   
        // This requires the Firebase CLI to work.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 按 Return 或 Enter 键选择 Firebase 项目。

  3. 插入捆绑包 ID。您可以通过右键单击 ios 文件夹 > 然后单击“在 xcode 中打开”来获取此信息。捆绑包标识符将出现在右侧白色面板中,您必须在出现提示时在终端中手动输入该标识符。

** 如果您已经安装了 firebase_core 插件,请继续执行步骤 5。**

  1. 从项目根目录运行以下命令来安装最新版本的 firebase_core 插件:

     $ flutter pub add firebase_core  // Adds to pubspec.yaml
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将导入添加到主文件:

     import 'package:firebase_core/firebase_core.dart'; // 
     import 'firebase_options.dart'; // Generated file
    
    Run Code Online (Sandbox Code Playgroud)
  3. 更新您的 main 函数以使用此异步函数初始化 firebase:

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

有关更多信息,请参阅 FlutterFire 文档。


Jen*_*ens 10

使用 Firebase 进行 Flutter Web

如果您将 Flutter Web 与 Firebase 一起使用,请确保您已将 SDK 安装在body您的代码中./web/index.html

  <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>
Run Code Online (Sandbox Code Playgroud)

此外,请确保您firebase.initializeApp(...)还使用配置参数进行调用index.html

  <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>
Run Code Online (Sandbox Code Playgroud)

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)


J. *_*Saw 9

如果您遵循了Peter 的回答并且仍然遇到相同的错误,请检查以确保您的main函数中的其他任何内容都在await Firebase.initializeApp()调用之后出现,如下所示:

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


小智 7

如果当您将应用程序保留到主屏幕时仍然遇到问题,您可以.dart使用 Firebase 将其添加到任何文件中:

class App extends StatelessWidget {

  final Future<FirebaseApp> _initialization = Firebase.initializeApp();

  @override
  Widget build(BuildContext context) {
Run Code Online (Sandbox Code Playgroud)

或者在 a 的情况下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();
  }
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请查看此链接

  • 即使我执行与文档相同的过程,我也会收到错误。这是错误“No Firebase App '[DEFAULT]”已创建 - 调用 Firebase.initializeApp() ”。我已经在有状态小部件中初始化了 Firebase。 (4认同)

小智 7

彼得的回答完美的!!但是,如果您的代码仍然出现错误并遵循Flutter Firebase代码实验室,请注意,这些教程截至 2020 年 8 月已过时且尚未更新。

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

  • 替换.data.data()
  • 替换updateDataupdate


Abd*_*rek 7

首先,添加此依赖项:

firebase_core :
Run Code Online (Sandbox Code Playgroud)

第二:在项目的main函数中,添加这两行,使函数async:

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

    //
    runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

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

FutureBuilder部件将工作,要么,但你必须每次你想添加它来访问火力地堡。


gma*_*imo 5

您需要添加await Firebase.initializeApp();which 是Future. 在运行 Firebase 函数的 dart 文件中执行此操作,如下所示:

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

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MaterialApp());
}
Run Code Online (Sandbox Code Playgroud)


fri*_*ker 5

这是2022年初始化firebase的方式

首先,通过此链接安装 FlutterFire ==> Flutter Fire 安装链接

安装 FlutterFire 后,您需要在 lib/main.dart 文件中添加这些代码行

  import 'package:firebase_core/firebase_core.dart';
  import 'firebase_options.dart';  
Run Code Online (Sandbox Code Playgroud)

然后编辑您的主要功能,如下所示

void main() async {
 WidgetsFlutterBinding.ensureInitialized();
   await Firebase.initializeApp(options:                                  
   DefaultFirebaseOptions.currentPlatform,);
 runApp(MyApp()); 
 }
Run Code Online (Sandbox Code Playgroud)

这将来可能会发生变化,因此请参阅此链接以获取下面的最新实施参考

初始化 FlutterFire#