为什么Dart广播流不接受多个侦听呼叫 导入'dart:async'; void main(){ var dog=新的dog(); 展示猫(狗); 打印(“外部”); 狗吠(); } 班猫{ 无效失控(msg){ 打印($msg我要逃跑了!); } } 类狗{ var_barkController=新的StreamController(); Stream get ONBACK=>\u barkController.Stream.asBroadcastStream(); 空树皮(){ _添加(“纬”); } } 猫(狗){ var cat=新cat(); 狗.吠叫.听((事件)=>猫.逃跑(事件)); dog.onBark.listen((事件)=>print(事件));//为什么异常:流已经有订阅服务器了? 打印(“内部”); 狗吠(); }

为什么Dart广播流不接受多个侦听呼叫 导入'dart:async'; void main(){ var dog=新的dog(); 展示猫(狗); 打印(“外部”); 狗吠(); } 班猫{ 无效失控(msg){ 打印($msg我要逃跑了!); } } 类狗{ var_barkController=新的StreamController(); Stream get ONBACK=>\u barkController.Stream.asBroadcastStream(); 空树皮(){ _添加(“纬”); } } 猫(狗){ var cat=新cat(); 狗.吠叫.听((事件)=>猫.逃跑(事件)); dog.onBark.listen((事件)=>print(事件));//为什么异常:流已经有订阅服务器了? 打印(“内部”); 狗吠(); },stream,dart,event-listener,Stream,Dart,Event Listener,为什么第二个dog.onBark.listen调用生成异常:流已经有订户了?我认为广播流可能有很多订户?getteronBark在\u barkController.stream上第二次调用asBroadcastStream。新创建的广播流将尝试绑定到\u barkController.stream,但将失败,因为已经有侦听器 因此是:广播流可能有多个侦听器,但是不能对单个订阅流多次调用asBroadcastStream方法 一种解决方案是缓存第一个asBroadcastStream的结果。这是

为什么第二个
dog.onBark.listen
调用生成异常:流已经有订户了?我认为广播流可能有很多订户?

getter
onBark
\u barkController.stream
上第二次调用
asBroadcastStream
。新创建的广播流将尝试绑定到
\u barkController.stream
,但将失败,因为已经有侦听器

因此是:广播流可能有多个侦听器,但是不能对单个订阅流多次调用
asBroadcastStream
方法


一种解决方案是缓存第一个
asBroadcastStream

的结果。这是否意味着,如果没有两个备份类字段并在ctor中显式实例化它们,或者让getter实现为
if(x==null)x=ctl.stream.asBroadcastStream(),就不可能设置这样的事件源;返回x?在核心API中找不到任何包装这种尴尬模式的东西。目前(截至2013年5月)没有任何好的替代品。这是我们正在调查的事情。