Flutter - 使用依赖注入时何时关闭流
Flutter - When to close streams when using dependency injection
如果我在 MyWidget 中实例化 BLoC,我通常会使用 StatefulWidget
并在 dispose
方法中关闭流,如下所示:
class _MyWidgetState extends State<MyWidget> {
...
@override
void initState() {
// ...
bloc = MyBloc()
}
@override
void dispose() {
bloc.stream.close();
// ...
}
...
}
但是,当我将提供的 MyBloc 实例注入 MyWidget 时(可能通过 MyWidget 的构造函数),我关闭了小部件层次结构中更高层的流,因为 MyWidget 没有获得 MyBloc 的新实例当用户导航离开和返回 MyWidget.
时的新流
class MyWidget extends StatefulWidget {
final MyBloc bloc;
MyWidget(this.bloc) ... ;
..
}
class _MyWidgetState extends State<MyWidget> {
...
@override
void dispose() {
// Not closing stream here anymore. Closing higher up because
// I don't get a fresh instance when user comes back here;
// ...
}
}
这会导致内存泄漏吗?
这不是问题,只要创建对象的小部件在从小部件树中删除时正确处置它即可。
事实上,后代应该不调用dispose
他们的参数。
这样做是一种反模式,因为后代没有其参数的所有权,因此不应对其进行任何修改。
如果我在 MyWidget 中实例化 BLoC,我通常会使用 StatefulWidget
并在 dispose
方法中关闭流,如下所示:
class _MyWidgetState extends State<MyWidget> {
...
@override
void initState() {
// ...
bloc = MyBloc()
}
@override
void dispose() {
bloc.stream.close();
// ...
}
...
}
但是,当我将提供的 MyBloc 实例注入 MyWidget 时(可能通过 MyWidget 的构造函数),我关闭了小部件层次结构中更高层的流,因为 MyWidget 没有获得 MyBloc 的新实例当用户导航离开和返回 MyWidget.
时的新流class MyWidget extends StatefulWidget {
final MyBloc bloc;
MyWidget(this.bloc) ... ;
..
}
class _MyWidgetState extends State<MyWidget> {
...
@override
void dispose() {
// Not closing stream here anymore. Closing higher up because
// I don't get a fresh instance when user comes back here;
// ...
}
}
这会导致内存泄漏吗?
这不是问题,只要创建对象的小部件在从小部件树中删除时正确处置它即可。
事实上,后代应该不调用dispose
他们的参数。
这样做是一种反模式,因为后代没有其参数的所有权,因此不应对其进行任何修改。