【问题标题】:Can't cast _InternalLinkedHashMap<Object?, Object?> to anything不能将 _InternalLinkedHashMap<Object?, Object?> 转换为任何东西
【发布时间】:2022-01-05 15:13:06
【问题描述】:

尽管我首先将其作为地图上传,但我在从 Firebase RealtimeDatabase 作为地图获取数据时遇到了一些问题。我看到的所有解决方案都是您应该将 snapshot.value 转换为传入的数据类型,但没有迭代对我有用。我已经能够在快照值上调用toString() 并且我已经验证它是一个 Map 但编译器甚至不允许我将它转换为 Map 更不用说运行它了。如果我尝试使用动态来防止该编译错误,我仍然会得到这个 Unhandled Exception: type '_InternalLinkedHashMap&lt;Object?, Object?&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;?' 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&lt;String,dynamic&gt; 时,您不会收到任何错误,但我的 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}

我可以通过引用它的完整路径来访问一个数据值,但我有一个大地图,我不能为每个类别中的每个值都这样做。这似乎既昂贵又浪费时间。我花了几天时间尝试了很多事情,所以请记住这一点。

【问题讨论】:

  • 尝试一次 - snapShot.value as Map? ?? {});
  • event.snapshot.value 返回的值和类型是什么?
  • event.snapshot.value 返回 _InternalLinkedHashMap
  • @Diwyansh 你的建议不起作用我仍然得到未处理的异常:类型 '_InternalLinkedHashMap' is not a subtype of type 'Map?'在类型转换中
  • 能否打印 event.snapshot.value 并将打印结果添加到您的问题中?

标签: flutter dart firebase-realtime-database


【解决方案1】:

感谢您的回复。特别感谢@Stelios Papamichail 3 个月前提供的解决方案。 Firebase's response is not in a valid JSON format it seems 很遗憾官方开发团队没有注意到这一点。 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());
    }
  }

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

【讨论】:

  • 我已经测试过使用 jsonDecode(jsonEncode(event.snapshot.value));但我仍然得到 [VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: type 'String' is not a subtype of type 'Map' 尝试将数据映射到我的模型时
【解决方案2】:

我认为这是因为event.snapshot.value 正在返回 Map.from 不期望的东西。基本上 Map.from 需要一个 Map,因此您可以将数据转换为相同的。

尝试将您的线路更改为

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

【讨论】:

  • 试过了,不行。同样的错误。 :(
  • 图片中显示的是哪一个或 一个?
  • 是的Unhandled Exception: type '_InternalLinkedHashMap&lt;Object?, Object?&gt;' is not a subtype of type 'Map&lt;dynamic, dynamic&gt;' in type cast
【解决方案3】:

解决方案:

如果您在 FIREBASE DATABASE 中有数据, 例如: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

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 2012-06-03
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多