我需要迭代Firebase中DatabaseReference
中的一个节点。但必须说明的是,forEach
库中的DataSnapshot
中没有firebase_database
函数!
我还尝试使用DataSnapshot
库中的firebase
对象(其中具有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;
});
}
答案 0 :(得分:2)
尚不清楚您要在代码中做什么,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;
。
然后您使用forEach()
在map
内循环以获取键和值,您将获得以下输出:
此行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);