如何从 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;
但我的snapshot
是DocumentSnapshot
,所以不能调用[index - 1]
。
也许我必须从query
获取列表?
如何访问所以可以像这样调用列表中的index
和query
?
谢谢!
这里的例子:
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 之上注入小部件?