2013-04-17 61 views
2

在m4更新後,StreamController.broadcast()被移除,我發現asBroadcastStream不能被多次調用。這意味着你必須存儲流,就像在Ugly類中一樣,而不是像Pretty類那樣只使用getter。asBroadcastStream不能被多次調用

這是設計,還是我做錯了?

void main() { 
    Pretty p = new Pretty(); 

    //This does not work. 
    p.onChange.listen((n) => print(n)); 
    //This second call throws: "Bad state: Stream already has subscriber". Why? 
    p.onChange.listen((n) => print(n)); 

    //This does work. 
    Ugly u = new Ugly(); 
    u.onChange.listen((n) => print(n)); 
    u.onChange.listen((n) => print(n)); 
} 

class Pretty{ 
    StreamController<int> _streamCtrl = new StreamController<int>(); 
    Stream<int> get onChange => _streamCtrl.stream.asBroadcastStream(); 
} 

class Ugly{ 
    StreamController<int> _streamCtrl = new StreamController<int>(); 
    Stream<int> _onChange; 
    Stream<int> get onChange => _onChange; 

    Ugly(){ 
    _onChange = _streamCtrl.stream.asBroadcastStream(); 
    } 
} 

回答

1

目前沒有更好的方法來做到這一點。

下面是從郵件列表線程,擁有更多的信息:https://groups.google.com/a/dartlang.org/forum/#!searchin/misc/asBroadcastStream%7Csort:relevance/misc/KJrKH5-bNkU/CjpIpEP_EpgJ

在電子郵件中,我說:

隨着r21499我們去掉了StreamController.broadcast構造。

StreamController.broadcast流具有令人討厭的屬性,可能 容易導致錯過的事件和類似的難以調試的條件。我們 最初爲html庫添加了這個類,但最終並不需要 。通過刪除這個類,我們可以爲Streams提供一個更清潔的 合同。我們仍然保留asBroadcastStream方法。它的 行爲與 StreamController.broadcast中的行爲稍有不同並且更加清晰。在大多數情況下,如果您需要附加多個偵聽器,則可以嘗試遷移到 asBroadcastStream

+0

我猜這是鏢1.0的呢?我想我在某處讀到M4核心庫被認爲是穩定的,所以我們現在「堅持」了這一點?我絕對可以忍受這個醜陋的解決方案,但是那個漂亮的解決方案實在太棒了。 :D –

+0

我們仍然可以做不間斷的更改。 –