我需要在 firebase 的 DatabaseReference
中迭代一个节点。但是在 firebase_database
库中的 DataSnapshot
中没有 forEach
函数!
我还尝试使用 firebase
库中的 DataSnapshot
对象(其中有一个 forEach 函数),但出现错误:
[dart] The argument type '(DataSnapshot) → List<dynamic>' can't be assigned to the parameter type '(DataSnapshot) → FutureOr<dynamic>'.
这是我的代码:
getAccountsList() {
return firebaseDbService.getAccounts().once().then((DataSnapshot snapshot) {
var list = [];
snapshot.forEach((DataSnapshot account) => list.add({
'id': snapshot.key,
'name': snapshot.child('name').val(),
}));
return list;
});
}
最佳答案
不清楚您在代码中尝试做什么,child(String path)
和 val()
类中不存在 DataSnapshot
,你可以在这里查看:
https://github.com/flutter/plugins/blob/master/packages/firebase_database/lib/src/event.dart#L27
你也不能像这样循环:
for( var values in snapshot.value){
print("Connected to second database and read ${values}");
}
因为你会得到以下错误:
这也意味着您不能使用 forEach()
在快照上进行迭代。
假设你有这个数据库,你想得到 names
:
user
randomId
name: John
randomId
name: Peter
您需要执行以下操作:
_db=FirebaseDatabase.instance.reference().child("user");
_db.once().then((DataSnapshot snapshot){
Map<dynamic, dynamic> values=snapshot.value;
print(values.toString());
values.forEach((k,v) {
print(k);
print(v["name"]);
});
});
此处引用指向节点 users
, 自 snapshot.value
类型为 Map<dynamic,dynamic>
那么你就可以做到这一点Map<dynamic, dynamic> values=snapshot.value;
.
然后你在 map
中循环使用 forEach()
为了能够获取键和值,您将获得以下输出:
这一行I/flutter ( 2799): {-LItvfNi19tptjdCbHc3: {name: peter}, -LItvfNi19tptjdCbHc1: {name: john}}
是 print(values.toString());
的输出
以下两行:
I/flutter ( 2799): -LItvfNi19tptjdCbHc3
I/flutter ( 2799): -LItvfNi19tptjdCbHc1
是 print(k);
的输出
另外两行是print(v["name"]);
的输出
添加names
在 forEach()
中执行以下操作:
list.add(v["name"]);
print(list);
关于firebase - Flutter:没有为类 DataSnapshot 定义 forEach 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51759155/