Flutter - Will BLoC stream instances cause memory leak when a widget is closed?
在某些情况下,经常会创建和关闭带有各自BLoC的屏幕。 因此,我有点担心在此过程中创建的Streams实例的内存安全性,因为似乎它们没有放置在某个地方或它们是否经过GC处理。 这显然取决于DART库和Flutter的特定实现。 因此,如果您了解他们的行为,请告诉我。
这些是我遇到的一些情况。
类似于浏览器的多选项卡应用程序。
通过屏幕导航。 (但这不是那么有害。)
对话框中有BLoC时显示showDialog()。 这是一种更为常见的说法。 应用中可能经常弹出很多对话框。
我想知道是否有必要重写dispose()函数并显式关闭BLoCProvider中的所有流。 似乎现有的教程没有提到它。
只要不再使用流,就可以正确清理它们。
问题是,仅仅删除变量不足以确保未使用它。 它仍然可以在后台运行。
您需要调用Sink.close(),以使其停止关联的StreamController,以确保以后可以由GC释放资源。
为此,您必须使用StatefulWidget.dispose方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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) {
// ...
}
} |
-
您认为通过接口访问块总是比使用有效使用继承的窗口小部件的提供程序更好吗?
-
@ stt106是什么意思?接口不会替换提供程序,提供程序也不会替换接口
-
会闲着和你聊天。
-
哦谢谢。因此,似乎我们需要在dispose()函数中关闭Streams。但是此解决方案还有其他一些问题。 InheritedWidget具有自己的生命周期。我对此不太确定,但是用户或Flutter引擎是否有可能触发了InheritedWidget的意外处置?因为我已经在一些教程中看到BLoC成为共享的,并且InheritedWidget在所有地方创建和重新分配。
-
您需要一个Inheritedwidget和一个StatefulWidget
-
@RmiRousselet,当我处理然后消失时,我转到另一个屏幕回到上一个屏幕,但是现在该块为空
-
@rxlky您将要使用rxdart和BehaviorSubject。
-
@RmiRousselet哇,正确的BehaviorSubject使它再次看起来很棒,但是当我滑动回到初始屏幕时出现小故障,然后记录错误说...。"错误的状态:调用close后无法添加新事件",但它已加载。任何的想法?
-
您在控制器上调用了close()
-
@RmiRousselet对不起,我不明白。我没有控制器。实际上,它是具有自己的状态的标签栏。我也尝试调用init并从父页面处置bloc,同样的事情也会发生。任何的想法?
-
您能独自提出一个问题吗?评论真的不是正确的地方
-
@RmiRousselet好的,我在这里得到了答案stackoverflow.com/questions/52191451/我打电话给Arain等待,然后一切正常