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

在某些情况下,经常创建和关闭带有各自 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) {
    // ...
  }
}

https://stackoverflow.com/questions/53391431/

相关文章:

android - flutter Assets 错误 : EXCEPTION CAUGHT BY

dart - flutter 模糊叠加

android-studio - 如何在 Android Studio 中创建目录文件夹?

android - Flutter 随机崩溃并删除 Flutter 文件

android - Flutter-ListView 溢出

dart - Flutter - 在 BottomNavigationBar 中显示一个 Popup

firebase - 当应用程序处于前台时,Flutter FCM 推送通知不起作用

firebase - Flutter 多个 Firestore 查询

flutter - 在 Flutter 中,如何在某个 (x,y) 位置找到小部件?

dart - Flutter:禁用应用程序的屏幕截图