Flutter - BLoC 流实例会在关闭小部件时导致内存泄漏吗?

Flutter - Will BLoC stream instances cause memory leak when a widget is closed?

在某些情况下,会频繁创建和关闭带有各自 BLoC 的屏幕。所以我有点担心在此过程中创建的 Streams 实例的内存安全性,因为它们似乎没有被放置在某个地方或者它们是否被 GC-ed。这显然取决于 DART 库和 flutter 的具体实现。所以如果你知道他们的行为,请告诉我。

这些是我遇到的一些场景。

  1. 类似多标签浏览器的应用程序。
  2. 通过屏幕导航。 (但这并没有那么有害。)
  3. 当对话框中有 BLoC 时,showDialog() 场景。这是一个更为常见的场景。应用程序中可能经常弹出很多对话框。

我想知道是否有必要重写 dispose() 函数并显式关闭 BLoCProvider 中的所有流。好像现有的教程都没有提到。

只要不再使用流,它们就会被正确清理。 问题是,简单地删除变量不足以确保它未被使用。它仍然可以 运行 在后台。

您需要调用 Sink.close() 以使其停止关联的 StreamController,以确保稍后 GC 可以释放资源。

为此,您必须使用 StatefulWidget.dispose 方法:

abstract class MyBloc {
  Sink foo;
  Sink bar;
}

class MyWiget extends StatefulWidget {
  @override
  _MyWigetState createState() => _MyWigetState();
}

class _MyWigetState extends State<MyWiget> {
  MyBloc bloc;

  @override
  void dispose() {
    bloc.bar.close();
    bloc.foo.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // ...
  }
}