Dart stream .asBroadcastStream утечка памяти

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

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

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


person Richard Johnson    schedule 29.02.2020    source источник


Ответы (1)


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

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

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

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

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

person Richard Johnson    schedule 29.02.2020