事象
Isarのドキュメントに従って以下のようなコードを書いていたら
findAll()
の箇所で標題のNoSuchMethodErrorが出て、QueryBuilderにそんなメソッドはないと怒られた。
isar.users
.where()
.nameEqualTo('Taro')
.findAll();
たしかにコード補完でもfindAllは出てこず、公式のサンプルコード通りにやっているのになぜ?と混乱した
原因
上記クエリを記述しているファイル内でIsarをimportしていないのが原因だった。
ファイル構成としては以下のとおり。
- ファイルA(プロバイダ): Isarをopenしてインスタンスを共有 ※ここでIsarをimport
- ファイルB(リポジトリ): プロバイダからIsarのインスタンスを受け取って上記コードのように使用
ファイルBでもIsarをimportして解決した。
原因詳細
GitHubのIssueに同じ内容があったが、そこでもはっきりとは書かれていなかった。
https://github.com/isar/isar/issues/1094
Dartのimportはファイルごとにスコープを持つから〜みたいなことが書かれていたが、
isar.users.where().nameEqualTo('Taro')
まではチェーンできているので
本質的には、IsarのQueryBuilderクラスがQueryクラスを作る仕組みとかそのへんがいろいろ関係してるんだろう。