首页 > 解决方案 > 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
}

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


一种方法是在向其中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(...);
      }

推荐阅读