【Flutter】Firestoreで複合クエリを使うと、StreamBuilderがうまく機能しない時の解決法

どーも、ぐるたか@guru_takaです。

FLutter製アプリでFirestoreのデータをリアクティブにしたくて、StreamBuildeを使いました。しかし、問題が起きます。

ビルド後のデータ取得はうまくいくのですが、その後にデータの登録、更新、削除をしたとしても、リアクティブにならないという…。ハマりましたので、備忘録として解決策をまとめます。

エラーの原因

原因は、Firestoreの複合インデックスを作成しなかったからです。複合インデックスを作らず、複合クエリを使うと、データ更新、登録、削除などをlistneできなくなります。(最初のデータ取得のときも、エラー出してくれよ…)

複合インデックスとは、複数のフィールドに対してwhere句や、orderByなどを使うことを意味します。

最初、StreamBuilderの文法が間違っているのかな…と試行錯誤。そのとき、偶然、複合クエリしないで試したら、うまくいったので、複合クエリが怪しい…と気づきました。

デバック中のログを確認すると、教えてくれていました。(赤字で警告してほしいぜ…)

[Firestore]: Listen for Query(done where userRef == users/123456789 order by createdAt, __name__) failed: Status{code=FAILED_PRECONDITION, description=The query requires an index. That index is currently building and cannot be used yet.

複合インデックスの作成方法

複合インデックスは、Firebaseの管理画面から以下のように作成できます。

参考 Cloud Firestore のインデックスの種類 | Firebase

参考リンク

参考 AndroidでFirebaseのCloudFirestoreを使ってみた(Kotlin)Qiita

コメントを残す