升级Firebase Database至V10后value属性无法访问问题咨询
Firebase Database 10.x版本兼容修改方案
问题原因
Firebase Realtime Database 10.x版本对API做了核心调整:
once()方法的返回值从直接的DataSnapshot改为DatabaseEvent对象,因此无法直接通过value属性获取数据,必须先从DatabaseEvent中提取snapshot。- 原API中的
reference()方法已被新的ref()方法替代(旧方法虽暂时兼容,但官方推荐使用新方法)。
修改后的代码
FirebaseDatabase.instance.ref("schools").once().then((event) { final snapshot = event.snapshot; print(snapshot); items = []; // 先判断数据是否存在 if (snapshot.value != null) { // 处理数组类型数据(对应Firebase中的数组结构) if (snapshot.value is List) { final dataList = snapshot.value as List; for (int i = 0; i < dataList.length; i++) { print(i); items.add(dataList[i].toString()); } } // 处理键值对类型数据(Firebase默认存储结构) else if (snapshot.value is Map) { final dataMap = snapshot.value as Map; dataMap.entries.forEach((entry) { print(entry.key); items.add(entry.value.toString()); }); } } print(items.toString()); });
关键改动说明
- 替换
reference()为ref():遵循10.x版本的新API规范,保证代码的兼容性与前瞻性。 - 通过
event.snapshot获取数据:once()返回的DatabaseEvent包含snapshot属性,这才是原来的DataSnapshot对象,可从中正常访问value。 - 增加数据类型判断:Firebase Realtime Database中,未显式定义的"数组"实际会以键为索引的Map存储,直接用索引遍历可能出错,因此区分List和Map两种情况处理。
内容的提问来源于stack exchange,提问作者BTB
相关产品推荐
相关产品推荐

