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

Can't cast _InternalLinkedHashMap<Object?, Object?> to anything

我在从 Firebase RealtimeDatabase 获取数据作为地图时遇到了一些问题,尽管我首先将其作为地图上传。我看到的所有解决方案都是您应该将 The snapshot.value 转换为传入数据类型,但没有迭代对我有用。我已经能够在快照值上调用 toString() 并且我已经验证它是一个 Map 但编译器甚至不允许我将它转换为 Map 更不用说 运行 它了。如果我尝试使用 dynamic 来防止编译错误,我仍然会得到这个 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() 似乎是一个流行的方法,但我的简单抛出一个 运行 时间错误。

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

我一边工作

不是吗?

事件。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}

我可以通过引用数据的完整路径来访问一个数据值,但是我有一个很大的地图,我无法对每个类别中的每个值都这样做。这似乎很昂贵并且浪费时间。我花了几天时间尝试了很多东西,所以请记住这一点。

我认为发生这种情况是因为 event.snapshot.value 返回了 Map.from 不期望的内容。基本上 Map.from 需要一个 Map 这样你就可以将你的数据转换为相同的。

尝试将您的线路更改为

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

感谢大家的回复。特别感谢@Stelios Papamichail 3 个月前提供的解决方案。 很遗憾官方开发团队没有注意到这一点。 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());
    }
  }

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

解法:

如果您在 FIREBASE 数据库中有数据, 例如:Please Click Here to Check ScreenShot

那么截至目前,2022 年 3 月 12 日:

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

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

检查带有完整示例代码的完整示例: 例如:用于从数据库中检索姓名和电子邮件。 Please click here to Check the Complete Code Sample Screenshot