旧Flutter代码适配最新版本:Firebase Realtime Database读取问题
解决方案:Firebase Realtime Database 数据读取兼容 Flutter 新版本
针对你遇到的两个错误,修复思路如下:
错误1修复:适配once()方法的返回类型变更
新版本Firebase Realtime SDK中,once()方法不再直接返回DataSnapshot,而是返回包含快照的DatabaseEvent对象,需要从事件中提取snapshot来获取数据。
错误2修复:处理dataSnapshot.value的类型问题
dataSnapshot.value现在的类型是Object?,无法直接调用forEach,需要先将其强制转换为Map<String, dynamic>(你的数据结构是键值对形式,符合Map类型)。
修改后的完整代码:
return await dbReference .orderByChild(AppDatabase._speciesCommonName) .startAt(prefix) .endAt('$prefix\uf8ff') .once() .then((DatabaseEvent event) { final DataSnapshot dataSnapshot = event.snapshot; // 校验数据存在且为Map类型 if (dataSnapshot.value != null && dataSnapshot.value is Map) { (dataSnapshot.value as Map<String, dynamic>).forEach((key, value) { String dbKey = key; String commonName = value[AppDatabase._speciesCommonName]; Species obj = Species(dbKey: dbKey, commonName: commonName); list.add(obj); }); } return list; // 记得返回填充后的列表 });
额外建议:如果你的Species类可以添加一个fromMap构造函数(比如Species.fromMap(String key, Map data)),可以进一步简化对象创建逻辑,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

