Flutter - BLoC 流实例会在关闭小部件时导致内存泄漏吗?
Flutter - Will BLoC stream instances cause memory leak when a widget is closed?
在某些情况下,会频繁创建和关闭带有各自 BLoC 的屏幕。所以我有点担心在此过程中创建的 Streams 实例的内存安全性,因为它们似乎没有被放置在某个地方或者它们是否被 GC-ed。这显然取决于 DART 库和 flutter 的具体实现。所以如果你知道他们的行为,请告诉我。
这些是我遇到的一些场景。
- 类似多标签浏览器的应用程序。
- 通过屏幕导航。 (但这并没有那么有害。)
- 当对话框中有 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) {
// ...
}
}
在某些情况下,会频繁创建和关闭带有各自 BLoC 的屏幕。所以我有点担心在此过程中创建的 Streams 实例的内存安全性,因为它们似乎没有被放置在某个地方或者它们是否被 GC-ed。这显然取决于 DART 库和 flutter 的具体实现。所以如果你知道他们的行为,请告诉我。
这些是我遇到的一些场景。
- 类似多标签浏览器的应用程序。
- 通过屏幕导航。 (但这并没有那么有害。)
- 当对话框中有 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) {
// ...
}
}