在某些情况下,经常会创建和关闭带有各自BLoC的屏幕。因此,我有点担心在此过程中创建的Streams实例的内存安全性,因为似乎它们没有放置在某个地方或它们是否经过GC处理。显然,这取决于DART库和Flutter的特定实现。因此,如果您知道他们的行为,请告诉我。
这些是我遇到的一些情况。
我想知道是否有必要重写dispose()函数并显式关闭BLoCProvider中的所有流。似乎现有的教程没有提到它。
答案 0 :(得分:4)
只要不再使用流,就可以正确清除它们。 事实是,仅仅删除变量不足以确保未使用它。它仍然可以在后台运行。
您需要调用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) {
// ...
}
}