无法将 _InternalLinkedHashMap<Object?, Object?> 转换为任何内容

问题描述 投票:0回答:4

尽管我首先将其作为地图上传,但从 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() 似乎是一种流行的方法,但我的简单方法会引发运行时错误。

为什么会这样 Firecasts 来自 https://www.youtube.com/watch?v=sXBJZD0fBa4&ab_channel=Firebase

我的时候工作

Code 不是吗?

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}

我可以通过引用数据的完整路径来访问数据的一个值,但我有一张大地图,我无法对每个类别中的每个值执行此操作。看起来既费钱又浪费时间。我花了几天时间尝试了很多事情,所以请记住这一点。

flutter dart firebase-realtime-database
4个回答
11
投票

谢谢你们的回复。特别感谢@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());
    }
  }

希望更多人看到这一点,不要像我一样浪费生命。


0
投票

我认为发生这种情况是因为

event.snapshot.value
返回了 Map.from 未预期的内容。基本上 Map.from 需要一个 Map,这样你就可以将你的数据转换为相同的。

尝试将您的线路更改为

final data = Map<String, dynamic>.from(event.snapshot.value as Map<dynamic, dynamic>);

0
投票

我升级了 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();

-3
投票

解决方案:

如果您在 FIREBASE 数据库中有数据, 例如:请点击此处查看屏幕截图

那么从现在开始,2022 年 3 月 12 日:

要从 Firebase 数据库检索数据,您必须使用以下示例代码。

String name = (snap.snapshot.value as Map)["name"];
print("name :: $name");

检查完整示例和完整示例代码: 例如:用于从数据库检索姓名和电子邮件。 请点击此处查看完整代码示例截图

© www.soinside.com 2019 - 2024. All rights reserved.