Flutter Firebase 数据库,DataSnapshot?如何获取值和键,空安全
Flutter Firebase Database, DataSnapshot? how to get values and keys, null safe
使用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)] Unhandled Exception: type 'List<Object?>' is not a subtype of type 'Map<dynamic, dynamic>'
我认为这意味着密钥没有在 dataSnapshot.value 中返回,我现在如何使用它像以前一样获取(密钥,值)?
如果我打印 snapshot.value 我会得到这样的结果,所以看起来密钥不再像以前那样出现在 snapshot.value 中,我不知道密钥现在在哪里:
[{name: 2016-2017}, {name: 2017-2018}, {name: 2018-2019}]
提前致谢。
您可能也更新了 Flutterfire cloud_firestore
,因为从错误中可以看出,在最新版本中,从快照返回的数据是 Object
或 List<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",
...
暂时使用版本 8.x.x,因为输出类型是动态的而不是对象?在版本 9.x.x
中
Map<dynamic, dynamic> mapData;
snapshot.values.forEach((key, value) {
mapData[key][value];
})
使用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)] Unhandled Exception: type 'List<Object?>' is not a subtype of type 'Map<dynamic, dynamic>'
我认为这意味着密钥没有在 dataSnapshot.value 中返回,我现在如何使用它像以前一样获取(密钥,值)?
如果我打印 snapshot.value 我会得到这样的结果,所以看起来密钥不再像以前那样出现在 snapshot.value 中,我不知道密钥现在在哪里:
[{name: 2016-2017}, {name: 2017-2018}, {name: 2018-2019}]
提前致谢。
您可能也更新了 Flutterfire cloud_firestore
,因为从错误中可以看出,在最新版本中,从快照返回的数据是 Object
或 List<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",
...
暂时使用版本 8.x.x,因为输出类型是动态的而不是对象?在版本 9.x.x
中Map<dynamic, dynamic> mapData;
snapshot.values.forEach((key, value) {
mapData[key][value];
})