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他们的参数。

这样做是一种反模式,因为后代没有其参数的所有权,因此不应对其进行任何修改。