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関連サービスの利用
// エラーが発生するコード例
FirebaseAuth.instance.signOut().then((value) {
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => LoginScreen())
);
});
解決方法
1. 基本的な初期化方法
Firebaseを使用する前に、main
関数でFirebaseを初期化します:
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を初期化できます:
# FlutterFire CLIのインストール
dart pub global activate flutterfire_cli
# プロジェクトの設定
flutterfire configure
設定後、生成された設定ファイルをインポートして初期化します:
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の初期化を処理する方法:
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
に以下を追加:
apply plugin: 'com.google.gms.google-services'
iOSの設定
ios/Runner/AppDelegate.swift
(またはAppDelegate.m
)に以下を追加:
[FIRApp configure];
Webの設定
web/index.html
にFirebase SDKと設定を追加:
<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>
よくある間違いと解決策
注意すべきポイント
- awaitの忘れ:
Firebase.initializeApp()
はFutureを返すので、await
が必要です - パッケージの誤り:
firebase_core_dart
ではなく、公式のfirebase_core
を使用してください - 初期化前のFirebase使用: すべてのFirebase処理は初期化後に実行する必要があります
- 非同期処理の順序:
runApp()
の前に初期化が完了していることを確認してください
パッケージの依存関係
pubspec.yaml
に正しいバージョンのfirebase_coreを追加:
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()
を呼び出すことでこの問題を解決できます。プラットフォーム別の設定も忘れずに行い、非同期処理の完了を確実に待機するようにしましょう。