关于dart:Flutter-关闭窗口小部件时,BloC流实例是否会导致内存泄漏?

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

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

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

  • 类似于浏览器的多选项卡应用程序。
  • 通过屏幕导航。 (但这不是那么有害。)
  • 对话框中有BLoC时显示showDialog()。 这是一种更为常见的说法。 应用中可能经常弹出很多对话框。
  • 我想知道是否有必要重写dispose()函数并显式关闭BLoCProvider中的所有流。 似乎现有的教程没有提到它。


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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    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) {
        // ...
      }
    }