Flutterアプリケーション開発概論

【main.dart準備】Firebase.initializeAppでアプリ起動前にFirebaseを初期化する

8LINE風チームタスク管理アプリを作りながら、ログイン・データベース・権限管理を学ぶ
FlutteriOSAndroidMacOSWindows基礎から学ぶ開発アプリ開発

このページでやること

このページでは、main.dart にFirebaseの初期化処理を書きます。

初期化とは、アプリがFirebaseを使える状態にする準備のことです。

今回のゴールは、main.dart の最初を次の形にすることです。

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

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

  runApp(const WorkBoardApp());
}

Firebase公式のFlutterセットアップ手順でも、main.dartfirebase_corefirebase_options.dart を読み込み、Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform) を実行してから runApp() する流れが案内されています。

https://firebase.google.com/docs/flutter/setup


まず出てくる単語

単語一言説明
main.dartFlutterアプリの入り口になるファイル
main()アプリが最初に実行する関数
async時間がかかる処理を待てるようにする書き方
await処理が終わるまで待つ命令
Firebase.initializeApp()Firebaseを使える状態にする処理
firebase_options.dartFirebase接続用の設定ファイル
runApp()Flutterアプリの画面を起動する処理

関数とは、まとまった処理に名前をつけたものです。


作業の流れ

1. lib/main.dart を開く
↓
2. 必要なimportを確認する
↓
3. main() を async にする
↓
4. WidgetsFlutterBinding.ensureInitialized() を書く
↓
5. Firebase.initializeApp() を書く
↓
6. runApp() を最後に書く
↓
7. 保存する
↓
8. flutter run で起動する

難しいことはしません。

main.dart の上の部分だけ確認します。


Step 1:main.dartを開く

Flutterプロジェクトの中で、次のファイルを開きます。

lib/main.dart

VS Codeを使っている場合は、左のファイル一覧から開いてください。

ターミナルから開く場合は、プロジェクトのフォルダで次を実行します。

code lib/main.dart

code コマンドが使えない場合は、普通にVS Codeから開けばOKです。


Step 2:必要なimportを確認する

main.dart の一番上に、次の2つがあるか確認します。

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

今回の完成コードでは、FirestoreとAuthも使うので、最終的には次のようになります。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart';

それぞれの意味は次の通りです。

import一言説明
firebase_core.dartFirebase初期化に必要
firebase_options.dartFirebase接続設定を読み込む
flutter/material.dartFlutterの画面部品を使う
firebase_auth.dartログイン機能を使う
cloud_firestore.dartFirestoreを使う

import とは、別のファイルやパッケージの機能を読み込むことです。


Step 3:main()をasyncにする

普通のFlutterアプリでは、最初はこのようになっていることがあります。

void main() {
  runApp(const MyApp());
}

Firebaseを使う場合は、Firebaseの初期化が終わるまで待つ必要があります。

そのため、main()async をつけます。

void main() async {
  runApp(const MyApp());
}

async は、時間がかかる処理を待てるようにするための書き方です。


Step 4:WidgetsFlutterBinding.ensureInitialized()を書く

main() の中で、最初にこれを書きます。

WidgetsFlutterBinding.ensureInitialized();

これは、Firebaseを初期化する前に、Flutter側の準備を完了させるための処理です。

難しく考えなくて大丈夫です。

Firebaseを main() の中で使うときは、ほぼセットで書くものだと覚えてください。


Step 5:Firebase.initializeApp()を書く

次に、Firebase初期化を書きます。

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

Firebase.initializeApp() は、FlutterアプリでFirebaseを使えるようにする処理です。

DefaultFirebaseOptions.currentPlatform は、今動かしている環境に合ったFirebase設定を選ぶものです。

たとえば、

iPhoneで動かす
↓
iOS用のFirebase設定を使う

Androidで動かす
↓
Android用のFirebase設定を使う

Webで動かす
↓
Web用のFirebase設定を使う

というイメージです。

この DefaultFirebaseOptions は、前のページで作った firebase_options.dart の中に入っています。


Step 6:runApp()を最後に書く

Firebaseの初期化が終わったら、最後にアプリを起動します。

runApp(const WorkBoardApp());

runApp() は、Flutterの画面を表示し始める処理です。

大切なのは、順番です。

Firebaseを準備する
↓
アプリ画面を起動する

なので、runApp()Firebase.initializeApp() のあとに書きます。


完成形

main.dart の最初は、この形にしてください。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart';

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

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

  runApp(const WorkBoardApp());
}

WorkBoardApp は、この教材で作るアプリ本体のクラス名です。

クラスとは、画面や部品の設計図のようなものです。


よくある間違い

間違い1:asyncを忘れる

これはNGです。

void main() {
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  runApp(const WorkBoardApp());
}

await を使うなら、main()async が必要です。

正しくはこれです。

void main() async {
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  runApp(const WorkBoardApp());
}

間違い2:firebase_options.dartを読み込んでいない

これはNGです。

import 'package:firebase_core/firebase_core.dart';

DefaultFirebaseOptions を使うには、これも必要です。

import 'firebase_options.dart';

間違い3:runAppを先に書いている

これはおすすめしません。

void main() async {
  runApp(const WorkBoardApp());

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

Firebaseを使う画面が先に動いてしまう可能性があります。

正しくは、Firebaseを初期化してから runApp() です。

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

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

  runApp(const WorkBoardApp());
}

Step 7:保存する

main.dart を保存します。

VS Codeなら、次で保存できます。

command + S

Windowsなら、

Ctrl + S

保存しないと、変更が反映されません。


Step 8:実行する

ターミナルで、Flutterプロジェクトのフォルダにいることを確認します。

pwd

次に実行します。

flutter run

ログイン画面が表示されればOKです。


うまくいった状態

成功すると、次の状態になります。

main.dartにFirebase初期化が書いてある
↓
アプリ起動前にFirebaseが準備される
↓
ログイン画面が表示される

このページでは、まだログインできなくても大丈夫です。

まずは、アプリが起動すればOKです。


よくあるエラーと直し方

エラー原因直し方
FirebaseOptions cannot be nullFirebase設定が読み込めていないfirebase_options.dart を確認する
DefaultFirebaseOptions が見つからないimport漏れimport 'firebase_options.dart'; を追加する
Firebase.initializeApp が見つからないfirebase_core が入っていないflutter pub add firebase_core
await でエラーmain()async がないvoid main() async にする
firebase_options.dart がないflutterfire configure 未実行flutterfire configure を実行する

DefaultFirebaseOptions** が見つからないとき**

次のようなエラーが出た場合です。

Undefined name 'DefaultFirebaseOptions'

確認することは2つです。

1. lib/firebase_options.dart があるか
2. main.dart に import 'firebase_options.dart'; があるか

確認コマンドです。

ls lib

firebase_options.dart がなければ、次を実行します。

flutterfire configure

Firebase.initializeApp** が見つからないとき**

次のようなエラーが出た場合です。

Undefined name 'Firebase'

この場合は、firebase_core のimportがない可能性があります。

main.dart の上にこれを追加します。

import 'package:firebase_core/firebase_core.dart';

それでも直らない場合は、パッケージを追加します。

flutter pub add firebase_core
flutter pub get

npmや環境変数はこのページで必要?

このページでは、基本的にnpmは使いません。

npmとは、Node.jsのパッケージを管理する道具です。

Firebase CLIを入れるときには使いましたが、main.dart の初期化を書く作業では使いません。

環境変数も基本的に新しく設定しません。

環境変数とは、パソコン全体で使う設定値のことです。

このページで必要なのは、次の3つだけです。

main.dartを開く
↓
Firebase.initializeAppを書く
↓
flutter runで確認する

最短作業まとめ

読むのが大変な人は、ここだけ見て進めてください。

1. lib/main.dart を開く

code lib/main.dart

2. 上の部分をこの形にする

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart';

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

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

  runApp(const WorkBoardApp());
}

3. 保存する

command + S

4. 実行する

flutter run

チェックリスト

□ main.dartを開いた
□ firebase_coreをimportした
□ firebase_options.dartをimportした
□ main()にasyncをつけた
□ WidgetsFlutterBinding.ensureInitialized()を書いた
□ Firebase.initializeAppを書いた
□ runAppをFirebase初期化のあとに書いた
□ 保存した
□ flutter runで起動した

ミニ確認問題

Q1. Firebase.initializeApp() は何をする処理ですか?

回答

FlutterアプリでFirebaseを使える状態にする処理です。


Q2. DefaultFirebaseOptions.currentPlatform は何をしていますか?

回答

iOS、Android、Webなど、今動かしている環境に合ったFirebase設定を選んでいます。


Q3. なぜ runApp() より前にFirebaseを初期化しますか?

回答

Firebaseを使う画面や処理が動く前に、Firebaseの準備を終わらせるためです。


このページのまとめ

  • main.dart はFlutterアプリの入り口。
  • Firebaseを使う前に Firebase.initializeApp() が必要。
  • await を使うため、main() には async をつける。
  • WidgetsFlutterBinding.ensureInitialized() はFirebase初期化前の準備。
  • firebase_options.dart をimportしないと DefaultFirebaseOptions が使えない。
  • runApp() はFirebase初期化のあとに書く。
  • このページでは、npmや環境変数の追加設定は基本的に不要。

次のページでやること

次のページでは、LINE風の見た目を作っていきます。

AppColors を使って、アプリ全体の色を管理し、ログイン画面やトーク一覧の雰囲気を整えていきます。

教材トップへ戻る