尽管我首先将其作为地图上传,但从 Firebase RealtimeDatabase 获取数据作为地图时遇到了一些问题。我看到的所有解决方案都是您应该将 snapshot.value 转换为传入的数据类型,但对我来说没有任何迭代。我已经能够对快照值调用
toString()
并且我已经验证它是一个 Map,但编译器甚至不允许我将其转换为 Map,更不用说运行它了。如果我尝试使用动态来防止编译错误,我仍然会得到这个 Unhandled Exception: type '_InternalLinkedHashMap<Object?, Object?>' is not a subtype of type 'Map<String, dynamic>?' in type cast
。
这就是我所做的,
Future<Map<String, dynamic>> getBasicDetail(
DatabaseReference databaseReference) async {
DatabaseReference imageURLevent = databaseReference.child('basicDetail');
final snapShot = await imageURLevent.get();
return Map<String, dynamic>.from(
snapShot.value as Map<String, dynamic>? ?? {});
}
Future<void> readProfileData({required String userId}) async {
DatabaseReference ref = FirebaseDatabase.instance.ref("users/$userId");
final basicDetail = await getBasicDetail(ref);
// Print the data of the snapshot
debugPrint(basicDetail.toString());
}
我已经尝试了解析这些数据的所有可能的组合,但没有任何效果。由于某些原因,在示例和视频中,当您将右侧投射到
Map<String,dynamic>
时,您不会收到任何错误,但我的 IDE 甚至不允许我这样做。我也尝试过 Map.from() 似乎是一种流行的方法,但我的简单方法会引发运行时错误。
为什么会这样 来自 https://www.youtube.com/watch?v=sXBJZD0fBa4&ab_channel=Firebase
我的时候工作
event.snapshot.value 看起来也有效
[log] {bloodGroup: gh, imageURL: /data/user/0/com.piyushlimited.buzzai/app_flutter/image_picker7287835118545461685.jpg, fullName: Henry Nana Adu, weight: 523, dateOfBirth: 11/11/11, licenseNumber: 256489, age: 28}
我可以通过引用数据的完整路径来访问数据的一个值,但我有一张大地图,我无法对每个类别中的每个值执行此操作。看起来既费钱又浪费时间。我花了几天时间尝试了很多事情,所以请记住这一点。
谢谢你们的回复。特别感谢@Stelios Papamichail 3 个月前提供的解决方案。 Firebase 的响应似乎不是有效的 JSON 格式 遗憾的是官方开发团队没有注意到这一点。
jsonDecode(jsonEncode(event.snapshot.value)));
效果完美。这可能是性能不佳的原因,但我现在并不关心这一点,我只是很高兴它确实如此。我也不知道为什么会这样。
现在效果很好
Future<void> readProfileData({required String userId}) async {
DatabaseReference ref = FirebaseDatabase.instance.ref("users/$userId");
try {
final DataSnapshot? snapShot = await ref.get();
Map<String, dynamic> data = jsonDecode(jsonEncode(snapShot?.value));
userProfile = UserProfile.fromMap(data);
setGender(userProfile.gender);
notifyListeners();
log(userProfile.toString());
} on Exception catch (e) {
log(e.toString());
}
}
希望更多人看到这一点,不要像我一样浪费生命。
我认为发生这种情况是因为
event.snapshot.value
返回了 Map.from 未预期的内容。基本上 Map.from 需要一个 Map尝试将您的线路更改为
final data = Map<String, dynamic>.from(event.snapshot.value as Map<dynamic, dynamic>);
我升级了 Flutter,现在来自 Firebase 实时数据库的所有 Firebase 地图都已损坏。娜娜的建议有效。
Map<String, dynamic> data = jsonDecode(jsonEncode(snapShot?.value));
只需补充一点,我做了一个扩展,这样如果将来再次出现问题,我不必在代码中的每个地方都进行更改来修复它,并且不会那么冗长。
extension FirebaseObjectExtension on Object? {
//Safely converts the Firebase object to a `Map<String, dynamic>`.
Map<String, dynamic>? toMap() {
if (this == null) return null;
try {
if (this is Map<String, dynamic>) {
return this as Map<String, dynamic>;
} else {
return jsonDecode(jsonEncode(this)) as Map<String, dynamic>;
}
} catch (e) {
return null;
}
}
}
然后就可以打电话了
Map<String, dynamic>? map = element.value.toMap();
解决方案:
如果您在 FIREBASE 数据库中有数据, 例如:请点击此处查看屏幕截图
那么从现在开始,2022 年 3 月 12 日:
要从 Firebase 数据库检索数据,您必须使用以下示例代码。
String name = (snap.snapshot.value as Map)["name"];
print("name :: $name");
检查完整示例和完整示例代码: 例如:用于从数据库检索姓名和电子邮件。 请点击此处查看完整代码示例截图