gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:40:21 25 4
gpt4 key购买 nike

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

关于dart - Flutter - 关闭小部件时 BLoC 流实例会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com