我需要取消 Stream<QuerySnapshot> (flutter)

gol*_*oom 3 memory mobile flutter google-cloud-firestore stream-builder

我正在听 firestore 中的一系列文档(作为聊天应用程序的一部分)。我是通过使用服务来做到这一点的,该服务创建Stream<QuerySnapshot>如下:

_snapshots$ = Firestore.instance.collection('messages').orderBy('date',descending: false).snapshots()
Run Code Online (Sandbox Code Playgroud)

然后我创建一个 StreamBuilder 如下:

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

我想知道是否需要在包含StreamBuilder小部件的 dispose 方法中分离此流。我对 Streams 和 StreamBuilders 不太了解,所以我不确定如何做到这一点,但我真的想避免任何内存泄漏。

mFe*_*ein 6

您担心这一点是正确的,但StreamBuilder会为您完成所有繁重的工作,包括订阅和取消订阅,因此您不必担心它是否StreamBuilder是您Stream正在收听的唯一地方。但是,如果您正在聆听Stream自己的声音,那么您将不得不cancel订阅一个StatefulWidget dispose方法。

  • 对于那些想知道的人来说,它就像“最终订阅=stream.listen(...);”然后“subscription.cancel();”。我在“Provider”中使用这种方法,并将 future 传递给小部件(而不是流)。因此,提供商根据其他条件控制重建。 (2认同)