Firebaseアプリ '[DEFAULT]'が作成されていません-FlutterとFirebaseでFirebase.initializeApp()を呼び出します


179

Flutterアプリを作成していて、Firebaseを統合しましたが、登録、ログイン、またはログアウトのいずれかのボタンをクリックすると、このエラーが発生し続けます。他の人が同じ質問をしているのを見たことがありますが、どれも私にはうまくいかないようです。私はフラッターとアンドロイドスタジオを使用しています。何か助けがありますか?

これは私のコードの抜粋です

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

回答:


406

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

次に、電話する必要があります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の2番目の例:

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

3番目の例:

それを初期化してinitState()からsetState()build()メソッドを呼び出すcallを呼び出します。

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

4番目の例:

main()呼び出した後、メソッドで初期化しますWidgetsFlutterBinding.ensureInitialized();

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

:電話をかける必要があるのはinitializeApp()1回だけです


47
4番目の例はそれであるはずです。非同期を追加することを忘れないでください。遅れが目立つのかな。
ライド

15
うん、4番目の例は最高の例であり、すべての方法を示すと考えられています。同じFutureBuilderのfirestoreまたはリアルタイムデータベースから最初のデータを取得する前に初期化できるため、2番目の例も優れています
PeterHaddad20年

5
おかげで、それは#4を使用して動作します。)それは(メインにいても、 -あなたは、「戻る」ボタンを押した場合、あなたが戻ってアプリに行くときしかし、それは同じこと「コールFirebase.initializeApp()いいえFirebaseのApp 『[DEFAULT]』を作成しました」と言います
オクテット

4
@MichaelDiCioccioフラッターフレームワークは、ウィジェットバインディングを使用してフラッターエンジンと対話できるようにしました。お問い合わせの際ensureInitislizedには、のインスタンスを作成Widgetbindingして以来、Firebase.initializeApp()ニーズがネイティブ呼び出すためにプラットフォーム・チャネルを使用するために、次にuが結合するのをinializeする必要があります。api.flutter.dev/flutter/widgets/WidgetsFlutterBinding/...(プラットフォーム・チャネルは、フラッターエンジンである)
ピーター・ハダッド

2
#4プロバイダーと連携していないようです(最初と同じエラーメッセージ)
キャスタウェイ

72
  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:エラー:ゲッターが見つかりません: 'Firebase'。Firebase.initializeApp();を待ちます ^^^^^^^^
Kaspar L.Palgi20年

firebase_coreを実装するのを忘れました。しました。現在:これらの行は次のようになります:E / flutter(24294):[ERROR:flutter / lib / ui / ui_dart_state.cc(166)]未処理の例外:[core / no-app] Firebaseアプリがありません '[DEFAULT]'作成
済み-Firebase.initializeApp

ここでは、firebase.google.com / support / release-notes / androidに次のように記載されています。FirebaseAndroidライブラリのfirebase-coreは不要になりました。このSDKには、GoogleAnalytics用のFirebaseSDKが含まれていました。ここで、AnalyticsまたはAnalyticsの使用を推奨する製品(以下の表を参照)を使用するには、Analyticsの依存関係を明示的に追加する必要があります:com.google.firebase:firebase-analytics:17.5.0またはcom.google.firebase:firebase -analytics-ktx:17.5.0。
Kaspar L.Palgi20年

initializeAppがクラッシュした場合はどうなりますか?アプリケーションは開始されません。私はこのおそらく問題について何も見つけませんでした。
BorisSalimov20年

@BorisSalimovのでinitializeApp()非同期呼び出しで、アプリケーションはまだそれが失敗しても起動します
21RW

12

Firebaseをフラッターアプリに接続する場合は、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)
AbirAhsan20年

リンクされているビデオに従ってください、あなたの問題は解決されます。それでもエラーが発生する場合は、plsからお知らせください。
RajuGupta20年

10

これに対する簡単な解決策は次のとおりです。

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

6

@peterの答えは完璧です!! ただし、それでもコードでエラーが発生し、フラッターFirebaseコードラボをフォローしている場合は、これらのチュートリアルが2020年8月の時点で古く、まだ更新されていないことに注意してください。 次のような他の多くの変更を行う必要があります。

  • 置き換える.data.data()
  • 置き換えるupdateDataupdate

これが私のような初心者に役立つことを願っています。


6

Peterの答えに従ったのに同じエラーが発生する場合は、次のように、main関数にある他の何かがawait Firebase.initializeApp()呼び出しの後に来ることを確認してください。

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

ありがとう。
@Peter

4

アプリをメイン画面に置いたままでも問題が解決しない場合は、.dartfirebaseを使用してこれを任意のファイルに追加できます。

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をすでに初期化しました。
VikrantAgrahari20年

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関数を実行しているdartファイル内で実行します。

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

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

-1

あなたが作業している場合は、ネイティブリアクトiOS版Androidのは、あなたがFirebase参照を含める必要があります。iOSの場合、/ios/yourProject/AppDelegate.mファイルに次の行を含める必要があります。

  #import "AppDelegate.h"

  #import <React/RCTBridge.h>
  #import <React/RCTBundleURLProvider.h>
  #import <React/RCTRootView.h>
+ #import <Firebase.h>

  ..............

  @implementation AppDelegate

  - (BOOL)application:(UIApplication *)application 
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
+  [FIRApp configure];
  #ifdef FB_SONARKIT_ENABLED
    InitializeFlipper(application);
  #endif

Androidの場合、次の行もandroid /build.gradleファイルに含める必要があります。

dependencies {
        classpath('com.android.tools.build:gradle:4.1.1')
+       classpath('com.google.gms:google-services:4.3.4')
        ...
    }

そしてこれをandroid / app / build.gradleに

  apply plugin: "com.android.application"
+ apply plugin: "com.google.gms.google-services"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.