我正在使用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()并将该调用另存为FutureStream,然后在build()函数的StreamBuilder上使用该变量。这样,Future / Stream仅创建一次。

同样,您没有发布任何代码,因此我在这里承担很多责任。

关于firebase - 如何使StreamBuilder停止监听事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61904997/

10-12 06:28