如何从 itemBuilder 访问查询?

Posted

技术标签:

【中文标题】如何从 itemBuilder 访问查询?【英文标题】:How to access query from itemBuilder? 【发布时间】:2019-08-07 12:25:41 【问题描述】:

我让随机聊天应用程序使用 FirestoreAnimatedList(FirebaseAnimatedList for Firestore)。

如果同一用户发送多条消息,我希望只显示一次用户头像,因此不会多次显示相同的头像。

我的解决方案是使用索引来检查最后一条消息是否由同一用户发送。

所以我需要像这样检查:

if (snapshot[index - 1][‘user’] == user) 
  return true;

但我的snapshotDocumentSnapshot,所以不能调用[index - 1]

也许我必须从query 获取列表? 如何访问所以可以像这样调用列表中的indexquery

谢谢!

这里的例子:

body: FirestoreAnimatedList(
        query: firestore.collection('messages').snapshots(),
        itemBuilder: (
          BuildContext context,
          DocumentSnapshot snapshot,
          Animation<double> animation,
          int index,
        ) 
          return FadeTransition(
            opacity: animation,
            child: MessageItem(
              index: index,
              document: snapshot,
              onTap: _removeMessage,
            ),
          );
        ,

【问题讨论】:

【参考方案1】:

您可以将用户存储在 Map 中。

在小部件的class 中,您必须创建一个变量来保存地图:

final Map<int, dynamic> users = ;

然后,您可以在itemBuilder 回调中填充地图:

itemBuilder: (
          BuildContext context,
          DocumentSnapshot snapshot,
          Animation<double> animation,
          int index,
        ) 
          users[index] = snapshot['user']; // added line
          return FadeTransition(
            opacity: animation,
            child: MessageItem(
              index: index,
              document: snapshot,
              onTap: _removeMessage,
            ),
          );
        ,

现在,你可以为所欲为:

if (users[index - 1] == user) 
  return true;

【讨论】:

感谢您的回复!我在想这个但效率不高?这会从DocumentSnapshot 创建另一个用户映射。但是应用程序已经在query 中获取所有DocumentSnapshot。所以重复 @FlutterFirebase 是一个非常简单的Map。您不会在内存或其他性能中注意到这一点。如果您希望具有可定制性,则不应使用此预制插件。使用此Map 时您唯一需要担心的是何时清理它,但是,我无法告诉您如何操作,因为我不知道您的应用程序是如何工作的。 谢谢!所以无法从query 获得原始列表?也许我使用 listviewbuilder 更好

以上是关于如何从 itemBuilder 访问查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ListView 的项目构建器之前添加初始小部件,或者如何在 ListView.itemBuilder 之上注入小部件?

firebase 查询如何从子项中检索两个特定值

滚动时触发的 ListView itemBuilder 方法

如何让 atlassian 竹子从提交后挂钩自动触发构建

如何从第三个查询中排除值(访问)

如何使用 vb.net 从查询创建访问报告