微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter Firebase 数据库,DataSnapshot?如何获取值和键,空安全

如何解决Flutter Firebase 数据库,DataSnapshot?如何获取值和键,空安全

使用 firebase_database:^7.1.1

在空安全之前,我曾经这样做以从 firebase 数据库获取数据:

DataSnapshot dataSnapshot = await References.getReferenceYears().once();
Map<dynamic,dynamic> values = dataSnapshot.value;
values.forEach((key,value) {...}

现在,当我尝试这样做时,出现如下错误

DataSnapshot? dataSnapshot = await References.getReferenceYears().once();
Map<dynamic,dynamic> values = dataSnapshot.value;

[ERROR:Flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:类型 'List' 不是类型 'Map' 的子类型

我认为这意味着在 dataSnapshot.value 中没有返回键,我现在如何像以前一样使用它来获取(键,值)?

如果我打印snapshot.value,我会得到这样的结果,所以看起来键不再像以前一样出现在snapshot.value中,我现在不知道键在哪里:

[{name: 2016-2017},{name: 2017-2018},{name: 2018-2019}]

提前致谢。

解决方法

您可能也更新 Flutterfire cloud_firestore,因为从错误中可以看出,在最新版本中,从快照返回的数据是 ObjectList<Object> 而不是一张地图。

你可以这样解决:

snapshot.value as Map<String,dynamic>

编辑:

我看到你提到了 firebase 实时数据库。 所以问题不是由flutter_fire引起的。

错误告诉您,您正在尝试将 List 放入 Map

一种解决方案可能是:

Map<dynamic,dynamic> values = dataSnapshot.value as Map<dynamic,dynamic>;
,

试试这个

DataSnapshot dataSnapshot = await References.getReferenceYears().once();

(dataSnapshot as Map<dynamic,dynamic>).forEach((key,value) {...}
,

听起来您在 References.getReferenceYears() 下有连续的数字键,SDK 会将其转换为数组。我认为这在最近的 SDK 中没有改变,因为 Firebase 总是试图将这些键强制转换为数组。

如果您不希望将值存储到数组中,防止这种情况发生的最简单方法是在键前添加一个简短的非数字值,例如:

"key_0": "value 0","key_1": "value 1","key_2": "value 2",...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。