我是不是需要取消 Stream<QuerySnapshot> (颤振)

Posted

技术标签:

【中文标题】我是不是需要取消 Stream<QuerySnapshot> (颤振)【英文标题】:Do I need to cancel Stream<QuerySnapshot> (flutter)我是否需要取消 Stream<QuerySnapshot> (颤振) 【发布时间】:2020-05-22 01:20:39 【问题描述】:

我正在听 Firestore 中的一组文档(作为聊天应用程序的一部分)。我通过使用一个服务来做到这一点,该服务创建一个Stream&lt;QuerySnapshot&gt;,如下所示:

_snapshots$ = Firestore.instance.collection('messages').orderBy('date',descending: false).snapshots()

然后我创建一个 StreamBuilder 如下:

return StreamBuilder<List<Message>>(
        stream: widget.chatService.messages$,
        builder: (context, snapshot) => (snapshot.hasData)
...

我想知道是否需要在包含 StreamBuilder 小部件的 dispose 方法中分离此流。我对 Streams 和 StreamBuilders 了解不多,所以我不知道该怎么做,但我真的很想避免任何内存泄漏。

【问题讨论】:

【参考方案1】:

如果我错了,有人应该纠正我,但我认为这就是 StreamBuilder 类的重点:Looking at the source code,它似乎自然而然地取消订阅 dispose()

【讨论】:

【参考方案2】:

你担心这个是对的,但是StreamBuilder 会为你完成所有繁重的工作,包括订阅和取消订阅,所以你不必担心如果StreamBuilder 是唯一的地方正在收听您的Stream 的位置。 但是,如果您自己正在收听Stream,那么您必须在StatefulWidget dispose 方法上订阅cancel

【讨论】:

以上是关于我是不是需要取消 Stream<QuerySnapshot> (颤振)的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何检查 Stream<T> 是不是已排序?

「Python实用技巧」mysql-stream更新通知

Flutter 类型“Future<dynamic>”不是“Stream<PostModel>”类型的子类型?

如何在 Navigator.of(context).push(....) 之后临时取消订阅 Stream?

如何取消颤振/飞镖集团中的“等待”

facebook api:请求publish_stream是不是需要用户每次登录时的确认