Flutter使用Cloud Firestore的whereIn查询无法获取文档如何解决
问题根因与修复方案
1. 核心查询逻辑错误
你当前使用的whereIn操作符的作用是匹配price完全等于数组中任意一个值的文档,而非查询落在两个数值之间的区间数据,与价格区间筛选的需求完全不符。
正确的查询写法应该组合使用范围判断操作符:
void getData()async { QuerySnapshot snapshot=await productReference .where('category',isEqualTo: widget.category) .where("price", isGreaterThanOrEqualTo: _values.start) .where("price", isLessThanOrEqualTo: _values.end) .limit(12) .get(); if(snapshot.docs.isNotEmpty){ for (DocumentSnapshot doc in snapshot.docs) { products.add(ProductModel.fromDocument(doc)); } lastDoc=snapshot.docs.last; } setState(() { loading=false; load=false; }); }
2. 滑块回调逻辑错误
当前onChanged回调存在两个明显逻辑问题:
- 先执行商品筛选、再更新
_values,筛选时用的还是滑动前的旧区间值 - 过滤条件逻辑错误:
element.price!<_values.start&&element.price!>_values.end要求商品价格同时小于最小值且大于最大值,该条件永远为假,不会过滤任何无效商品
修正后的回调逻辑如下:
onChanged: (SfRangeValues newValues) { // 先更新区间值 setState(() { _values = newValues; }); // 用新的区间值过滤不符合要求的商品 products.removeWhere((element) => element.price! < _values.start || element.price! > _values.end); if(products.length<8){ getData(); } },
3. 索引创建说明
该查询属于Firestore组合查询,需要创建对应的复合索引才能正常执行,索引配置参数如下:
- 第一个索引字段:
category,排序方式选择Ascending(升序) - 第二个索引字段:
price,排序方式选择Ascending(升序)
也可以直接运行一次查询,在Debug控制台中找到Firestore输出的索引创建失败提示,里面会自动生成对应索引的创建入口,点击即可一键创建,无需手动配置参数。
内容的提问来源于stack exchange,提问作者Deepak Lohmod
相关产品推荐
相关产品推荐

