[Flutter]NoSQLデータベース Cloud Firestoreの設定

ここでは、FirebaseのNoSQLデータベース(Cloud Firestore)を利用するための初期設定について解説します。

FlutterプロジェクトにCloud Firestoreプラグインをインストールする

FlutterでFirestoreを利用できるようにするため、pub.devからcloud_firestoreプラグインをインストールします。

https://pub.dev/packages/cloud_firestore/

AndroidStudioのターミナルから下記コマンドを実行すると、pubspec.yamlにcloud_firestoreが追加されインストールされます。

flutter pub add cloud_firestore
pubspec.yaml
dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  firebase_core: ^2.15.0
  cloud_firestore: ^4.8.4

コンパイル済みのcloud_firestoreを利用する

iOSのビルドにおいてcloud_firestoreは、ビルド処理に時間が掛かります。そのため予めコンパイル済みのフレームワークを利用するとビルド時間を短縮できます。Apple M2チップで試すと5分30秒から25秒程度まで短縮されました。なおAndroidでは、20秒から4秒程度になりました。

コンパイル済みのcloud_firestoreを利用するには、/ios/Podfileファイルを開きtarget 'Runner' doの部分にコードを追加します。

/ios/Podfile

追加コード
pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '10.12.0'
Podfile
(変更前)
target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  target 'RunnerTests' do
    inherit! :search_paths
  end
end

(変更後)
target 'Runner' do
  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '10.12.0'
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  target 'RunnerTests' do
    inherit! :search_paths
  end
end

また、cocospodのバージョンは、1.9.1以降である必要があります。pod --versionで調べることができます。

pod --version
1.12.1

注意点

公式サイトの解説では、追加コードでのバージョン指定がtag => '8.15.0'となっています。追加コードを記述する前に、どのくらい時間が掛かるか通常のビルドを試すと8.15.0はすでに古いバージョンであるため、より高いバージョンが指定されてビルドされます。

GitHubのfirestore-ios-sdk-frameworksを確認すると、8.15.0より高いバージョンが多くあることが分かります。公式の内容は、記載された当時のバージョンのままアップデートされず残っているものと思われます。

そのため、8.15.0より高いバージョンで(10.12.0)一度ビルドされた後に、追加コードを記述すると、Podfile.lockには10.12.0が存在して、8.15.0を指定すると整合が取れなくなり下記のようなエラーが発生します。8.15.0を使用する場合は、一度Podfile.lockの削除を行います。

ビルドエラー
CocoaPods' output:

      Preparing

    Analyzing dependencies

    Inspecting targets to integrate
      Using `ARCHS` setting to build architectures of target `Pods-Runner`: (``)
      Using `ARCHS` setting to build architectures of target `Pods-RunnerTests`: (``)

    Finding Podfile changes
      A FirebaseFirestore
      - Flutter
      - cloud_firestore
      - firebase_core

    Fetching external sources
    -> Pre-downloading: `FirebaseFirestore` from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `8.15.0`
     > Git download
     > Git download
         $ /usr/bin/git clone https://github.com/invertase/firestore-ios-sdk-frameworks.git /var/folders/cq/1h1lq3hj5dndl330zc9xn80m0000gp/T/d20230814-46222-nta7zq --template= --single-branch --depth 1 --branch 8.15.0
    FirebaseFirestore/AutodetectLeveldb: subspec would include leveldb if used directly or by default.
      > Copying FirebaseFirestore from `/Users/punaime/Library/Caches/CocoaPods/Pods/External/FirebaseFirestore/e4fb610867400ab6d3feb96b8d6fe477` to `Pods/FirebaseFirestore`
    -> Fetching podspec for `Flutter` from `Flutter`
    -> Fetching podspec for `cloud_firestore` from `.symlinks/plugins/cloud_firestore/ios`
    cloud_firestore: Using Firebase SDK version '10.12.0' defined in 'firebase_core'
    -> Fetching podspec for `firebase_core` from `.symlinks/plugins/firebase_core/ios`
    firebase_core: Using Firebase SDK version '10.12.0' defined in 'firebase_core'

    Resolving dependencies of `Podfile`
      CDN: trunk Relative path: CocoaPods-version.yml exists! Returning local because checking is only performed in repo update
    [!] CocoaPods could not find compatible versions for pod "FirebaseFirestore":
      In snapshot (Podfile.lock):
        FirebaseFirestore (= 10.12.0, ~> 10.12.0)

      In Podfile:
        FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `8.15.0`)

    None of your spec sources contain a spec satisfying the dependencies: `FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `8.15.0`), FirebaseFirestore (= 10.12.0, ~> 10.12.0)`.

    You have either:
     * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.
     * mistyped the name or version.
     * not added the source repo that hosts the Podspec to your Podfile.

(以下省略)

ここまでで、iOS、Androidともにエラー無くビルドできることを確認してみてください。

Cloud Firestore を初期化を行う

Cloud Firestore パッケージを使用するには、cloud_firestore.dartをインポートする必要があります。

import 'package:cloud_firestore/cloud_firestore.dart';

次にmain.dartファイルで、Firestore インスタンスを読み込みます。_MyHomePageStateクラスにFirebaseFirestoreのインスタンスを生成してdbに格納します。このようにすることで、Firestoreのデータにアクセスする準備が整います。

FirebaseFirestore db = FirebaseFirestore.instance;
main.dart
(変更前)
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  
(変更後)
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  db = FirebaseFirestore.instance; //追加

FlatterでのCloud Firestoreの基本設定は、以上となります。次回は、Firestore側の設定を行います。