doOnCancel() не срабатывает при вызове StreamController#close()

Я передаю Observable поток (rxDart) в StreamBuilder для прослушивания и обновления пользовательского интерфейса, а после этого, когда я закрываю поток в onDispose(). Я ожидал, что закрывающий поток вызовет doOnClose() побочный эффект моего наблюдаемого, но, к сожалению, doOnClose() наблюдаемого не вызывается,

Что я делаю:

Observable<dynamic> observerStream() {
    return Observable.fromFuture(someFunction())
      return data;
    })
    .doOnCancel(() {
        print('*** NOT GETTING CALLED ***');  
    })
.asBroadcastStream();

Внутри виджета

StreamController _controller = StreamController<dynamic>();

@override
void initState() {
  super.initState();
  _controller?.addStream(observerStream());
}

return StreamBuilder(
  stream: _controller.stream,
  builder: (context, snapshot) {
    return body(snapshot.data);
  },
);

@override
void dispose() { 
  _controller?.close();
  super.dispose();
}

В соответствии с приведенным выше кодом doOnClose() должен вызываться, но он не вызывается!!!

Любая идея о таком поведении или сценарии?


person Uttam Panchasara    schedule 14.10.2019    source источник


Ответы (1)


.asBroadcastStream требует, чтобы разработчик явно обрабатывал случай отсутствия слушателей, например .asBroadcastStream( onCancel: (sub) => sub.cancel() ).

См. https://stackoverflow.com/a/60470366/8696915 для получения дополнительной информации.

person Richard Johnson    schedule 29.02.2020