我正在使用StreamBuilder来访问我的Firestore数据库的内容,并为此类内容创建列表图块列表。我的问题是,每当我单击列表图块时,就像我的StreamBuilder方法被再次调用,并使列表中所需的列表图块数量翻倍(因为我正在使用List.add()方法)。
如何使StreamBuilders停止“重建”或“监听”?我对Dart还是很陌生,所以我不确定该如何处理。
这是不断重复的代码。 (出于本文的目的,我已经审查了包含“...”的地方的一些信息):
Widget showContent(BuildContext context) {
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
}
最佳答案
您没有发布任何代码,因此我将不得不猜测您的代码如何工作。
我假设您在Firebase
内部使用Stream
StreamBuilder.stream
,因此每次调用build
时,都会反复调用此Firebase
调用。build()
函数应该没有副作用,您应该在Firebase
上调用initState()
并将该调用另存为Future
或Stream
,然后在build()
函数的StreamBuilder
上使用该变量。这样,Future
/ Stream
仅创建一次。
同样,您没有发布任何代码,因此我在这里承担很多责任。
关于firebase - 如何使StreamBuilder停止监听事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61904997/