【问题标题】:Filter list by firebase conditions in flutterFlutter中按Firebase条件过滤列表
【发布时间】:2020-10-01 22:49:51
【问题描述】:

我有一个 StreamBuilder 向列表提供数据,该列表稍后会显示在堆栈中。

我想通过这些规则过滤(删除)某些卡被添加到列表[]:

  • 我是卡的所有者 ('ownerId' == currentUserId)
  • 我喜欢这张卡片('liked.' contains = currentUserId)

我选择做一个 StreamBuilder 是因为我想在用户与之交互后自动更新堆栈(通过喜欢它,它会消失并显示下一个)。据我了解,流服务于这个目的。但如果我错了,如果有更好的方法,请纠正我。

streamCard() {
    return StreamBuilder(
        stream: postRef
            .orderBy("timestamp", descending: true)
            .limit(10)
            .snapshots(),
        builder: (context, snapshot) {
          if (!snapshot.hasData) {
            return circularProgress();
          }
          List<PostCard> cards = [];
          snapshot.data.documents.forEach((doc) {
            cards.add(PostCard.fromDocument(doc));
          });

如果“卡片”不为空:

return Stack(
              alignment: Alignment.center,
              children: cards,

在 Firebase 中,我有: "Cards" > "cardID" > 带有 "ownerId" 和 "liked" 字段("liked" 包含喜欢它的每个 uid)。

想法是将当前的uid与每个cardID的内容进行比较。如果他们在场,请关闭该卡并尝试下一张。

我一直在为这个问题苦苦挣扎,感谢任何帮助!

编辑 Firestore 结构:

【问题讨论】:

    标签: firebase flutter dart google-cloud-firestore


    【解决方案1】:

    基本上,您要做的是在您的 Firestore 上进行逻辑 OR 查询,如 documentation 中所述,这是非常有限的。作为比较,如果您试图创建一个符合逻辑的AND,您只需在查询中堆叠2 个where() 调用。

    因此,您不能简单地在查询本身(在本例中为您的stream)限制它,但您可以在流的构建器中对其进行操作,可以这样做:

    builder: (context, snapshot) {
        if (!snapshot.hasData) {
            return circularProgress();
        }
        List<PostCard> cards = [];
        snapshot.data.documents.forEach((doc) {
            List<String> liked = List.castFrom(doc.get("liked"));
            // currentUserId is previously populated
            if(doc.get("ownerId") == currentUserId || liked.contains(currentUserId)){
                cards.add(PostCard.fromDocument(doc));
            }
        });
        return cards;
    }
    

    【讨论】:

    • 感谢您的回复!我实际上必须使用 (owner != currentuid || "liked" doesn't contain) 才能添加,有没有办法使用不包含?我尝试了代码并得到了QueryDocumentSnapshot' has no instance method '[]'. Receiver: Instance of 'QueryDocumentSnapshot' Tried calling: []("ownerId")
    • 很抱歉,较新的版本使用document.get(field) 而不是document["field"],现在应该可以工作了,我不明白你的意思是使用方法不包含,但我猜你只需要改变 if 来做你想做的事。
    • 已修复,谢谢!但是包含不起作用Class '_InternalLinkedHashMap&lt;String, dynamic&gt;' has no instance method 'contains'.
    • 将其更改为 containsValue 而不是 contains,应该可以解决问题,我会将其编辑为答案。
    • 您首先需要将列表转换为字符串列表,然后使用contains(value),检查编辑后的答案,希望它现在可以工作:)
    猜你喜欢
    • 2019-12-26
    • 2018-09-09
    • 2021-07-25
    • 2015-05-23
    • 1970-01-01
    • 2019-07-30
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多