Flutter Firebase DatabaseReference未定义getDocuments方法报错
报错核心原因
你碰到的这个报错本质是混淆了Firebase两个不同产品的API接口:
- 代码中
FirebaseDatabase.instance.reference().child("Book")的调用链路属于Firebase实时数据库体系,最终返回的DatabaseReference类型,本身就不存在getDocuments()方法。 getDocuments()是Cloud Firestore(另一款独立的Firebase数据库产品)的早期废弃API,两套数据库的SDK完全独立、API不互通,编译器自然会提示方法未定义。- 代码里用到的
.reference()链式调用,本身也是实时数据库SDK的旧版废弃写法,目前新版SDK中已经将这类旧方法完全移除。
适配实时数据库的修复方案
从你存储的树形数据结构判断,你使用的是Firebase实时数据库,直接按照新版SDK规范改写逻辑即可,核心改动点如下:
- 替换旧的数据库引用初始化方式,用
ref()方法直接传入节点路径,替代已经废弃的reference().child()链式写法 - 将不存在的
getDocuments()替换为实时数据库对应的一次性读取方法get() - 读取到的快照数据不用旧代码里的
data.documents取值,直接通过DataSnapshot对象的children属性获取Book节点下的所有列表项
改写后的可运行代码:
getItemStreamSnapshots() async { final bookSnapshot = await FirebaseDatabase.instance.ref("Book").get(); setState(() { // 把快照下的所有子节点转为列表,赋值给原有状态变量即可 _allResults = bookSnapshot.children.toList(); }); searchResultsList(); return "complete"; }
额外提醒
如果你实际开发需要用Cloud Firestore存储列表,那整个调用链路都需要替换,不能套用实时数据库的初始化逻辑。正确的基础调用为FirebaseFirestore.instance.collection("Book").get(),返回结果需要从QuerySnapshot.docs字段中读取列表项,两套逻辑不能混用。
内容的提问来源于stack exchange,提问作者Tomee
相关产品推荐
相关产品推荐

