7

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

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

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

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

4

1 回答 1

9

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

您需要调用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) {
    // ...
  }
}
于 2018-11-20T11:03:07.790 回答