Dart 为什么我能';不能立即取消'StreamGroup'订阅

Dart 为什么我能';不能立即取消'StreamGroup'订阅,dart,Dart,我想从多个流源收听事件,直到收到停止事件。之后,我想退订。我预计,takeWhile会取消订阅,但在等待Future完成之前,它似乎不起作用 下面是我的代码: void main()异步{ 等待StreamGroup.merge([[u test2(),[u test1()])) .takeWhile((元素)=>元素!=-1) .forEach((元素){ 打印('Element=$Element'); }); 打印(‘完成’); } 流_test1()异步*{ 对于(变量i=0;i_Sub

我想从多个
源收听事件,直到收到停止事件。之后,我想退订。我预计,
takeWhile
会取消订阅,但在等待
Future
完成之前,它似乎不起作用

下面是我的代码:


void main()异步{
等待StreamGroup.merge([[u test2(),[u test1()]))
.takeWhile((元素)=>元素!=-1)
.forEach((元素){
打印('Element=$Element');
});
打印(‘完成’);
}
流_test1()异步*{
对于(变量i=0;i<5;i++){
等待未来。延迟(持续时间(秒:1));
产量一;
}
产量-1;
}
流_test2()异步*{
等待longUserAction();
对于(变量i=10;i<20;i++){
等待未来。延迟(持续时间(秒:1));
产量一;
}
产量-1;
}
Future longUserAction()=>Future.delayed(持续时间(秒:20));
我除了:

Element=0
Element=1
Element=2
Element=3
Element=4
Finished!
我得到的是:

Element=0
Element=1
Element=2
Element=3
Element=4
*long pause*
Finished!

以下是我的案例的解决方案:

class\u SubscriptionData{
最终流源;
最终认购;
bool isClosed=false;
_SubscriptionData(this.source,this.subscription);
作废取消订阅(){
如果(!isClosed){
isClosed=true;
订阅。取消();
}
}
}
类控制器{
最终StreamController _controller=StreamController();
int workingstreamscont=0;
_MergeStreamController(列表源、布尔函数(T)谓词){
workingstreamscont=sources.length;
最终列表订阅=源
.map((source)=>_SubscriptionData(source,source.listen(null)))
.toList(可增长:假);
void cancelAll(){
订阅。forEach((子){
sub.cancelSubscription();
});
}
subscriptions.forEach((子数据){
subdata.subscription.onData((数据){
if(!谓词(数据)){
WorkingStreamScont=0;
_controller.close();
取消全部();
}否则如果(!\u controller.isClosed)\u controller.add(数据);
});
subdata.subscription.onDone(){
如果(-)-工作流程
_MergeStreamController(sources,takeWhile)。\u controller.stream;
void main()异步{
等候(
[_test2(),_test1(),_test3()],(element)=>element!=-1)
.forEach((元素){
打印('Element=$Element');
});
打印(‘完成’);
}
流_test1()异步*{
对于(变量i=0;i<5;i++){
等待未来。延迟(持续时间(秒:1));
产量一;
}
产量-1;
}
流_test2()异步*{
等待longUserAction();
对于(变量i=10;i<20;i++){
等待未来。延迟(持续时间(秒:1));
产量一;
}
产量-1;
}
流_test3()异步*{
return;//模拟一个空流
}
Future longUserAction()=>Future.delayed(持续时间(秒:20));
输出:

Element=0
Element=1
Element=2
Element=3
Element=4
Finished!

可能是因为你有一个等待20秒的
未来
。@ChristopherMoore,但我不想等待20秒。我想在
takeWhile
谓词满足时立即取消