Flutter - Когда закрывать потоки при использовании внедрения зависимостей - PullRequest
0 голосов
/ 20 сентября 2019

Если я создаю экземпляр BLoC в MyWidget, я обычно использую 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;
    // ...
  }
}

Это вызывает утечку памяти?

1 Ответ

1 голос
/ 20 сентября 2019

Это не проблема, если виджет, который создал ваш объект, правильно удаляет его при удалении из дерева виджетов.

Фактически, потомки должны не вызывать dispose вих параметры.

Это анти-паттерн, так как потомок не владеет своим параметром и поэтому не должен вносить в него какие-либо изменения.

...