Merge pull request #1957 from dart-lang/stream-channel-mixin
make StreamChannelMixin an abstract mixin class
diff --git a/pkgs/stream_channel/CHANGELOG.md b/pkgs/stream_channel/CHANGELOG.md
index 30f7d32..9dd3990 100644
--- a/pkgs/stream_channel/CHANGELOG.md
+++ b/pkgs/stream_channel/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.4
+
+* Fix `StreamChannelMixin` so that it can be used as a mixin again.
+
## 2.1.3
* Require Dart 3.3
diff --git a/pkgs/stream_channel/lib/stream_channel.dart b/pkgs/stream_channel/lib/stream_channel.dart
index 85f9a97..8e53096 100644
--- a/pkgs/stream_channel/lib/stream_channel.dart
+++ b/pkgs/stream_channel/lib/stream_channel.dart
@@ -148,7 +148,7 @@
/// A mixin that implements the instance methods of [StreamChannel] in terms of
/// [stream] and [sink].
-abstract class StreamChannelMixin<T> implements StreamChannel<T> {
+abstract mixin class StreamChannelMixin<T> implements StreamChannel<T> {
@override
void pipe(StreamChannel<T> other) {
stream.pipe(other.sink);
diff --git a/pkgs/stream_channel/pubspec.yaml b/pkgs/stream_channel/pubspec.yaml
index eec8c1b..f050fca 100644
--- a/pkgs/stream_channel/pubspec.yaml
+++ b/pkgs/stream_channel/pubspec.yaml
@@ -1,5 +1,5 @@
name: stream_channel
-version: 2.1.3
+version: 2.1.4
description: >-
An abstraction for two-way communication channels based on the Dart Stream
class.
diff --git a/pkgs/stream_channel/test/stream_channel_test.dart b/pkgs/stream_channel/test/stream_channel_test.dart
index c44b6ab..166671d 100644
--- a/pkgs/stream_channel/test/stream_channel_test.dart
+++ b/pkgs/stream_channel/test/stream_channel_test.dart
@@ -135,4 +135,46 @@
changed.sink.add(10);
changed.sink.close();
});
+
+ group('StreamChannelMixin', () {
+ test('can be used as a mixin', () async {
+ var channel = StreamChannelMixinAsMixin<int>();
+ expect(channel.stream, emitsInOrder([1, 2, 3]));
+ channel.sink
+ ..add(1)
+ ..add(2)
+ ..add(3);
+ await channel.controller.close();
+ });
+
+ test('can be extended', () async {
+ var channel = StreamChannelMixinAsSuperclass<int>();
+ expect(channel.stream, emitsInOrder([1, 2, 3]));
+ channel.sink
+ ..add(1)
+ ..add(2)
+ ..add(3);
+ await channel.controller.close();
+ });
+ });
+}
+
+class StreamChannelMixinAsMixin<T> with StreamChannelMixin<T> {
+ final controller = StreamController<T>();
+
+ @override
+ StreamSink<T> get sink => controller.sink;
+
+ @override
+ Stream<T> get stream => controller.stream;
+}
+
+class StreamChannelMixinAsSuperclass<T> extends StreamChannelMixin<T> {
+ final controller = StreamController<T>();
+
+ @override
+ StreamSink<T> get sink => controller.sink;
+
+ @override
+ Stream<T> get stream => controller.stream;
}