Flutter:未为DataSnapshot类

时间:2018-08-09 05:02:13

标签: firebase firebase-realtime-database dart flutter

我需要迭代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;
  });
}

1 个答案:

答案 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}");
}

因为您将收到以下错误:

enter image description here

这也意味着您不能在快照上使用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内循环以获取键和值,您将获得以下输出:

output

此行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);