Flutter-使用依赖项注入时何时关闭流

时间:2019-09-20 10:28:27

标签: flutter dart dependency-injection stream bloc

如果我在MyWidget中实例化BLoC,通常会使用StatefulWidget并通过dispose方法关闭流,如下所示:

class _MyWidgetState extends State<MyWidget> {
  ...
  @override
  void initState() {
    // ...
    bloc = MyBloc()
  }

  @override
  void dispose() {
    bloc.stream.close();
    // ...
  }
 ...
}

但是,当我将提供的MyBloc实例注入MyWidget(可能通过MyWidget的构造函数)时,由于小部件层次结构中的 MyWidget不会获得带有新Stream的新MyBloc实例,因此我将小部件层次结构上的流关闭了。用户导航离开MyWidget并返回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;
    // ...
  }
}

这会导致内存泄漏吗?

1 个答案:

答案 0 :(得分:1)

这不是问题,只要创建对象的窗口小部件从窗口小部件树中删除后就可以正确处理它。

实际上,后代不应该对其参数调用dispose

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