如何解决在Flutter-Listview
我正在尝试通过flutter
在firebase-firestore
中显示实时聊天屏幕(等于whatsapp的主屏幕)。
工作:创建所有“对等”联系人列表。看看我的Listview:
Container(
child: StreamBuilder(
stream:
//FirebaseFirestore.instance.collection('users').snapshots(),FirebaseFirestore.instance
.collection('users')
.doc(currentUserId)
.collection('peers')
.snapshots(),builder: (context,snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(themeColor),),);
} else {
return ListView.builder(
padding: EdgeInsets.all(10.0),itemBuilder: (context,index) =>
buildItem(context,snapshot.data.documents[index]),itemCount: snapshot.data.documents.length,);
}
},
不起作用:为每个图块加载特定数据,例如最后一条消息或名称。在创建第一个列表时,我无法查询此信息(第一个查询返回对等ID,第二个查询返回对等ID的userdata)。我的buildItem
方法由另一个streambuilder组成,但是,当第一个streambuilder进行更改时,应用程序将冻结。
Widget buildItem(BuildContext context,DocumentSnapshot document) {
return StreamBuilder<DocumentSnapshot>(
stream: FirebaseFirestore.instance
.collection('users')
.doc(document.data()['peerId'])
.snapshots(),builder: ...
这是嵌套流的正确方法吗?简单的Listviews记录得很好,但是我在Google上找不到很好的例子。任何帮助表示赞赏。
解决方法
尝试在initState中仅创建一次流,并将其传递给此方法:
//in initState
peersStream = FirebaseFirestore.instance
.collection('users')
.doc(currentUserId)
.collection('peers')
.snapshots(),
然后在stream: peersStream
中使用StreamBuilder
。
此外,建议在小部件的方法上使用小部件类:https://stackoverflow.com/a/53234826/5066615
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。