firebase - Dart - 如何让 StreamBuilder 停止监听事件
问题描述
我正在使用 StreamBuilder 来访问我的 Firestore 数据库的内容,并为这些内容创建一个 List Tiles 列表。我的问题是,每当我单击 List Tile 时,就像我的 StreamBuilder 方法再次被调用,并使列表中所需的 List Tiles 数量增加一倍(因为我使用的是 List.add() 方法)。
如何让 StreamBuilders 停止“重建”或“监听”?我对 Dart 很陌生,所以我不知道如何处理这个问题。
这是不断重复的代码。(为了这篇文章的目的,我在包含“...”的地方审查了一些信息):
var topics = new List();
var messages = new List();
var dates = new List();
List<Widget> content = new List<Widget>();
return new StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection("collection-id").snapshots(),
builder: (context, snap) {
//just add this line
if (snap.data == null) return CircularProgressIndicator();
for (int i = 0; i < snap.data.documents.length; i++) {
topics.add(...);
messages.add(snap.data.documents[i]["message"].toString());
dates.add(...);
}
for (var i = 0; i < topics.length; i++) {
content.add(new Container(
child: new ListTile(
leading: Icon(Icons.events, color: Colors.black, size: 30,),
title: Text(topics[i].toString()),
subtitle: Text(messages[i].toString()),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => ReadContent(topics[i], messages[i],dates[i])),
);
},
),
decoration: new BoxDecoration(border: new Border(bottom: new BorderSide()))));
}//for
return new Column(children: content);
});//StreamBuilder
}//showContent()
这是调用 showContent() 的有状态小部件的片段:
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('App'),
),
body: Center(
child: new Container(
child: new SingleChildScrollView(
child: new Column(
children: <Widget>[
showContent(context),
],
),
),
),
),
);//Scaffold
}
解决方案
一种方法是在向其中List
添加数据时清除您的数据。使用您当前的方法,如果一些新数据也到达,数据将被附加到List
并导致数据重复。
for (int i = 0; i < snap.data.documents.length; i++) {
topics.clear();//clear the items in list
topics.add(...);
messages.add(snap.data.documents[i]["message"].toString());
dates.add(...);
}
推荐阅读
- javascript - 用R自动读取用javascript编写的动态表的内容
- sql - 基于一列组合具有不同列数的多个表
- android - Android-Q 中的地理围栏创建错误-“com.google.android.gms.common.api.ApiException: 13”
- reactjs - Reactjs - 使用require在构造函数中加载json文件
- javascript - 如何将参数传递给 --world-parameters 或 npm run 命令以供包中的脚本使用
- android - iOS 和 Android 允许什么样的应用程序代码混淆?
- c# - 我无法将文件从我的服务器文件系统发送到客户端(使用“另存为”对话框下载)
- java - JAXB 将属性添加到集合元素
- azure - 不支持证书链中x509证书的椭圆曲线密码学公钥算法?
- linux - 如何检查我的进程是否在 Linux 中运行