从堆栈中删除文档

时间:2019-10-23 01:13:48

标签: user-interface flutter dart google-cloud-firestore

我有一个Stream Builder,它会填充一叠纸牌:

select 
    user AS recipient, 
    COUNT(*) as trans_count, 
    sum(amount) as sum_am
from transactions
group by user
having count(*) >= 3 and
       sum(amount) >= 1000;
_showCards() {
    return StreamBuilder<QuerySnapshot>(
        stream: cardReference.snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return circularProgress();
          }
          return Stack(children: fillCards(snapshot));
        });
  }

我想使用跳过按钮删除堆栈上的顶部快照。如何管理快照以访问特定索引?

编辑:

我需要从“堆栈”视图中删除该卡,而不是实际上从数据库中删除它。我在想应该使用列表并使用.removeAt(index),但不确定如何将Firestore中的快照添加到列表中。如您在fillCards()中所见,我目前有一张文档地图。

fillCards(AsyncSnapshot<QuerySnapshot> snapshot) {
    return snapshot.data.documents
        .map((doc) => buildCards(
              image: doc["mediaUrl"],
              title: doc["title"],
              type: doc["description"],
            ))
        .toList();
  }

2 个答案:

答案 0 :(得分:0)

在这种情况下,如果您是我,则创建一个viewModel并将文档数据复制到viewModel中。然后,我只修改viewModel来管理视图。

答案 1 :(得分:0)

当您点击项目的“跳过”按钮时,您似乎试图跳过列表中的任何项目。

这里有一些方法可以做到这一点:

  • 如果该列表是某个用户的特定列表,则可以在 数据库为“已跳过”,并且当您显示列表时,只需显示项目 不会“跳过”。
  • 如果该列表可以与其他用户共享,则可以为每个用户创建另一个列表,并带有“跳过”的ID。然后显示ID不在该用户“跳过”列表中的项目。
  • 如果要在客户端上处理此问题而不更改数据库,则可以创建“已跳过” ID的列表,并且在显示列表时,只需显示不在“已跳过”列表中的项目即可。

以下是最后一种选择的想法:

final _skippedIds = List();

// The filtered list
snapshot.data.documents.where((doc) => !_skippedIds.contains(doc["id"])).map(...

// The onTap of each skip button:
onTap: () => setState(() => _skippedIds.add(doc["id"])),

此外,您可以将跳过的ID列表保存在SharedPreferences上。