簡體   English   中英

沒有創建 Firebase App '[DEFAULT]' - 在 Flutter 和 Firebase 調用 Firebase.initializeApp()

[英]No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp() in Flutter and Firebase

我正在構建一個 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()

自 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()一次

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

如果您按照Peter 的回答進行操作,但仍然遇到相同的錯誤,請檢查以確保您的main function 中的任何其他內容都出現在await Firebase.initializeApp()調用之后,如下所示:

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

自2017年8月起,Firebase服務全部更新,必須在main中調用Firebase.initializeApp()才能使用Firebase產品,例如:

如果你想在 flutter 應用程序中使用 firebase_core 插件,那么在你的 pubspec.yaml 文件中添加 firebase_core 如下

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

我正在構建一個 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()

我正在構建一個 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()

首先,添加這個依賴:

firebase_core :

第二:在項目主 function 中,添加這兩行並使 function 異步:

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

    //
    runApp(MyApp());
}

現在你可以在項目中的任意文件或widget中正常使用Firebase了。

FutureBuilder小部件也可以工作,但您必須在每次要訪問 Firebase 時添加它。

僅 Dart 初始化(推薦)

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

  • 無需添加任何本機代碼。

  • 無需下載任何 Google 服務文件。

  1. 安裝 FlutterFire CLI

     dart pub global activate flutterfire_cli
  2. (可選)將以下行添加到您的~/.zshrc文件並保存

    export PATH="$PATH":"$HOME/.pub-cache/bin"
  3. 運行configure

     flutterfire configure
  4. enter鍵配置所有平台

    在此處輸入圖像描述

  5. 您現在應該有一個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-only 初始化:

如果您已有現有應用程序,則可以通過以下方式遷移它。

  • Android:

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

      在此處輸入圖像描述

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

      在此處輸入圖像描述

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

      在此處輸入圖像描述

  • iOS

    打開Xcode中<flutter-project>/ios/Runner.xcworkspace文件,刪除Runner中的GoogleService-Info.plist文件。

    在此處輸入圖像描述

  • 蘋果系統

    打開Xcode中<flutter-project>/macos/Runner.xcworkspace文件,刪除Runner中的GoogleService-Info.plist文件。

    在此處輸入圖像描述

更多信息可以在這里找到

彼得的回答完美的! 但是,如果您在遵循Flutter Firebase codelab后仍然在代碼中遇到錯誤,請注意這些教程截至 2020 年 8 月已過時且尚未更新。

您需要進行許多其他更改,例如:

  • .data()替換.data
  • 用更新updateData update數據

Flutter Web 與 Firebase

如果您將 Flutter Web 與 Firebase 一起使用,請確保將 SDK 安裝在./web/index.htmlbody標簽中

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

您需要添加await Firebase.initializeApp(); 這是一個Future 在運行 Firebase function 的 dart 文件中執行此操作,如下所示:

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

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

Since Flutter versions 2.8 , FlutterFire can now be initialized from Dart on all platforms using the Firebase.initializeApp function. There's a more simple and quicker way to initialize a firebase project, instead of downloading the.json and.plist file from the firebase console and將它們放入您的 Flutter 項目文件夾中,這可能會導致出現多個警告。 這是我遇到過好幾次的問題,下面是我如何解決它的。

在此處的 firebase 控制台步驟中創建項目並在此處安裝Firebase CLI 后,請繼續執行以下步驟:

如果您已經使用 flutterfire configure 配置了 firebase 項目,則可以跳過第 1 步並跳到第 4 步。

  1. 從您的項目根終端,命令:

     $ flutterfire configure // This requires the Firebase CLI to work.
  2. Select firebase 項目按返回或輸入。

  3. 插入包 ID。 您可以通過右鍵單擊 ios 文件夾 > 然后單擊“在 xcode 中打開”來獲取它。 Bundle Identifier 將出現在右側的白色面板中,您必須在出現提示時在終端中手動輸入它。

** 如果您已經安裝了 firebase_core 插件,請繼續執行第 5 步。 **

  1. 通過從項目根目錄運行此命令來安裝最新版本的 firebase_core 插件:

     $ flutter pub add firebase_core // Adds to pubspec.yaml
  2. 將導入添加到主文件:

     import 'package:firebase_core/firebase_core.dart'; // import 'firebase_options.dart'; // Generated file
  3. 更新您的主 function 以使用此異步 function 初始化 firebase:

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

有關詳細信息,請參閱 FlutterFire 文檔。

如果當您將應用程序留在主屏幕時仍然遇到問題,您可以使用 Firebase 將其添加到任何.dart文件中:

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

有關更多信息,請查看此鏈接

這是2022年初始化firebase的方法

首先,使用此鏈接安裝 FlutterFire ==> Flutter Fire 安裝鏈接

安裝 FlutterFire 后,您需要在 lib/main.dart 文件中添加這些代碼行

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

然后編輯您的 Main Function,如下所示

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

這在未來可能會發生變化,因此請參閱此鏈接以獲取下面的最新實施參考

初始化 FlutterFire#

在大多數情況下,將項目從較舊的 Flutter 版本升級到 null 安全版本后會出現此問題。 這些東西應該檢查:

確保你在 pubscpec.yaml 中有 firebase-core

導入firebase核心:

import 'package:firebase_core/firebase_core.dart';

在任何調用之前初始化 Firebase - 最好在 main.dart 內部,以便它在任何其他實現之前執行:

WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform,
);

來自官方文檔

將 firebase_core 依賴添加到您的 pubspec.yaml

然后在應用啟動時初始化應用

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

我需要使用 FlutterFire cli 重新配置 Firebase 應用程序。

https://firebase.flutter.dev/docs/cli

  1. 通過 NPM 安裝 firebase-tool: npm install -g firebase-tools
  2. 安裝flutterfire cli: dart pub global activate flutterfire_cli
  3. 運行此命令以在您的項目中配置 firebase: flutterfire configure

按照上面的鏈接並初始化如下:

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

在等待調用時,該應用程序將顯示啟動畫面,並且 Firebase 可能不會初始化,因此我接下來使用home屏幕的另一個 FutureBuilder 來確保在我使用 FirebaseAuth 之前初始化 Firebase 應用程序。

home: FutureBuilder(
          future: Firebase.initializeApp(),
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return Text(snapshot.error.toString(),
                  style: TextStyle(fontSize: 10));
            }

            if (snapshot.connectionState == ConnectionState.done) {
              return StreamBuilder(
                stream: FirebaseAuth.instance.authStateChanges(),
                builder: (context, snapshot) {
                  return snapshot.hasData ? Home() : AuthPage();
                },
              );
            } else {
              return Text('');
            }
          })

您也可以使用FutureBuildermain.dart文件中進行初始化。

 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: <String, WidgetBuilder>{
            SPLASH_SCREEN: (BuildContext context) => SplashScreen(),
          },);
      },
    );
  }
}

你需要在 main function 中添加await FirebaseApp.initializeApp()記得在 main function 中添加 await

如果您正確設置了 Firebase,請不要忘記添加

await

Firebase.initializeApp();

這主要是該異常的問題。

等待 Firebase.initializeApp();

就我而言,我為現有項目添加了 web 支持。 解決問題的一件事是,

web/index.html文件中

所有 firebase sdk 導入verison9.6.6更改為8.10.0

片段

<script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app-check.js"></script>  
  <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-storage.js"></script>
  <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js"></script>
 <script>
  var firebaseConfig = {
   ....
   }

如果您正在處理一個預先配置了 firebase_core 的項目,然后您嘗試添加新包,則會出現該錯誤。

您必須先從 pubsec.yaml 中刪除 firebase_core firebase_core: ,然后保存文件並通過flutter pub add firebase_coreflutterfire configure

然后您可以添加任何新包。

永遠記住,firebase 在您的項目中僅初始化一次,因此您在主 class 中使用,因為如果應用程序打開,主 class 僅調用一次

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

使用 firebase 選項初始化

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
  options: DefaultFirebaseOptions.currentPlatform).catchError((e){
    print(" Error : ${e.toString()}");
  });
}

試試下面的代碼。 它將解決 IOS 和 Android 的問題。

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

    void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (Platform.isIOS) {
    await Firebase.initializeApp(
      options: const FirebaseOptions(
          apiKey: "found in your google service-info.plist",
          appId: "found in your google service-info.plist",
          messagingSenderId: "found in firebase",
          projectId: "found in firebase"),
    );
  } else {
    await Firebase.initializeApp();
  }
  runApp(const MyApp());
}

就我而言,這是因為對於 Web 版本,您必須在index.html文件中手動添加內容,不僅是 .js 依賴項,還有配置。 請參閱Web 安裝

我們往往會忘記,對於大多數內容,Flutter 已編譯到目標,無需更改任何特定於目標的內容,但在這種情況下,必須為每個目標添加配置。

將此用於 flutter:

   const firebaseConfig = {

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

而不是這個

   const firebaseConfig = {

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

    // Initialize Firebase
    const app = initializeApp(firebaseConfig);
    const analytics = getAnalytics(app);

在文件main.dart 中,您必須添加依賴項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());
}

我想發表評論。 但是這個問題有很多線索。 對於我的情況。

我在 Firebase 之前初始化注入容器。需要檢查層次結構。

Hive.init(directory.path);
  await Firebase.initializeApp();// before
  await di.init();

首先導入firebase_core插件,生成firebase_options.dart文件:

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

接下來,在main function 中,確保WidgetsFlutterBinding已初始化,然后初始化 Firebase:

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

DefaultFirebaseOptions.currentPlatform是從我們生成的firebase_options.dart文件中導入的。

這是完整的例子

// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';
import 'package:firebase_core_example/firebase_config.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  String get name => 'foo';

  FirebaseOptions get firebaseOptions => const FirebaseOptions(
        appId: '1:448618578101:ios:0b650370bb29e29cac3efc',
        apiKey: 'AIzaSyAgUhHU8wSJgO5MVNy95tMT07NEjzMOfz0',
        projectId: 'react-native-firebase-testing',
        messagingSenderId: '448618578101',
      );

  Future<void> initializeDefault() async {
    FirebaseApp app = await Firebase.initializeApp(
      options: DefaultFirebaseConfig.platformOptions,
    );
    print('Initialized default app $app');
  }

  Future<void> initializeSecondary() async {
    FirebaseApp app =
        await Firebase.initializeApp(name: name, options: firebaseOptions);

    print('Initialized $app');
  }

  void apps() {
    final List<FirebaseApp> apps = Firebase.apps;
    print('Currently initialized apps: $apps');
  }

  void options() {
    final FirebaseApp app = Firebase.app(name);
    final options = app.options;
    print('Current options for app $name: $options');
  }

  Future<void> delete() async {
    final FirebaseApp app = Firebase.app(name);
    await app.delete();
    print('App $name deleted');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Firebase Core example app'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(20),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              ElevatedButton(
                onPressed: initializeDefault,
                child: const Text('Initialize default app'),
              ),
              ElevatedButton(
                onPressed: initializeSecondary,
                child: const Text('Initialize secondary app'),
              ),
              ElevatedButton(
                onPressed: apps,
                child: const Text('Get apps'),
              ),
              ElevatedButton(
                onPressed: options,
                child: const Text('List options'),
              ),
              ElevatedButton(
                onPressed: delete,
                child: const Text('Delete app'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

使用 firebase 選項初始化

void main() async{
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform).catchError((e){
  print(" Error : ${e.toString()}");
});
}

像這樣

正確的方法是:為我工作 調試和發布模式都可以正常工作 在您的項目中僅使用 firebase 選項初始化一次

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

確保您使用的是 firebase package 的正確/官方版本。

我正在使用:

firebase_core_dart: <version-number>

在: https://pub.dev/packages/firebase_core_dart

而不是官方

firebase_core: <version-number>

https://pub.dev/packages/firebase_core

使用第一個選項,我在使用時得到了初始化:

await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  ).whenComplete(
      () => print('FIREBASE INITIALIZED================>'));

但身份驗證失敗,並顯示 OP 描述的錯誤消息。

對我來說問題是我在沒有“等待”的情況下初始化了它:

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

正確的做法是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM