Index: sdk/lib/async/stream_controller.dart |
diff --git a/sdk/lib/async/stream_controller.dart b/sdk/lib/async/stream_controller.dart |
index 5764ecdd2102e6dc975a6c1ca3d81a0ed4db3ad4..26bbb14706cb55d971db51bce691f7f41a0f6183 100644 |
--- a/sdk/lib/async/stream_controller.dart |
+++ b/sdk/lib/async/stream_controller.dart |
@@ -77,12 +77,6 @@ abstract class StreamController<T> implements StreamSink<T> { |
void onResume(), |
onCancel(), |
bool sync: false}) { |
- if (onListen == null && onPause == null && |
- onResume == null && onCancel == null) { |
- return sync |
- ? new _NoCallbackSyncStreamController<T>() |
- : new _NoCallbackAsyncStreamController<T>(); |
- } |
return sync |
? new _SyncStreamController<T>(onListen, onPause, onResume, onCancel) |
: new _AsyncStreamController<T>(onListen, onPause, onResume, onCancel); |
@@ -139,6 +133,42 @@ abstract class StreamController<T> implements StreamSink<T> { |
} |
/** |
+ * Sets the callback which is called when the stream is listened to. |
+ * |
+ * This overrides the previous callback, or clears it if the [onListenHandler] |
+ * is `null`. |
+ */ |
+ void set onListen(void onListenHandler()); |
nweiz
2015/07/17 20:40:16
It's kind of weird that these are setters, whereas
Lasse Reichstein Nielsen
2015/08/05 09:08:45
It is annoying that we didn't go for setters in St
nweiz
2015/08/06 01:02:13
I talked to Bob about this, and he pointed out tha
Lasse Reichstein Nielsen
2015/08/06 07:00:41
Well, it's quite symmetric - you have read-only fi
floitsch
2015/08/06 09:28:12
In this case I wouldn't onListen to setOnListen. I
floitsch
2015/08/06 09:28:12
I actually disagree. Sometimes a "setX" method is
Lasse Reichstein Nielsen
2015/08/06 14:09:40
I think we did screw up that particular type of na
nweiz
2015/08/06 19:56:12
I'm fine with these being setters as long as there
|
+ |
+ /** |
+ * Sets the callback which is called when the stream is paused. |
+ * |
+ * This overrides the previous callback, or clears it if the [onPauseHandler] |
+ * is `null`. |
+ * |
+ * Pause related callbacks are not supported on broadcast stream controllers. |
+ */ |
+ void set onPause(void onPauseHandler()); |
+ |
+ /** |
+ * Sets the callback which is called when the stream is resumed. |
+ * |
+ * This overrides the previous callback, or clears it if the [onResumeHandler] |
+ * is `null`. |
+ * |
+ * Pause related callbacks are not supported on broadcast stream controllers. |
+ */ |
+ void set onResume(void onResumeHandler()); |
+ |
+ /** |
+ * Sets the callback which is called when the stream is canceled. |
+ * |
+ * This overrides the previous callback, or clears it if the [onCancelHandler] |
+ * is `null`. |
+ */ |
+ void set onCancel(onCancelHandler()); |
+ |
+ /** |
* Returns a view of this object that only exposes the [StreamSink] interface. |
*/ |
StreamSink<T> get sink; |
@@ -383,12 +413,23 @@ abstract class _StreamController<T> implements StreamController<T>, |
// accessed earlier, or if close is called before subscribing. |
_Future _doneFuture; |
- _StreamController(); |
+ _NotificationHandler _onListen; |
+ _NotificationHandler _onPause; |
+ _NotificationHandler _onResume; |
+ _NotificationHandler _onCancel; |
- _NotificationHandler get _onListen; |
- _NotificationHandler get _onPause; |
- _NotificationHandler get _onResume; |
- _NotificationHandler get _onCancel; |
+ _StreamController(void this._onListen(), |
+ void this._onPause(), |
+ void this._onResume(), |
+ this._onCancel()); |
+ |
+ void set onListen(void onListenHandler()) { _onListen = onListenHandler; } |
+ |
+ void set onPause(void onPauseHandler()) { _onPause = onPauseHandler; } |
+ |
+ void set onResume(void onResumeHandler()) { _onResume = onResumeHandler; } |
+ |
+ void set onCancel(onCancelHandler()) { _onCancel = onCancelHandler; } |
// Return a new stream every time. The streams are equal, but not identical. |
Stream<T> get stream => new _ControllerStream<T>(this); |
@@ -722,44 +763,11 @@ abstract class _AsyncStreamControllerDispatch<T> |
// TODO(lrn): Use common superclass for callback-controllers when VM supports |
// constructors in mixin superclasses. |
-class _AsyncStreamController<T> extends _StreamController<T> |
- with _AsyncStreamControllerDispatch<T> { |
- final _NotificationHandler _onListen; |
- final _NotificationHandler _onPause; |
- final _NotificationHandler _onResume; |
- final _NotificationHandler _onCancel; |
+class _AsyncStreamController<T> = _StreamController<T> |
+ with _AsyncStreamControllerDispatch<T>; |
- _AsyncStreamController(void this._onListen(), |
- void this._onPause(), |
- void this._onResume(), |
- this._onCancel()); |
-} |
- |
-class _SyncStreamController<T> extends _StreamController<T> |
- with _SyncStreamControllerDispatch<T> { |
- final _NotificationHandler _onListen; |
- final _NotificationHandler _onPause; |
- final _NotificationHandler _onResume; |
- final _NotificationHandler _onCancel; |
- |
- _SyncStreamController(void this._onListen(), |
- void this._onPause(), |
- void this._onResume(), |
- this._onCancel()); |
-} |
- |
-abstract class _NoCallbacks { |
- _NotificationHandler get _onListen => null; |
- _NotificationHandler get _onPause => null; |
- _NotificationHandler get _onResume => null; |
- _NotificationHandler get _onCancel => null; |
-} |
- |
-class _NoCallbackAsyncStreamController<T> = _StreamController<T> |
- with _AsyncStreamControllerDispatch<T>, _NoCallbacks; |
- |
-class _NoCallbackSyncStreamController<T> = _StreamController<T> |
- with _SyncStreamControllerDispatch<T>, _NoCallbacks; |
+class _SyncStreamController<T> = _StreamController<T> |
+ with _SyncStreamControllerDispatch<T>; |
typedef _NotificationHandler(); |