Flutter:未为 DataSnapshot 类定义 forEach 方法

Posted

技术标签:

【中文标题】Flutter:未为 DataSnapshot 类定义 forEach 方法【英文标题】:Flutter: The method forEach isn't defined for the class DataSnapshot 【发布时间】:2019-01-16 10:54:58 【问题描述】:

我需要在 firebase 的 DatabaseReference 中迭代一个节点。但是在DataSnapshot 中没有forEach 函数是在firebase_database 库中!

我还尝试使用 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;
  );

【问题讨论】:

How to loop through a Firebase datasnapshot sub childrens? Flutter的可能重复 【参考方案1】:

不清楚您要在代码中做什么,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&lt;dynamic,dynamic&gt;,那么你可以这样做Map&lt;dynamic, dynamic&gt; 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);

【讨论】:

以上是关于Flutter:未为 DataSnapshot 类定义 forEach 方法的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Firestore 错误:未为“对象”类定义运算符“[]”

Flutter Firestore:未为类“Object?”定义运算符“[]”。 - “对象”来自“飞镖:核心”

未为“对象”类型定义运算符“[]”[重复]

DataSnapshot 无法转换为适配器 [关闭]

在 IntelliJ Idea 中未为 Kotlin @ConfigurationProperties 类生成 spring-configuration-metadata.json 文件

未为 InvoiceTemplateGet 类型定义方法 execute()