在某些情况下,经常创建和关闭带有各自 BLoC 的屏幕。所以我有点担心在这个过程中创建的 Streams 实例的内存安全,因为它们似乎没有被放置在某个地方或者它们是否是 GC-ed。这显然取决于 DART 库和 flutter 的具体实现。所以如果你知道他们的行为,请告诉我。
这些是我遇到的一些场景。
我想知道是否有必要重写 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
android-studio - 如何在 Android Studio 中创建目录文件夹?
android - Flutter 随机崩溃并删除 Flutter 文件
dart - Flutter - 在 BottomNavigationBar 中显示一个 Popup
firebase - 当应用程序处于前台时,Flutter FCM 推送通知不起作用
firebase - Flutter 多个 Firestore 查询