繁体   English   中英

Flutter Firebase 数据库,数据快照? 如何获取值和键,null 安全

[英]Flutter Firebase Database, DataSnapshot? how to get values and keys, null safe

使用 firebase_database:^7.1.1

在 null 安全之前,我曾经这样做以从 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;

[错误:flutter/lib/ui/ui_dart_state.cc(199)] 未处理的异常:类型“List<Object?>”不是类型“Map<dynamic, dynamic>”的子类型

我认为这意味着键没有在 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<dynamic,dynamic>。

一种解决方案可能是:

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",
...

现在使用版本 8.xx,因为 output 类型是动态的,而不是 Object? 在版本 9.xx

Map<dynamic, dynamic> mapData;
snapshot.values.forEach((key, value) {
  mapData[key][value];
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM