Skip to content

Firebaseアプリ初期化エラー 'No Firebase App [DEFAULT]' の解決方法

FlutterアプリでFirebase機能を使用する際に「No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()」というエラーが発生する問題の解決方法を解説します。

問題の概要

このエラーは、Firebaseサービスを使用する前にFirebaseアプリが適切に初期化されていない場合に発生します。以下のような操作を行う際に現れます:

  • Firebase Authenticationを使用したログイン/ログアウト
  • Firestoreデータの読み書き
  • Firebase Storageの利用
  • その他Firebase関連サービスの利用
dart
// エラーが発生するコード例
FirebaseAuth.instance.signOut().then((value) {
  Navigator.pushReplacement(
    context,
    MaterialPageRoute(builder: (context) => LoginScreen())
  );
});

解決方法

1. 基本的な初期化方法

Firebaseを使用する前に、main関数でFirebaseを初期化します:

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

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

重要

Firebase.initializeApp()は非同期処理のため、awaitキーワードを付けて完了を待機する必要があります。

2. FlutterFire CLIを使用した最新の初期化方法(推奨)

Flutter 2.8以降では、FlutterFire CLIを使用してすべてのプラットフォームでDartのみでFirebaseを初期化できます:

bash
# FlutterFire CLIのインストール
dart pub global activate flutterfire_cli

# プロジェクトの設定
flutterfire configure

設定後、生成された設定ファイルをインポートして初期化します:

dart
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart'; // 生成されたファイル

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

メリット

  • ネイティブコードの追加不要
  • Googleサービスファイルのダウンロード不要
  • すべてのプラットフォームで一貫した設定

3. FutureBuilderを使用した初期化

アプリの起動中にFirebaseの初期化を処理する方法:

dart
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: Firebase.initializeApp(),
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return ErrorWidget(); // エラー表示
        }
        
        if (snapshot.connectionState == ConnectionState.done) {
          return MyApp(); // 初期化完了後、メインアプリを表示
        }
        
        return LoadingScreen(); // 初期化中のローディング表示
      },
    );
  }
}

プラットフォーム別の注意点

Androidの設定

android/app/build.gradleに以下を追加:

gradle
apply plugin: 'com.google.gms.google-services'

iOSの設定

ios/Runner/AppDelegate.swift(またはAppDelegate.m)に以下を追加:

objective-c
[FIRApp configure];

Webの設定

web/index.htmlにFirebase SDKと設定を追加:

html
<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-auth.js"></script>
<!-- 必要に応じて他のFirebaseサービスを追加 -->

<script>
  const firebaseConfig = {
    apiKey: "...",
    authDomain: "...",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "...",
    appId: "..."
  };
  firebase.initializeApp(firebaseConfig);
</script>

よくある間違いと解決策

注意すべきポイント

  1. awaitの忘れ: Firebase.initializeApp()はFutureを返すので、awaitが必要です
  2. パッケージの誤り: firebase_core_dartではなく、公式のfirebase_coreを使用してください
  3. 初期化前のFirebase使用: すべてのFirebase処理は初期化後に実行する必要があります
  4. 非同期処理の順序: runApp()の前に初期化が完了していることを確認してください

パッケージの依存関係

pubspec.yamlに正しいバージョンのfirebase_coreを追加:

yaml
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^2.13.0
  # 他のFirebaseパッケージ
  firebase_auth: ^4.6.1
  cloud_firestore: ^4.7.0

まとめ

Firebaseの「No Firebase App '[DEFAULT]' has been created」エラーは、Firebaseサービスを使用する前に適切に初期化を行わない場合に発生します。最新のFlutterFireアプローチを使用し、main関数でFirebase.initializeApp()を呼び出すことでこの問題を解決できます。プラットフォーム別の設定も忘れずに行い、非同期処理の完了を確実に待機するようにしましょう。