【问题标题】:How to filter a List in Dart如何在 Dart 中过滤列表
【发布时间】:2019-07-09 19:30:09
【问题描述】:

我从 Firebase 获取我的 DocumentSnapshots,我正在尝试删除用户 ID 匹配但 userList 始终返回 4 条记录的文档。

List<DocumentSnapshot> userList = new List<DocumentSnapshot>();

userList = snapshot.data.documents.map((DocumentSnapshot docSnapshot) {
  //print("ACTUAL USER :: " + docSnapshot.data['userId']);
  if (docSnapshot.data['userId'] != id) {
    return docSnapshot;
  } else {
    print('FOUND IT: ' + id);
    userList.remove(docSnapshot.data);
    //userList.removeWhere((docSnapshot) => 'userId' == id);
  }
}).toList();

print('userList Size: ' + userList.length.toString());

验证有效(“找到它”),但我的测试都无法从文档列表中删除用户。

有人可以建议吗?

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    您正试图在添加之前从 List 中删除该元素。
    具体来说,map 函数将在映射快照之后将List 分配给您的userList 变量
    从您的代码中,我可以看出您实际上并不想执行任何 mapping,而只想执行 filtering

    在 Dart 中,您可以使用 Iterable.where 进行过滤。
    在你的情况下,看起来像这样:

    final List<DocumentSnapshot> userList = snapshot.data.documents
          .where((DocumentSnapshot documentSnapshot) => documentSnapshot['userId'] != id).toList();
    

    我假设您只需要没有iduserId 的文档,否则,您将不得不使用== 运算符。

    您也可以使用List.removeWhere,首先将所有文档分配给您的userList,然后调用removeWhere

    final List<DocumentSnapshot> userList = snapshot.data.documents;
    
    userList.removeWhere((DocumentSnapshot documentSnapshot) => documentSnapshot['userId'] != id).toList();
    

    【讨论】:

    • 非常感谢!创建列表后,我尝试了.removeWhere,但也返回了null。 (你在“快照”上有错字)
    • @FilipeOS 感谢您的指出。 List.removeWhereList 对象中删除元素,即它转换您调用它的 List 并且不返回任何结果。 Iterable.where 不会转换您调用它的 Iterable,但会返回其结果。我在我的回答中添加了一个如何使用removeWhere 的示例。
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多