どーも、ぐるたか@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
コメントを残す