Dart Stream. ASBroadcastStream утечка памяти - PullRequest
0 голосов
/ 01 марта 2020

В нашем приложении Flutter есть утечки памяти и не закрывающиеся потоки. Мы проследили исходный код до кода, такого как:

Rx.combineLatest(...).asBroadcastStream()

Результат RxDart .combineLatest() - поток с одной подпиской. Добавление .asBroadcastStream() делает поток удобным для доступа к нашим различным дисплеям Flutter. Однако, когда эти дисплеи закрыты, объединяемые потоки все еще активны.

1 Ответ

0 голосов
/ 01 марта 2020

Из документации .asBroadcastStream():

Возвращенный поток подпишется на этот поток при добавлении его первого подписчика, а будет оставаться подписанным до тех пор, пока этот поток не закончится или обратный вызов не будет отменен подписка .

Таким образом, по замыслу поток существует до явной отмены. Чтобы отменить подписку, когда последний слушатель отменяет, используйте:

Rx.combineLatest(...).asBroadcastStream( onCancel: (sub) => sub.cancel() )

Дальнейшее обсуждение в Stream.asBroadcastStream - Легко вызывать утечки, что является обоснованием? # 26686

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...