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

Posted

技术标签:

【中文标题】Flutter - 使用依赖注入时何时关闭流【英文标题】:Flutter - When to close streams when using dependency injection 【发布时间】:2020-01-21 09:46:01 【问题描述】:

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

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

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

但是,当我将提供的 MyBloc 实例注入 MyWidget 时(可能通过 MyWidget 的构造函数),我关闭了小部件层次结构更高的流,因为 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】:

这不是问题,只要创建对象的小部件在从小部件树中移除时正确处置它。

事实上,后代应该在他们的参数上调用dispose

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

【讨论】:

以上是关于Flutter - 使用依赖注入时何时关闭流的主要内容,如果未能解决你的问题,请参考以下文章

Spring(06)IOC 依赖注

当 API 关闭时,Xamarin 表单依赖注入 HttpClient 超时不起作用

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

有啥方法可以将提供者依赖注入到 Flutter 中的普通类中?

laravel依赖注入浅析

我应该使用哪个依赖注入工具? [关闭]