Flutter中Firebase Realtime Database的orderByChild()失效问题
问题分析与解决方案
你的问题核心是Firebase Realtime Database需要针对Likes字段手动创建索引——虽然你的读写规则完全开放,但数据库默认仅为节点的键(Key)创建了索引,所以orderByKey()可以正常工作,而orderByChild('Likes')和orderByValue()因缺少对应索引报错。
解决步骤:
- 打开Firebase控制台,进入当前项目的Realtime Database页面
- 切换到「规则」标签页,将现有规则修改为包含
Likes字段的索引:
{ "rules": { ".read": true, ".write": true, "search": { "titles": { ".indexOn": "Likes" } } } }
- 发布修改后的规则
完成后重新运行你的查询代码:
final firebase = FirebaseDatabase.instance .ref('search/titles') .orderByChild('Likes'); final snapshot = await firebase.get();
此时就能正常按Likes字段的值排序返回数据了。
补充说明:
orderByValue()失效的原因类似,但你的数据结构中每个title节点是包含Likes的对象,orderByValue()本身并不适用于当前场景。- 即便规则开放,Firebase也要求对非键字段的排序操作显式创建索引,这是为了保证查询性能,避免数据量增大后出现性能瓶颈。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

