首页 > 解决方案 > 调用 StreamController#close() 时未触发 doOnCancel()

问题描述

我将Observable(rxDart)传递给以StreamBuilder侦听和更新 UI,然后当我在onDispose(). 我预计关闭流会触发doOnClose()我的 observable 的副作用,但不幸的doOnClose()是 Observable 没有被调用,

我正在做的是:

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()应该调用,但它没有被调用!!!

关于这种行为或场景的任何想法?

标签: flutterdartrxdart

解决方案


.asBroadcastStream要求开发人员明确处理没有更多侦听器的情况 - 例如.asBroadcastStream( onCancel: (sub) => sub.cancel() ).

有关更多信息,请参阅https://stackoverflow.com/a/60470366/8696915


推荐阅读