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

时间:2018-11-20 10:54:16

标签: dart flutter rxdart

在某些情况下,经常会创建和关闭带有各自BLoC的屏幕。因此,我有点担心在此过程中创建的Streams实例的内存安全性,因为似乎它们没有放置在某个地方或它们是否经过GC处理。显然,这取决于DART库和Flutter的特定实现。因此,如果您知道他们的行为,请告诉我。

这些是我遇到的一些情况。

  1. 类似于多标签浏览器的应用程序。
  2. 通过屏幕导航。 (但这并不有害。)
  3. 对话框中有BLoC时,
  4. showDialog()senarios。这是一种更为常见的说法。应用程序中可能经常弹出很多对话框。

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

1 个答案:

答案 0 :(得分:4)

只要不再使用流,就可以正确清除它们。 事实是,仅仅删除变量不足以确保未使用它。它仍然可以在后台运行。

您需要调用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) {
    // ...
  }
}