我有一种情况,我期待Stream
中的单个值,但因为它是浏览器提供的值,所以我不能简单地调用streamSub.single
。目前,我正在创建一个明确的StreamController
,以便我可以轻松地从中生成Future
,同时保证它只会获得一个响应。然而,这最终会比我期望设置的开销更多,让我觉得我错过了一些东西。目前的代码如下:
StreamController<String> streamCtrlr = new StreamController<String>();
var popup = window.open(targetUrl, "Auth Window");
//The popup above will call window.opener.postMessage, so listen for messages
StreamSubscription sub = window.onMessage.listen(null);
sub.onData((Event){
/* Logic goes here */
sub.cancel();
popup.close();
streamCtrlr.add(Event.data);
streamCtrlr.close();
});
return streamCtrlr.stream.single;
如何重写,以便不需要中介StreamController
?
答案 0 :(得分:2)
为什么你不能依赖于streamSub.single
?是因为可能有多条消息?
您的示例代码会在所有情况下选择第一个事件,因此要获得相同的行为,您可以使用window.onMessage.first
代替window.onMessage.single
。
如果没有第一个事件,它仍会导致错误(但我不认为DOM事件处理程序会发生这种情况 - 它们永远不会发送完成事件),否则它会给出一个完成第一个事件的未来事件
您还想提取事件数据,因此您可能需要:
return window.onMessage.first.then((event) {
/* Logic goes here */
popup.close();
return event.data;
});