diff --git a/.travis.yml b/.travis.yml
index dd151e8..ccc0864 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,7 @@
 
 dart:
   - dev
-  - 2.0.0
+  - 2.2.0
 
 dart_task:
   - test: --platform vm
diff --git a/lib/async.dart b/lib/async.dart
index 25fc0fd..2af006b 100644
--- a/lib/async.dart
+++ b/lib/async.dart
@@ -2,33 +2,33 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-export "src/async_cache.dart";
-export "src/async_memoizer.dart";
-export "src/byte_collector.dart";
-export "src/cancelable_operation.dart";
-export "src/delegate/event_sink.dart";
-export "src/delegate/future.dart";
-export "src/delegate/sink.dart";
-export "src/delegate/stream.dart";
-export "src/delegate/stream_consumer.dart";
-export "src/delegate/stream_sink.dart";
-export "src/delegate/stream_subscription.dart";
-export "src/future_group.dart";
-export "src/lazy_stream.dart";
-export "src/null_stream_sink.dart";
-export "src/restartable_timer.dart";
-export "src/result/result.dart";
-export "src/result/error.dart";
-export "src/result/future.dart";
-export "src/result/value.dart";
-export "src/single_subscription_transformer.dart";
-export "src/stream_completer.dart";
-export "src/stream_group.dart";
-export "src/stream_queue.dart";
-export "src/stream_sink_completer.dart";
-export "src/stream_sink_transformer.dart";
-export "src/stream_splitter.dart";
-export "src/stream_subscription_transformer.dart";
-export "src/stream_zip.dart";
-export "src/subscription_stream.dart";
-export "src/typed_stream_transformer.dart";
+export 'src/async_cache.dart';
+export 'src/async_memoizer.dart';
+export 'src/byte_collector.dart';
+export 'src/cancelable_operation.dart';
+export 'src/delegate/event_sink.dart';
+export 'src/delegate/future.dart';
+export 'src/delegate/sink.dart';
+export 'src/delegate/stream.dart';
+export 'src/delegate/stream_consumer.dart';
+export 'src/delegate/stream_sink.dart';
+export 'src/delegate/stream_subscription.dart';
+export 'src/future_group.dart';
+export 'src/lazy_stream.dart';
+export 'src/null_stream_sink.dart';
+export 'src/restartable_timer.dart';
+export 'src/result/result.dart';
+export 'src/result/error.dart';
+export 'src/result/future.dart';
+export 'src/result/value.dart';
+export 'src/single_subscription_transformer.dart';
+export 'src/stream_completer.dart';
+export 'src/stream_group.dart';
+export 'src/stream_queue.dart';
+export 'src/stream_sink_completer.dart';
+export 'src/stream_sink_transformer.dart';
+export 'src/stream_splitter.dart';
+export 'src/stream_subscription_transformer.dart';
+export 'src/stream_zip.dart';
+export 'src/subscription_stream.dart';
+export 'src/typed_stream_transformer.dart';
diff --git a/lib/src/async_cache.dart b/lib/src/async_cache.dart
index 4b02304..e0a6f49 100644
--- a/lib/src/async_cache.dart
+++ b/lib/src/async_cache.dart
@@ -56,7 +56,7 @@
   ///
   /// If [fetch] has been called recently enough, returns its previous return
   /// value. Otherwise, runs [callback] and returns its new return value.
-  Future<T> fetch(Future<T> callback()) async {
+  Future<T> fetch(Future<T> Function() callback) async {
     if (_cachedStreamSplitter != null) {
       throw StateError('Previously used to cache via `fetchStream`');
     }
@@ -74,17 +74,15 @@
   /// If [fetchStream] has been called recently enough, returns a copy of its
   /// previous return value. Otherwise, runs [callback] and returns its new
   /// return value.
-  Stream<T> fetchStream(Stream<T> callback()) {
+  Stream<T> fetchStream(Stream<T> Function() callback) {
     if (_cachedValueFuture != null) {
       throw StateError('Previously used to cache via `fetch`');
     }
-    if (_cachedStreamSplitter == null) {
-      _cachedStreamSplitter = StreamSplitter(callback()
-          .transform(StreamTransformer.fromHandlers(handleDone: (sink) {
-        _startStaleTimer();
-        sink.close();
-      })));
-    }
+    _cachedStreamSplitter ??= StreamSplitter(
+        callback().transform(StreamTransformer.fromHandlers(handleDone: (sink) {
+      _startStaleTimer();
+      sink.close();
+    })));
     return _cachedStreamSplitter.split();
   }
 
diff --git a/lib/src/async_memoizer.dart b/lib/src/async_memoizer.dart
index 5e83400..7e545fe 100644
--- a/lib/src/async_memoizer.dart
+++ b/lib/src/async_memoizer.dart
@@ -39,7 +39,7 @@
   /// Runs the function, [computation], if it hasn't been run before.
   ///
   /// If [runOnce] has already been called, this returns the original result.
-  Future<T> runOnce(FutureOr<T> computation()) {
+  Future<T> runOnce(FutureOr<T> Function() computation) {
     if (!hasRun) _completer.complete(Future.sync(computation));
     return future;
   }
diff --git a/lib/src/byte_collector.dart b/lib/src/byte_collector.dart
index f01cc2a..0226dea 100644
--- a/lib/src/byte_collector.dart
+++ b/lib/src/byte_collector.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
-import "dart:typed_data";
-import "cancelable_operation.dart";
+import 'dart:async';
+import 'dart:typed_data';
+import 'cancelable_operation.dart';
 
 /// Collects an asynchronous sequence of byte lists into a single list of bytes.
 ///
@@ -40,10 +40,8 @@
 /// Performs all the same operations, but the final result is created
 /// by the [result] function, which has access to the stream subscription
 /// so it can cancel the operation.
-T _collectBytes<T>(
-    Stream<List<int>> source,
-    T result(
-        StreamSubscription<List<int>> subscription, Future<Uint8List> result)) {
+T _collectBytes<T>(Stream<List<int>> source,
+    T Function(StreamSubscription<List<int>>, Future<Uint8List>) result) {
   var byteLists = <List<int>>[];
   var length = 0;
   var completer = Completer<Uint8List>.sync();
@@ -63,7 +61,7 @@
 // Join a lists of bytes with a known total length into a single [Uint8List].
 Uint8List _collect(int length, List<List<int>> byteLists) {
   var result = Uint8List(length);
-  int i = 0;
+  var i = 0;
   for (var byteList in byteLists) {
     var end = i + byteList.length;
     result.setRange(i, end, byteList);
diff --git a/lib/src/cancelable_operation.dart b/lib/src/cancelable_operation.dart
index 94601c9..bac8f9b 100644
--- a/lib/src/cancelable_operation.dart
+++ b/lib/src/cancelable_operation.dart
@@ -30,7 +30,7 @@
   /// [onCancel] will be called synchronously when the operation is canceled.
   /// It's guaranteed to only be called once.
   factory CancelableOperation.fromFuture(Future<T> inner,
-      {FutureOr onCancel()}) {
+      {FutureOr Function() onCancel}) {
     var completer = CancelableCompleter<T>(onCancel: onCancel);
     completer.complete(inner);
     return completer.operation;
@@ -145,7 +145,7 @@
   ///
   /// [onCancel] will be called synchronously when the operation is canceled.
   /// It's guaranteed to only be called once.
-  CancelableCompleter({FutureOr onCancel()})
+  CancelableCompleter({FutureOr Function() onCancel})
       : _onCancel = onCancel,
         _inner = Completer<T>() {
     _operation = CancelableOperation<T>._(this);
@@ -171,7 +171,7 @@
   /// If [value] is a [Future], this will complete to the result of that
   /// [Future] once it completes.
   void complete([value]) {
-    if (_isCompleted) throw StateError("Operation already completed");
+    if (_isCompleted) throw StateError('Operation already completed');
     _isCompleted = true;
 
     if (value is! Future) {
@@ -197,7 +197,7 @@
 
   /// Completes [operation] to [error].
   void completeError(Object error, [StackTrace stackTrace]) {
-    if (_isCompleted) throw StateError("Operation already completed");
+    if (_isCompleted) throw StateError('Operation already completed');
     _isCompleted = true;
 
     if (_isCanceled) return;
diff --git a/lib/src/delegate/event_sink.dart b/lib/src/delegate/event_sink.dart
index 95d7841..977ee64 100644
--- a/lib/src/delegate/event_sink.dart
+++ b/lib/src/delegate/event_sink.dart
@@ -25,14 +25,17 @@
   static EventSink<T> typed<T>(EventSink sink) =>
       sink is EventSink<T> ? sink : DelegatingEventSink._(sink);
 
+  @override
   void add(T data) {
     _sink.add(data);
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     _sink.addError(error, stackTrace);
   }
 
+  @override
   void close() {
     _sink.close();
   }
diff --git a/lib/src/delegate/future.dart b/lib/src/delegate/future.dart
index 62ff96f..8c5dd04 100644
--- a/lib/src/delegate/future.dart
+++ b/lib/src/delegate/future.dart
@@ -21,16 +21,21 @@
   static Future<T> typed<T>(Future future) =>
       future is Future<T> ? future : future.then((v) => v as T);
 
+  @override
   Stream<T> asStream() => _future.asStream();
 
-  Future<T> catchError(Function onError, {bool test(Object error)}) =>
+  @override
+  Future<T> catchError(Function onError, {bool Function(Object error) test}) =>
       _future.catchError(onError, test: test);
 
-  Future<S> then<S>(FutureOr<S> onValue(T value), {Function onError}) =>
+  @override
+  Future<S> then<S>(FutureOr<S> Function(T) onValue, {Function onError}) =>
       _future.then(onValue, onError: onError);
 
-  Future<T> whenComplete(action()) => _future.whenComplete(action);
+  @override
+  Future<T> whenComplete(FutureOr action) => _future.whenComplete(action);
 
-  Future<T> timeout(Duration timeLimit, {onTimeout()}) =>
+  @override
+  Future<T> timeout(Duration timeLimit, {FutureOr<T> Function() onTimeout}) =>
       _future.timeout(timeLimit, onTimeout: onTimeout);
 }
diff --git a/lib/src/delegate/sink.dart b/lib/src/delegate/sink.dart
index b8ba76d..c1e01d7 100644
--- a/lib/src/delegate/sink.dart
+++ b/lib/src/delegate/sink.dart
@@ -23,10 +23,12 @@
   static Sink<T> typed<T>(Sink sink) =>
       sink is Sink<T> ? sink : DelegatingSink._(sink);
 
+  @override
   void add(T data) {
     _sink.add(data);
   }
 
+  @override
   void close() {
     _sink.close();
   }
diff --git a/lib/src/delegate/stream_consumer.dart b/lib/src/delegate/stream_consumer.dart
index ad53182..591f903 100644
--- a/lib/src/delegate/stream_consumer.dart
+++ b/lib/src/delegate/stream_consumer.dart
@@ -27,7 +27,9 @@
           ? consumer
           : DelegatingStreamConsumer._(consumer);
 
+  @override
   Future addStream(Stream<T> stream) => _consumer.addStream(stream);
 
+  @override
   Future close() => _consumer.close();
 }
diff --git a/lib/src/delegate/stream_sink.dart b/lib/src/delegate/stream_sink.dart
index 67eb33c..3971189 100644
--- a/lib/src/delegate/stream_sink.dart
+++ b/lib/src/delegate/stream_sink.dart
@@ -11,6 +11,7 @@
 class DelegatingStreamSink<T> implements StreamSink<T> {
   final StreamSink _sink;
 
+  @override
   Future get done => _sink.done;
 
   /// Create delegating sink forwarding calls to [sink].
@@ -27,15 +28,19 @@
   static StreamSink<T> typed<T>(StreamSink sink) =>
       sink is StreamSink<T> ? sink : DelegatingStreamSink._(sink);
 
+  @override
   void add(T data) {
     _sink.add(data);
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     _sink.addError(error, stackTrace);
   }
 
+  @override
   Future addStream(Stream<T> stream) => _sink.addStream(stream);
 
+  @override
   Future close() => _sink.close();
 }
diff --git a/lib/src/delegate/stream_subscription.dart b/lib/src/delegate/stream_subscription.dart
index 07af08e..7d258a8 100644
--- a/lib/src/delegate/stream_subscription.dart
+++ b/lib/src/delegate/stream_subscription.dart
@@ -28,29 +28,37 @@
           ? subscription
           : TypeSafeStreamSubscription<T>(subscription);
 
-  void onData(void handleData(T data)) {
+  @override
+  void onData(void Function(T) handleData) {
     _source.onData(handleData);
   }
 
+  @override
   void onError(Function handleError) {
     _source.onError(handleError);
   }
 
-  void onDone(void handleDone()) {
+  @override
+  void onDone(void Function() handleDone) {
     _source.onDone(handleDone);
   }
 
+  @override
   void pause([Future resumeFuture]) {
     _source.pause(resumeFuture);
   }
 
+  @override
   void resume() {
     _source.resume();
   }
 
+  @override
   Future cancel() => _source.cancel();
 
+  @override
   Future<E> asFuture<E>([E futureValue]) => _source.asFuture(futureValue);
 
+  @override
   bool get isPaused => _source.isPaused;
 }
diff --git a/lib/src/future_group.dart b/lib/src/future_group.dart
index 7e17494..a6abff0 100644
--- a/lib/src/future_group.dart
+++ b/lib/src/future_group.dart
@@ -41,12 +41,8 @@
   ///
   /// Once this group isn't waiting on any futures *and* [close] has been
   /// called, this stream will close.
-  Stream get onIdle {
-    if (_onIdleController == null) {
-      _onIdleController = StreamController.broadcast(sync: true);
-    }
-    return _onIdleController.stream;
-  }
+  Stream get onIdle =>
+      (_onIdleController ??= StreamController.broadcast(sync: true)).stream;
 
   StreamController _onIdleController;
 
@@ -54,11 +50,12 @@
   /// the order they were added.
   ///
   /// The slots for futures that haven't completed yet are `null`.
-  final _values = List<T>();
+  final _values = <T>[];
 
   /// Wait for [task] to complete.
+  @override
   void add(Future<T> task) {
-    if (_closed) throw StateError("The FutureGroup is closed.");
+    if (_closed) throw StateError('The FutureGroup is closed.');
 
     // Ensure that future values are put into [values] in the same order they're
     // added to the group by pre-allocating a slot for them and recording its
@@ -87,6 +84,7 @@
 
   /// Signals to the group that the caller is done adding futures, and so
   /// [future] should fire once all added futures have completed.
+  @override
   void close() {
     _closed = true;
     if (_pending != 0) return;
diff --git a/lib/src/lazy_stream.dart b/lib/src/lazy_stream.dart
index 278957a..d2ac33c 100644
--- a/lib/src/lazy_stream.dart
+++ b/lib/src/lazy_stream.dart
@@ -2,11 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "delegate/stream.dart";
-import "stream_completer.dart";
-import "utils.dart";
+import 'delegate/stream.dart';
+import 'stream_completer.dart';
+import 'utils.dart';
 
 /// A [Stream] wrapper that forwards to another [Stream] that's initialized
 /// lazily.
@@ -20,15 +20,16 @@
 
   /// Creates a single-subscription `Stream` that calls [callback] when it gets
   /// a listener and forwards to the returned stream.
-  LazyStream(FutureOr<Stream<T>> callback()) : _callback = callback {
+  LazyStream(FutureOr<Stream<T>> Function() callback) : _callback = callback {
     // Explicitly check for null because we null out [_callback] internally.
     if (_callback == null) throw ArgumentError.notNull('callback');
   }
 
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  @override
+  StreamSubscription<T> listen(void Function(T) onData,
+      {Function onError, void Function() onDone, bool cancelOnError}) {
     if (_callback == null) {
-      throw StateError("Stream has already been listened to.");
+      throw StateError('Stream has already been listened to.');
     }
 
     // Null out the callback before we invoke it to ensure that even while
diff --git a/lib/src/null_stream_sink.dart b/lib/src/null_stream_sink.dart
index c9d3d5d..f820328 100644
--- a/lib/src/null_stream_sink.dart
+++ b/lib/src/null_stream_sink.dart
@@ -26,6 +26,7 @@
 /// }
 /// ```
 class NullStreamSink<T> implements StreamSink<T> {
+  @override
   final Future done;
 
   /// Whether the sink has been closed.
@@ -54,14 +55,17 @@
           // experiencing an error.
           ..catchError((_) {});
 
+  @override
   void add(T data) {
     _checkEventAllowed();
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     _checkEventAllowed();
   }
 
+  @override
   Future addStream(Stream<T> stream) {
     _checkEventAllowed();
 
@@ -75,12 +79,13 @@
   /// Throws a [StateError] if [close] has been called or an [addStream] call is
   /// pending.
   void _checkEventAllowed() {
-    if (_closed) throw StateError("Cannot add to a closed sink.");
+    if (_closed) throw StateError('Cannot add to a closed sink.');
     if (_addingStream) {
-      throw StateError("Cannot add to a sink while adding a stream.");
+      throw StateError('Cannot add to a sink while adding a stream.');
     }
   }
 
+  @override
   Future close() {
     _closed = true;
     return done;
diff --git a/lib/src/restartable_timer.dart b/lib/src/restartable_timer.dart
index 4720bcd..9ecf443 100644
--- a/lib/src/restartable_timer.dart
+++ b/lib/src/restartable_timer.dart
@@ -28,6 +28,7 @@
   RestartableTimer(this._duration, this._callback)
       : _timer = Timer(_duration, _callback);
 
+  @override
   bool get isActive => _timer.isActive;
 
   /// Restarts the timer so that it counts down from its original duration
@@ -39,6 +40,7 @@
     _timer = Timer(_duration, _callback);
   }
 
+  @override
   void cancel() {
     _timer.cancel();
   }
@@ -48,5 +50,6 @@
   ///
   /// Calls to [reset] will also reset the tick so subsequent tick values may
   /// not be strictly larger than previous values.
+  @override
   int get tick => _timer.tick;
 }
diff --git a/lib/src/result/capture_sink.dart b/lib/src/result/capture_sink.dart
index 0477a19..a7c3a59 100644
--- a/lib/src/result/capture_sink.dart
+++ b/lib/src/result/capture_sink.dart
@@ -12,14 +12,17 @@
 
   CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
 
+  @override
   void add(T value) {
     _sink.add(Result<T>.value(value));
   }
 
+  @override
   void addError(Object error, [StackTrace stackTrace]) {
     _sink.add(Result.error(error, stackTrace));
   }
 
+  @override
   void close() {
     _sink.close();
   }
diff --git a/lib/src/result/capture_transformer.dart b/lib/src/result/capture_transformer.dart
index a727a8e..1f58d06 100644
--- a/lib/src/result/capture_transformer.dart
+++ b/lib/src/result/capture_transformer.dart
@@ -14,6 +14,7 @@
 class CaptureStreamTransformer<T> extends StreamTransformerBase<T, Result<T>> {
   const CaptureStreamTransformer();
 
+  @override
   Stream<Result<T>> bind(Stream<T> source) =>
       Stream<Result<T>>.eventTransformed(
           source, (sink) => CaptureSink<T>(sink));
diff --git a/lib/src/result/error.dart b/lib/src/result/error.dart
index 8f29d13..76e0275 100644
--- a/lib/src/result/error.dart
+++ b/lib/src/result/error.dart
@@ -15,21 +15,28 @@
   /// The stack trace corresponding to where [error] was thrown.
   final StackTrace stackTrace;
 
+  @override
   bool get isValue => false;
+  @override
   bool get isError => true;
+  @override
   ValueResult<Null> get asValue => null;
+  @override
   ErrorResult get asError => this;
 
   ErrorResult(this.error, this.stackTrace);
 
+  @override
   void complete(Completer completer) {
     completer.completeError(error, stackTrace);
   }
 
+  @override
   void addTo(EventSink sink) {
     sink.addError(error, stackTrace);
   }
 
+  @override
   Future<Null> get asFuture => Future<Null>.error(error, stackTrace);
 
   /// Calls an error handler with the error and stacktrace.
@@ -46,9 +53,11 @@
     }
   }
 
+  @override
   int get hashCode => error.hashCode ^ stackTrace.hashCode ^ 0x1d61823f;
 
   /// This is equal only to an error result with equal [error] and [stackTrace].
+  @override
   bool operator ==(Object other) =>
       other is ErrorResult &&
       error == other.error &&
diff --git a/lib/src/result/release_sink.dart b/lib/src/result/release_sink.dart
index a0715a1..78d0f42 100644
--- a/lib/src/result/release_sink.dart
+++ b/lib/src/result/release_sink.dart
@@ -12,16 +12,19 @@
 
   ReleaseSink(EventSink<T> sink) : _sink = sink;
 
+  @override
   void add(Result<T> result) {
     result.addTo(_sink);
   }
 
+  @override
   void addError(Object error, [StackTrace stackTrace]) {
     // Errors may be added by intermediate processing, even if it is never
     // added by CaptureSink.
     _sink.addError(error, stackTrace);
   }
 
+  @override
   void close() {
     _sink.close();
   }
diff --git a/lib/src/result/release_transformer.dart b/lib/src/result/release_transformer.dart
index 1aead30..2548ac9 100644
--- a/lib/src/result/release_transformer.dart
+++ b/lib/src/result/release_transformer.dart
@@ -11,6 +11,7 @@
 class ReleaseStreamTransformer<T> extends StreamTransformerBase<Result<T>, T> {
   const ReleaseStreamTransformer();
 
+  @override
   Stream<T> bind(Stream<Result<T>> source) {
     return Stream<T>.eventTransformed(source, _createSink);
   }
diff --git a/lib/src/result/result.dart b/lib/src/result/result.dart
index 28799fa..e04da9f 100644
--- a/lib/src/result/result.dart
+++ b/lib/src/result/result.dart
@@ -60,7 +60,7 @@
   /// This generates either a [ValueResult] with the value returned by
   /// calling `computation`, or an [ErrorResult] with an error thrown by
   /// the call.
-  factory Result(T computation()) {
+  factory Result(T Function() computation) {
     try {
       return ValueResult<T>(computation());
     } catch (e, s) {
@@ -97,11 +97,11 @@
   /// The returned future will never have an error.
   static Future<List<Result<T>>> captureAll<T>(Iterable<FutureOr<T>> elements) {
     var results = <Result<T>>[];
-    int pending = 0;
+    var pending = 0;
     Completer<List<Result<T>>> completer;
     for (var element in elements) {
       if (element is Future<T>) {
-        int i = results.length;
+        var i = results.length;
         results.add(null);
         pending++;
         Result.capture<T>(element).then((result) {
diff --git a/lib/src/result/value.dart b/lib/src/result/value.dart
index dddc9fe..5c1a60f 100644
--- a/lib/src/result/value.dart
+++ b/lib/src/result/value.dart
@@ -12,25 +12,34 @@
   /// The result of a successful computation.
   final T value;
 
+  @override
   bool get isValue => true;
+  @override
   bool get isError => false;
+  @override
   ValueResult<T> get asValue => this;
+  @override
   ErrorResult get asError => null;
 
   ValueResult(this.value);
 
+  @override
   void complete(Completer<T> completer) {
     completer.complete(value);
   }
 
+  @override
   void addTo(EventSink<T> sink) {
     sink.add(value);
   }
 
+  @override
   Future<T> get asFuture => Future.value(value);
 
+  @override
   int get hashCode => value.hashCode ^ 0x323f1d61;
 
+  @override
   bool operator ==(Object other) =>
       other is ValueResult && value == other.value;
 }
diff --git a/lib/src/single_subscription_transformer.dart b/lib/src/single_subscription_transformer.dart
index 8007a42..fe939fc 100644
--- a/lib/src/single_subscription_transformer.dart
+++ b/lib/src/single_subscription_transformer.dart
@@ -16,6 +16,7 @@
 class SingleSubscriptionTransformer<S, T> extends StreamTransformerBase<S, T> {
   const SingleSubscriptionTransformer();
 
+  @override
   Stream<T> bind(Stream<S> stream) {
     StreamSubscription<S> subscription;
     var controller =
diff --git a/lib/src/stream_completer.dart b/lib/src/stream_completer.dart
index bbb2155..5128d57 100644
--- a/lib/src/stream_completer.dart
+++ b/lib/src/stream_completer.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
 /// A single-subscription [stream] where the contents are provided later.
 ///
@@ -75,7 +75,7 @@
   /// most once. Trying to call any of them again will fail.
   void setSourceStream(Stream<T> sourceStream) {
     if (_stream._isSourceStreamSet) {
-      throw StateError("Source stream already set");
+      throw StateError('Source stream already set');
     }
     _stream._setSourceStream(sourceStream);
   }
@@ -86,7 +86,7 @@
   /// most once. Trying to call any of them again will fail.
   void setEmpty() {
     if (_stream._isSourceStreamSet) {
-      throw StateError("Source stream already set");
+      throw StateError('Source stream already set');
     }
     _stream._setEmpty();
   }
@@ -116,8 +116,9 @@
   /// or [_setEmpty].
   Stream<T> _sourceStream;
 
-  StreamSubscription<T> listen(onData(T data),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  @override
+  StreamSubscription<T> listen(void Function(T) onData,
+      {Function onError, void Function() onDone, bool cancelOnError}) {
     if (_controller == null) {
       if (_sourceStream != null && !_sourceStream.isBroadcast) {
         // If the source stream is itself single subscription,
diff --git a/lib/src/stream_group.dart b/lib/src/stream_group.dart
index 1a6d15d..8ea95f3 100644
--- a/lib/src/stream_group.dart
+++ b/lib/src/stream_group.dart
@@ -47,7 +47,7 @@
   /// subscriptions will be canceled and set to null again. Single-subscriber
   /// stream subscriptions will be left intact, since they can't be
   /// re-subscribed.
-  final _subscriptions = Map<Stream<T>, StreamSubscription<T>>();
+  final _subscriptions = <Stream<T>, StreamSubscription<T>>{};
 
   /// Merges the events from [streams] into a single single-subscription stream.
   ///
@@ -99,6 +99,7 @@
   /// `null`.
   ///
   /// Throws a [StateError] if this group is closed.
+  @override
   Future add(Stream<T> stream) {
     if (_closed) {
       throw StateError("Can't add a Stream to a closed StreamGroup.");
@@ -214,6 +215,7 @@
   /// Otherwise, [stream] will close once all streams in the group close.
   ///
   /// Returns a [Future] that completes once [stream] has actually been closed.
+  @override
   Future close() {
     if (_closed) return _controller.done;
 
@@ -230,12 +232,12 @@
   ///
   /// New streams added to the group will be listened once the group has a
   /// listener.
-  static const dormant = _StreamGroupState("dormant");
+  static const dormant = _StreamGroupState('dormant');
 
   /// The group has one or more listeners and is actively firing events.
   ///
   /// New streams added to the group will be immediately listeners.
-  static const listening = _StreamGroupState("listening");
+  static const listening = _StreamGroupState('listening');
 
   /// The group is paused and no more events will be fired until it resumes.
   ///
@@ -243,7 +245,7 @@
   /// will be resumed once the group itself is resumed.
   ///
   /// This state is only used by single-subscriber groups.
-  static const paused = _StreamGroupState("paused");
+  static const paused = _StreamGroupState('paused');
 
   /// The group is canceled and no more events will be fired ever.
   ///
@@ -251,7 +253,7 @@
   /// discarded.
   ///
   /// This state is only used by single-subscriber groups.
-  static const canceled = _StreamGroupState("canceled");
+  static const canceled = _StreamGroupState('canceled');
 
   /// The name of the state.
   ///
@@ -260,5 +262,6 @@
 
   const _StreamGroupState(this.name);
 
+  @override
   String toString() => name;
 }
diff --git a/lib/src/stream_queue.dart b/lib/src/stream_queue.dart
index fd3186e..cf75a6d 100644
--- a/lib/src/stream_queue.dart
+++ b/lib/src/stream_queue.dart
@@ -7,11 +7,11 @@
 
 import 'package:collection/collection.dart';
 
-import "cancelable_operation.dart";
-import "result/result.dart";
-import "subscription_stream.dart";
-import "stream_completer.dart";
-import "stream_splitter.dart";
+import 'cancelable_operation.dart';
+import 'result/result.dart';
+import 'subscription_stream.dart';
+import 'stream_completer.dart';
+import 'stream_splitter.dart';
 
 /// An asynchronous pull-based interface for accessing stream events.
 ///
@@ -146,7 +146,7 @@
   /// If one of the next [count] events is an error, the returned future
   /// completes with this error, and the error is still left in the queue.
   Future<List<T>> lookAhead(int count) {
-    if (count < 0) throw RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, 'count');
     if (!_isClosed) {
       var request = _LookAheadRequest<T>(count);
       _addRequest(request);
@@ -226,7 +226,7 @@
   /// then all events were succssfully skipped. If the value
   /// is greater than zero then the stream ended early.
   Future<int> skip(int count) {
-    if (count < 0) throw RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, 'count');
     if (!_isClosed) {
       var request = _SkipRequest<T>(count);
       _addRequest(request);
@@ -251,7 +251,7 @@
   /// of data collected so far. That is, the returned
   /// list may have fewer than [count] elements.
   Future<List<T>> take(int count) {
-    if (count < 0) throw RangeError.range(count, 0, null, "count");
+    if (count < 0) throw RangeError.range(count, 0, null, 'count');
     if (!_isClosed) {
       var request = _TakeRequest<T>(count);
       _addRequest(request);
@@ -324,7 +324,7 @@
   ///   }
   /// }
   /// ```
-  Future<bool> withTransaction(Future<bool> callback(StreamQueue<T> queue)) {
+  Future<bool> withTransaction(Future<bool> Function(StreamQueue<T>) callback) {
     var transaction = startTransaction();
 
     /// Avoid async/await to ensure that [startTransaction] is called
@@ -363,7 +363,7 @@
   ///     _stdinQueue.cancelable((queue) => queue.next);
   /// ```
   CancelableOperation<S> cancelable<S>(
-      Future<S> callback(StreamQueue<T> queue)) {
+      Future<S> Function(StreamQueue<T>) callback) {
     var transaction = startTransaction();
     var completer = CancelableCompleter<S>(onCancel: () {
       transaction.reject();
@@ -486,7 +486,7 @@
         _addResult(Result.error(error, stackTrace));
       }, onDone: () {
         _subscription = null;
-        this._close();
+        _close();
       });
     } else {
       _subscription.resume();
@@ -529,7 +529,7 @@
   /// Returns a [StateError] with a message saying that either
   /// [cancel] or [rest] have already been called.
   Error _failClosed() {
-    return StateError("Already cancelled");
+    return StateError('Already cancelled');
   }
 
   /// Adds a new request to the queue.
@@ -558,7 +558,7 @@
   final StreamSplitter<T> _splitter;
 
   /// Queues created using [newQueue].
-  final _queues = Set<StreamQueue>();
+  final _queues = <StreamQueue>{};
 
   /// Whether [commit] has been called.
   var _committed = false;
@@ -639,9 +639,9 @@
   /// Throws a [StateError] if [accept] or [reject] has already been called.
   void _assertActive() {
     if (_committed) {
-      throw StateError("This transaction has already been accepted.");
+      throw StateError('This transaction has already been accepted.');
     } else if (_rejected) {
-      throw StateError("This transaction has already been rejected.");
+      throw StateError('This transaction has already been rejected.');
     }
   }
 }
@@ -696,13 +696,14 @@
 
   Future<T> get future => _completer.future;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isNotEmpty) {
       events.removeFirst().complete(_completer);
       return true;
     }
     if (isDone) {
-      _completer.completeError(StateError("No elements"), StackTrace.current);
+      _completer.completeError(StateError('No elements'), StackTrace.current);
       return true;
     }
     return false;
@@ -721,13 +722,14 @@
 
   Future<T> get future => _completer.future;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isNotEmpty) {
       events.first.complete(_completer);
       return true;
     }
     if (isDone) {
-      _completer.completeError(StateError("No elements"), StackTrace.current);
+      _completer.completeError(StateError('No elements'), StackTrace.current);
       return true;
     }
     return false;
@@ -752,6 +754,7 @@
   /// The future completed when the correct number of events have been skipped.
   Future<int> get future => _completer.future;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     while (_eventsToSkip > 0) {
       if (events.isEmpty) {
@@ -795,6 +798,7 @@
 class _TakeRequest<T> extends _ListRequest<T> {
   _TakeRequest(int eventsToTake) : super(eventsToTake);
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     while (_list.length < _eventsToTake) {
       if (events.isEmpty) {
@@ -818,6 +822,7 @@
 class _LookAheadRequest<T> extends _ListRequest<T> {
   _LookAheadRequest(int eventsToTake) : super(eventsToTake);
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     while (_list.length < _eventsToTake) {
       if (events.length == _list.length) {
@@ -855,6 +860,7 @@
   /// The future completed when the cancel request is completed.
   Future get future => _completer.future;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     if (_streamQueue._isDone) {
       _completer.complete();
@@ -886,6 +892,7 @@
   /// The stream which will contain the remaining events of [_streamQueue].
   Stream<T> get stream => _completer.stream;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isEmpty) {
       if (_streamQueue._isDone) {
@@ -920,6 +927,7 @@
 
   Future<bool> get future => _completer.future;
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     if (events.isNotEmpty) {
       _completer.complete(true);
@@ -954,6 +962,7 @@
     _transaction = StreamQueueTransaction._(parent, _controller.stream);
   }
 
+  @override
   bool update(QueueList<Result<T>> events, bool isDone) {
     while (_eventsSent < events.length) {
       events[_eventsSent++].addTo(_controller);
diff --git a/lib/src/stream_sink_completer.dart b/lib/src/stream_sink_completer.dart
index c7fdd03..3b31576 100644
--- a/lib/src/stream_sink_completer.dart
+++ b/lib/src/stream_sink_completer.dart
@@ -59,7 +59,7 @@
   /// Trying to call either of them again will fail.
   void setDestinationSink(StreamSink<T> destinationSink) {
     if (_sink._destinationSink != null) {
-      throw StateError("Destination sink already set");
+      throw StateError('Destination sink already set');
     }
     _sink._setDestinationSink(destinationSink);
   }
@@ -98,6 +98,7 @@
   /// to going through [_controller].
   bool get _canSendDirectly => _controller == null && _destinationSink != null;
 
+  @override
   Future get done {
     if (_doneCompleter != null) return _doneCompleter.future;
     if (_destinationSink == null) {
@@ -107,6 +108,7 @@
     return _destinationSink.done;
   }
 
+  @override
   void add(T event) {
     if (_canSendDirectly) {
       _destinationSink.add(event);
@@ -116,6 +118,7 @@
     }
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     if (_canSendDirectly) {
       _destinationSink.addError(error, stackTrace);
@@ -125,6 +128,7 @@
     }
   }
 
+  @override
   Future addStream(Stream<T> stream) {
     if (_canSendDirectly) return _destinationSink.addStream(stream);
 
@@ -132,6 +136,7 @@
     return _controller.addStream(stream, cancelOnError: false);
   }
 
+  @override
   Future close() {
     if (_canSendDirectly) {
       _destinationSink.close();
@@ -144,7 +149,7 @@
 
   /// Create [_controller] if it doesn't yet exist.
   void _ensureController() {
-    if (_controller == null) _controller = StreamController(sync: true);
+    _controller ??= StreamController(sync: true);
   }
 
   /// Sets the destination sink to which events from this sink will be provided.
diff --git a/lib/src/stream_sink_transformer.dart b/lib/src/stream_sink_transformer.dart
index b01132e..c50cf17 100644
--- a/lib/src/stream_sink_transformer.dart
+++ b/lib/src/stream_sink_transformer.dart
@@ -34,9 +34,9 @@
   /// they're passed are forwarded to the inner sink. If a handler is omitted,
   /// the event is passed through unaltered.
   factory StreamSinkTransformer.fromHandlers(
-      {void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)}) {
+      {void Function(S, EventSink<T>) handleData,
+      void Function(Object, StackTrace, EventSink<T>) handleError,
+      void Function(EventSink<T>) handleDone}) {
     return HandlerTransformer<S, T>(handleData, handleError, handleDone);
   }
 
diff --git a/lib/src/stream_sink_transformer/handler_transformer.dart b/lib/src/stream_sink_transformer/handler_transformer.dart
index 3137003..8d37ce3 100644
--- a/lib/src/stream_sink_transformer/handler_transformer.dart
+++ b/lib/src/stream_sink_transformer/handler_transformer.dart
@@ -30,6 +30,7 @@
 
   HandlerTransformer(this._handleData, this._handleError, this._handleDone);
 
+  @override
   StreamSink<S> bind(StreamSink<T> sink) => _HandlerSink<S, T>(this, sink);
 }
 
@@ -45,12 +46,14 @@
   /// errors.
   final StreamSink<T> _safeCloseInner;
 
+  @override
   Future get done => _inner.done;
 
   _HandlerSink(this._transformer, StreamSink<T> inner)
       : _inner = inner,
         _safeCloseInner = _SafeCloseSink<T>(inner);
 
+  @override
   void add(S event) {
     if (_transformer._handleData == null) {
       _inner.add(event as T);
@@ -59,6 +62,7 @@
     }
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     if (_transformer._handleError == null) {
       _inner.addError(error, stackTrace);
@@ -67,6 +71,7 @@
     }
   }
 
+  @override
   Future addStream(Stream<S> stream) {
     return _inner.addStream(stream.transform(
         StreamTransformer<S, T>.fromHandlers(
@@ -75,6 +80,7 @@
             handleDone: _closeSink)));
   }
 
+  @override
   Future close() {
     if (_transformer._handleDone == null) return _inner.close();
 
@@ -91,6 +97,7 @@
 class _SafeCloseSink<T> extends DelegatingStreamSink<T> {
   _SafeCloseSink(StreamSink<T> inner) : super(inner);
 
+  @override
   Future close() => super.close().catchError((_) {});
 }
 
diff --git a/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart b/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
index 1010f9f..1df7e5a 100644
--- a/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
+++ b/lib/src/stream_sink_transformer/stream_transformer_wrapper.dart
@@ -13,6 +13,7 @@
 
   const StreamTransformerWrapper(this._transformer);
 
+  @override
   StreamSink<S> bind(StreamSink<T> sink) =>
       _StreamTransformerWrapperSink<S, T>(_transformer, sink);
 }
@@ -28,6 +29,7 @@
   /// The original sink that's being transformed.
   final StreamSink<T> _inner;
 
+  @override
   Future get done => _inner.done;
 
   _StreamTransformerWrapperSink(
@@ -42,16 +44,20 @@
     });
   }
 
+  @override
   void add(S event) {
     _controller.add(event);
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     _controller.addError(error, stackTrace);
   }
 
+  @override
   Future addStream(Stream<S> stream) => _controller.addStream(stream);
 
+  @override
   Future close() {
     _controller.close();
     return _inner.done;
diff --git a/lib/src/stream_sink_transformer/typed.dart b/lib/src/stream_sink_transformer/typed.dart
index 303bc08..c27bd24 100644
--- a/lib/src/stream_sink_transformer/typed.dart
+++ b/lib/src/stream_sink_transformer/typed.dart
@@ -15,6 +15,7 @@
 
   TypeSafeStreamSinkTransformer(this._inner);
 
+  @override
   StreamSink<S> bind(StreamSink<T> sink) =>
       DelegatingStreamSink.typed(_inner.bind(sink));
 }
diff --git a/lib/src/stream_splitter.dart b/lib/src/stream_splitter.dart
index df0ff44..e9f326e 100644
--- a/lib/src/stream_splitter.dart
+++ b/lib/src/stream_splitter.dart
@@ -32,14 +32,14 @@
 
   /// The buffer of events or errors that have already been emitted by
   /// [_stream].
-  final _buffer = List<Result<T>>();
+  final _buffer = <Result<T>>[];
 
   /// The controllers for branches that are listening for future events from
   /// [_stream].
   ///
   /// Once a branch is canceled, it's removed from this list. When [_stream] is
   /// done, all branches are removed.
-  final _controllers = Set<StreamController<T>>();
+  final _controllers = <StreamController<T>>{};
 
   /// A group of futures returned by [close].
   ///
@@ -58,7 +58,7 @@
   /// [count] defaults to 2. This is the same as creating [count] branches and
   /// then closing the [StreamSplitter].
   static List<Stream<T>> splitFrom<T>(Stream<T> stream, [int count]) {
-    if (count == null) count = 2;
+    count ??= 2;
     var splitter = StreamSplitter<T>(stream);
     var streams = List<Stream<T>>.generate(count, (_) => splitter.split());
     splitter.close();
diff --git a/lib/src/stream_subscription_transformer.dart b/lib/src/stream_subscription_transformer.dart
index bee96a5..0e28972 100644
--- a/lib/src/stream_subscription_transformer.dart
+++ b/lib/src/stream_subscription_transformer.dart
@@ -28,9 +28,9 @@
 /// [StreamSubscription]: [handleCancel] must call `cancel()`, [handlePause]
 /// must call `pause()`, and [handleResume] must call `resume()`.
 StreamTransformer<T, T> subscriptionTransformer<T>(
-    {Future handleCancel(StreamSubscription<T> inner),
-    void handlePause(StreamSubscription<T> inner),
-    void handleResume(StreamSubscription<T> inner)}) {
+    {Future Function(StreamSubscription<T>) handleCancel,
+    void Function(StreamSubscription<T>) handlePause,
+    void Function(StreamSubscription<T>) handleResume}) {
   return StreamTransformer((stream, cancelOnError) {
     return _TransformedSubscription(
         stream.listen(null, cancelOnError: cancelOnError),
@@ -61,23 +61,28 @@
   /// The callback to run when [resume] is called.
   final _VoidHandler<T> _handleResume;
 
+  @override
   bool get isPaused => _inner?.isPaused ?? false;
 
   _TransformedSubscription(
       this._inner, this._handleCancel, this._handlePause, this._handleResume);
 
-  void onData(void handleData(T data)) {
+  @override
+  void onData(void Function(T) handleData) {
     _inner?.onData(handleData);
   }
 
+  @override
   void onError(Function handleError) {
     _inner?.onError(handleError);
   }
 
-  void onDone(void handleDone()) {
+  @override
+  void onDone(void Function() handleDone) {
     _inner?.onDone(handleDone);
   }
 
+  @override
   Future cancel() => _cancelMemoizer.runOnce(() {
         var inner = _inner;
         _inner.onData(null);
@@ -90,17 +95,20 @@
       });
   final _cancelMemoizer = AsyncMemoizer();
 
+  @override
   void pause([Future resumeFuture]) {
     if (_cancelMemoizer.hasRun) return;
     if (resumeFuture != null) resumeFuture.whenComplete(resume);
     _handlePause(_inner);
   }
 
+  @override
   void resume() {
     if (_cancelMemoizer.hasRun) return;
     _handleResume(_inner);
   }
 
+  @override
   Future<E> asFuture<E>([E futureValue]) =>
       _inner?.asFuture(futureValue) ?? Completer<E>().future;
 }
diff --git a/lib/src/stream_zip.dart b/lib/src/stream_zip.dart
index ef14c3e..e319746 100644
--- a/lib/src/stream_zip.dart
+++ b/lib/src/stream_zip.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
 /// A stream that combines the values of other streams.
 ///
@@ -17,13 +17,14 @@
 
   StreamZip(Iterable<Stream<T>> streams) : _streams = streams;
 
-  StreamSubscription<List<T>> listen(void onData(List<T> data),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  @override
+  StreamSubscription<List<T>> listen(void Function(List<T>) onData,
+      {Function onError, void Function() onDone, bool cancelOnError}) {
     cancelOnError = identical(true, cancelOnError);
     var subscriptions = <StreamSubscription<T>>[];
     StreamController<List<T>> controller;
     List<T> current;
-    int dataCount = 0;
+    var dataCount = 0;
 
     /// Called for each data from a subscription in [subscriptions].
     void handleData(int index, T data) {
@@ -33,7 +34,7 @@
         var data = current;
         current = List(subscriptions.length);
         dataCount = 0;
-        for (int i = 0; i < subscriptions.length; i++) {
+        for (var i = 0; i < subscriptions.length; i++) {
           if (i != index) subscriptions[i].resume();
         }
         controller.add(data);
@@ -54,14 +55,14 @@
     /// Prematurely cancels all subscriptions since we know that we won't
     /// be needing any more values.
     void handleErrorCancel(Object error, StackTrace stackTrace) {
-      for (int i = 0; i < subscriptions.length; i++) {
+      for (var i = 0; i < subscriptions.length; i++) {
         subscriptions[i].cancel();
       }
       controller.addError(error, stackTrace);
     }
 
     void handleDone() {
-      for (int i = 0; i < subscriptions.length; i++) {
+      for (var i = 0; i < subscriptions.length; i++) {
         subscriptions[i].cancel();
       }
       controller.close();
@@ -69,7 +70,7 @@
 
     try {
       for (var stream in _streams) {
-        int index = subscriptions.length;
+        var index = subscriptions.length;
         subscriptions.add(stream.listen((data) {
           handleData(index, data);
         },
@@ -78,7 +79,7 @@
             cancelOnError: cancelOnError));
       }
     } catch (e) {
-      for (int i = subscriptions.length - 1; i >= 0; i--) {
+      for (var i = subscriptions.length - 1; i >= 0; i--) {
         subscriptions[i].cancel();
       }
       rethrow;
@@ -87,18 +88,18 @@
     current = List(subscriptions.length);
 
     controller = StreamController<List<T>>(onPause: () {
-      for (int i = 0; i < subscriptions.length; i++) {
+      for (var i = 0; i < subscriptions.length; i++) {
         // This may pause some subscriptions more than once.
         // These will not be resumed by onResume below, but must wait for the
         // next round.
         subscriptions[i].pause();
       }
     }, onResume: () {
-      for (int i = 0; i < subscriptions.length; i++) {
+      for (var i = 0; i < subscriptions.length; i++) {
         subscriptions[i].resume();
       }
     }, onCancel: () {
-      for (int i = 0; i < subscriptions.length; i++) {
+      for (var i = 0; i < subscriptions.length; i++) {
         // Canceling more than once is safe.
         subscriptions[i].cancel();
       }
diff --git a/lib/src/subscription_stream.dart b/lib/src/subscription_stream.dart
index 347c346..b428619 100644
--- a/lib/src/subscription_stream.dart
+++ b/lib/src/subscription_stream.dart
@@ -4,7 +4,7 @@
 
 import 'dart:async';
 
-import "delegate/stream_subscription.dart";
+import 'delegate/stream_subscription.dart';
 
 /// A [Stream] adapter for a [StreamSubscription].
 ///
@@ -38,10 +38,11 @@
     _source.onDone(null);
   }
 
-  StreamSubscription<T> listen(void onData(T event),
-      {Function onError, void onDone(), bool cancelOnError}) {
+  @override
+  StreamSubscription<T> listen(void Function(T) onData,
+      {Function onError, void Function() onDone, bool cancelOnError}) {
     if (_source == null) {
-      throw StateError("Stream has already been listened to.");
+      throw StateError('Stream has already been listened to.');
     }
     cancelOnError = (true == cancelOnError);
     var subscription = _source;
@@ -69,6 +70,7 @@
   _CancelOnErrorSubscriptionWrapper(StreamSubscription<T> subscription)
       : super(subscription);
 
+  @override
   void onError(Function handleError) {
     // Cancel when receiving an error.
     super.onError((error, StackTrace stackTrace) {
diff --git a/lib/src/typed/stream_subscription.dart b/lib/src/typed/stream_subscription.dart
index 0fab039..d85b776 100644
--- a/lib/src/typed/stream_subscription.dart
+++ b/lib/src/typed/stream_subscription.dart
@@ -7,31 +7,39 @@
 class TypeSafeStreamSubscription<T> implements StreamSubscription<T> {
   final StreamSubscription _subscription;
 
+  @override
   bool get isPaused => _subscription.isPaused;
 
   TypeSafeStreamSubscription(this._subscription);
 
-  void onData(void handleData(T data)) {
+  @override
+  void onData(void Function(T) handleData) {
     _subscription.onData((data) => handleData(data as T));
   }
 
+  @override
   void onError(Function handleError) {
     _subscription.onError(handleError);
   }
 
-  void onDone(void handleDone()) {
+  @override
+  void onDone(void Function() handleDone) {
     _subscription.onDone(handleDone);
   }
 
+  @override
   void pause([Future resumeFuture]) {
     _subscription.pause(resumeFuture);
   }
 
+  @override
   void resume() {
     _subscription.resume();
   }
 
+  @override
   Future cancel() => _subscription.cancel();
 
+  @override
   Future<E> asFuture<E>([E futureValue]) => _subscription.asFuture(futureValue);
 }
diff --git a/lib/src/typed_stream_transformer.dart b/lib/src/typed_stream_transformer.dart
index 9750eb4..2366505 100644
--- a/lib/src/typed_stream_transformer.dart
+++ b/lib/src/typed_stream_transformer.dart
@@ -25,6 +25,7 @@
 
   _TypeSafeStreamTransformer(this._inner);
 
+  @override
   Stream<T> bind(Stream<S> stream) =>
       DelegatingStream.typed(_inner.bind(stream));
 }
diff --git a/pubspec.yaml b/pubspec.yaml
index f2439a8..e472203 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -6,7 +6,7 @@
 homepage: https://www.github.com/dart-lang/async
 
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: '>=2.2.0 <3.0.0'
 
 dependencies:
   collection: ^1.5.0
diff --git a/test/async_cache_test.dart b/test/async_cache_test.dart
index b7f7b8e..4efbb69 100644
--- a/test/async_cache_test.dart
+++ b/test/async_cache_test.dart
@@ -39,7 +39,7 @@
   test('should fetch via a callback again when cache expires', () {
     FakeAsync().run((fakeAsync) async {
       var timesCalled = 0;
-      call() async => 'Called ${++timesCalled}';
+      Future<String> call() async => 'Called ${++timesCalled}';
       expect(await cache.fetch(call), 'Called 1');
       expect(await cache.fetch(call), 'Called 1', reason: 'Cache still fresh');
 
@@ -57,7 +57,7 @@
 
   test('should fetch via a callback when manually invalidated', () async {
     var timesCalled = 0;
-    call() async => 'Called ${++timesCalled}';
+    Future<String> call() async => 'Called ${++timesCalled}';
     expect(await cache.fetch(call), 'Called 1');
     cache.invalidate();
     expect(await cache.fetch(call), 'Called 2');
diff --git a/test/async_memoizer_test.dart b/test/async_memoizer_test.dart
index 785f9a5..982f7c9 100644
--- a/test/async_memoizer_test.dart
+++ b/test/async_memoizer_test.dart
@@ -5,11 +5,11 @@
 import 'package:async/async.dart';
 import 'package:test/test.dart';
 
-main() {
+void main() {
   AsyncMemoizer cache;
   setUp(() => cache = AsyncMemoizer());
 
-  test("runs the function only the first time runOnce() is called", () async {
+  test('runs the function only the first time runOnce() is called', () async {
     var count = 0;
     expect(await cache.runOnce(() => count++), equals(0));
     expect(count, equals(1));
@@ -18,21 +18,21 @@
     expect(count, equals(1));
   });
 
-  test("forwards the return value from the function", () async {
-    expect(cache.future, completion(equals("value")));
-    expect(cache.runOnce(() => "value"), completion(equals("value")));
-    expect(cache.runOnce(() {}), completion(equals("value")));
+  test('forwards the return value from the function', () async {
+    expect(cache.future, completion(equals('value')));
+    expect(cache.runOnce(() => 'value'), completion(equals('value')));
+    expect(cache.runOnce(() {}), completion(equals('value')));
   });
 
-  test("forwards the return value from an async function", () async {
-    expect(cache.future, completion(equals("value")));
-    expect(cache.runOnce(() async => "value"), completion(equals("value")));
-    expect(cache.runOnce(() {}), completion(equals("value")));
+  test('forwards the return value from an async function', () async {
+    expect(cache.future, completion(equals('value')));
+    expect(cache.runOnce(() async => 'value'), completion(equals('value')));
+    expect(cache.runOnce(() {}), completion(equals('value')));
   });
 
-  test("forwards the error from an async function", () async {
-    expect(cache.future, throwsA("error"));
-    expect(cache.runOnce(() async => throw "error"), throwsA("error"));
-    expect(cache.runOnce(() {}), throwsA("error"));
+  test('forwards the error from an async function', () async {
+    expect(cache.future, throwsA('error'));
+    expect(cache.runOnce(() async => throw 'error'), throwsA('error'));
+    expect(cache.runOnce(() {}), throwsA('error'));
   });
 }
diff --git a/test/byte_collection_test.dart b/test/byte_collection_test.dart
index 24d218b..7f2ecc6 100644
--- a/test/byte_collection_test.dart
+++ b/test/byte_collection_test.dart
@@ -2,14 +2,14 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:test/test.dart";
-import "package:async/async.dart";
+import 'package:test/test.dart';
+import 'package:async/async.dart';
 
 void main() {
-  group("collectBytes", () {
-    test("simple list and overflow", () {
+  group('collectBytes', () {
+    test('simple list and overflow', () {
       var result = collectBytes(Stream.fromIterable([
         [0],
         [1],
@@ -19,25 +19,25 @@
       expect(result, completion([0, 1, 2, 0]));
     });
 
-    test("no events", () {
+    test('no events', () {
       var result = collectBytes(Stream.fromIterable([]));
       expect(result, completion([]));
     });
 
-    test("empty events", () {
+    test('empty events', () {
       var result = collectBytes(Stream.fromIterable([[], []]));
       expect(result, completion([]));
     });
 
-    test("error event", () {
+    test('error event', () {
       var result = collectBytes(Stream.fromIterable(
-          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
-      expect(result, throwsA("badness"));
+          Iterable.generate(3, (n) => n == 2 ? throw 'badness' : [n])));
+      expect(result, throwsA('badness'));
     });
   });
 
-  group("collectBytes", () {
-    test("simple list and overflow", () {
+  group('collectBytes', () {
+    test('simple list and overflow', () {
       var result = collectBytesCancelable(Stream.fromIterable([
         [0],
         [1],
@@ -47,23 +47,23 @@
       expect(result.value, completion([0, 1, 2, 0]));
     });
 
-    test("no events", () {
+    test('no events', () {
       var result = collectBytesCancelable(Stream.fromIterable([]));
       expect(result.value, completion([]));
     });
 
-    test("empty events", () {
+    test('empty events', () {
       var result = collectBytesCancelable(Stream.fromIterable([[], []]));
       expect(result.value, completion([]));
     });
 
-    test("error event", () {
+    test('error event', () {
       var result = collectBytesCancelable(Stream.fromIterable(
-          Iterable.generate(3, (n) => n == 2 ? throw "badness" : [n])));
-      expect(result.value, throwsA("badness"));
+          Iterable.generate(3, (n) => n == 2 ? throw 'badness' : [n])));
+      expect(result.value, throwsA('badness'));
     });
 
-    test("cancelled", () async {
+    test('cancelled', () async {
       var sc = StreamController<List<int>>();
       var result = collectBytesCancelable(sc.stream);
       // Value never completes.
diff --git a/test/cancelable_operation_test.dart b/test/cancelable_operation_test.dart
index a47e952..b38c0b9 100644
--- a/test/cancelable_operation_test.dart
+++ b/test/cancelable_operation_test.dart
@@ -10,100 +10,100 @@
 import 'utils.dart';
 
 void main() {
-  group("without being canceled", () {
+  group('without being canceled', () {
     CancelableCompleter completer;
     setUp(() {
       completer = CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
     });
 
-    test("sends values to the future", () {
+    test('sends values to the future', () {
       expect(completer.operation.value, completion(equals(1)));
       expect(completer.isCompleted, isFalse);
       completer.complete(1);
       expect(completer.isCompleted, isTrue);
     });
 
-    test("sends errors to the future", () {
-      expect(completer.operation.value, throwsA("error"));
+    test('sends errors to the future', () {
+      expect(completer.operation.value, throwsA('error'));
       expect(completer.isCompleted, isFalse);
-      completer.completeError("error");
+      completer.completeError('error');
       expect(completer.isCompleted, isTrue);
     });
 
-    test("sends values in a future to the future", () {
+    test('sends values in a future to the future', () {
       expect(completer.operation.value, completion(equals(1)));
       expect(completer.isCompleted, isFalse);
       completer.complete(Future.value(1));
       expect(completer.isCompleted, isTrue);
     });
 
-    test("sends errors in a future to the future", () {
-      expect(completer.operation.value, throwsA("error"));
+    test('sends errors in a future to the future', () {
+      expect(completer.operation.value, throwsA('error'));
       expect(completer.isCompleted, isFalse);
       expect(completer.operation.isCompleted, isFalse);
-      completer.complete(Future.error("error"));
+      completer.complete(Future.error('error'));
       expect(completer.isCompleted, isTrue);
       expect(completer.operation.isCompleted, isTrue);
     });
 
-    test("sends values to valueOrCancellation", () {
+    test('sends values to valueOrCancellation', () {
       expect(completer.operation.valueOrCancellation(), completion(equals(1)));
       completer.complete(1);
     });
 
-    test("sends errors to valueOrCancellation", () {
-      expect(completer.operation.valueOrCancellation(), throwsA("error"));
-      completer.completeError("error");
+    test('sends errors to valueOrCancellation', () {
+      expect(completer.operation.valueOrCancellation(), throwsA('error'));
+      completer.completeError('error');
     });
 
-    group("throws a StateError if completed", () {
-      test("successfully twice", () {
+    group('throws a StateError if completed', () {
+      test('successfully twice', () {
         completer.complete(1);
         expect(() => completer.complete(1), throwsStateError);
       });
 
-      test("successfully then unsuccessfully", () {
+      test('successfully then unsuccessfully', () {
         completer.complete(1);
-        expect(() => completer.completeError("error"), throwsStateError);
+        expect(() => completer.completeError('error'), throwsStateError);
       });
 
-      test("unsuccessfully twice", () {
-        expect(completer.operation.value, throwsA("error"));
-        completer.completeError("error");
-        expect(() => completer.completeError("error"), throwsStateError);
+      test('unsuccessfully twice', () {
+        expect(completer.operation.value, throwsA('error'));
+        completer.completeError('error');
+        expect(() => completer.completeError('error'), throwsStateError);
       });
 
-      test("successfully then with a future", () {
+      test('successfully then with a future', () {
         completer.complete(1);
         expect(() => completer.complete(Completer().future), throwsStateError);
       });
 
-      test("with a future then successfully", () {
+      test('with a future then successfully', () {
         completer.complete(Completer().future);
         expect(() => completer.complete(1), throwsStateError);
       });
 
-      test("with a future twice", () {
+      test('with a future twice', () {
         completer.complete(Completer().future);
         expect(() => completer.complete(Completer().future), throwsStateError);
       });
     });
 
-    group("CancelableOperation.fromFuture", () {
-      test("forwards values", () {
+    group('CancelableOperation.fromFuture', () {
+      test('forwards values', () {
         var operation = CancelableOperation.fromFuture(Future.value(1));
         expect(operation.value, completion(equals(1)));
       });
 
-      test("forwards errors", () {
-        var operation = CancelableOperation.fromFuture(Future.error("error"));
-        expect(operation.value, throwsA("error"));
+      test('forwards errors', () {
+        var operation = CancelableOperation.fromFuture(Future.error('error'));
+        expect(operation.value, throwsA('error'));
       });
     });
   });
 
-  group("when canceled", () {
-    test("causes the future never to fire", () async {
+  group('when canceled', () {
+    test('causes the future never to fire', () async {
       var completer = CancelableCompleter();
       completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       completer.operation.cancel();
@@ -114,7 +114,7 @@
       await flushMicrotasks();
     });
 
-    test("fires onCancel", () {
+    test('fires onCancel', () {
       var canceled = false;
       CancelableCompleter completer;
       completer = CancelableCompleter(onCancel: expectAsync0(() {
@@ -135,7 +135,7 @@
       expect(completer.operation.isCompleted, isFalse);
     });
 
-    test("returns the onCancel future each time cancel is called", () {
+    test('returns the onCancel future each time cancel is called', () {
       var completer = CancelableCompleter(onCancel: expectAsync0(() {
         return Future.value(1);
       }));
@@ -158,8 +158,8 @@
     });
 
     test(
-        "does call onCancel if the completer has completed to an unfired "
-        "Future", () {
+        'does call onCancel if the completer has completed to an unfired '
+        'Future', () {
       var completer = CancelableCompleter(onCancel: expectAsync0(() {}));
       completer.complete(Completer().future);
       expect(completer.operation.cancel(), completes);
@@ -167,7 +167,7 @@
 
     test(
         "doesn't call onCancel if the completer has completed to a fired "
-        "Future", () async {
+        'Future', () async {
       var completer =
           CancelableCompleter(onCancel: expectAsync0(() {}, count: 0));
       completer.complete(Future.value(1));
@@ -175,7 +175,7 @@
       expect(completer.operation.cancel(), completes);
     });
 
-    test("can be completed once after being canceled", () async {
+    test('can be completed once after being canceled', () async {
       var completer = CancelableCompleter();
       completer.operation.value.whenComplete(expectAsync0(() {}, count: 0));
       await completer.operation.cancel();
@@ -183,21 +183,21 @@
       expect(() => completer.complete(1), throwsStateError);
     });
 
-    test("fires valueOrCancellation with the given value", () {
+    test('fires valueOrCancellation with the given value', () {
       var completer = CancelableCompleter();
       expect(completer.operation.valueOrCancellation(1), completion(equals(1)));
       completer.operation.cancel();
     });
 
-    test("pipes an error through valueOrCancellation", () {
+    test('pipes an error through valueOrCancellation', () {
       var completer = CancelableCompleter(onCancel: () {
-        throw "error";
+        throw 'error';
       });
-      expect(completer.operation.valueOrCancellation(1), throwsA("error"));
+      expect(completer.operation.valueOrCancellation(1), throwsA('error'));
       completer.operation.cancel();
     });
 
-    test("valueOrCancellation waits on the onCancel future", () async {
+    test('valueOrCancellation waits on the onCancel future', () async {
       var innerCompleter = Completer();
       var completer =
           CancelableCompleter(onCancel: () => innerCompleter.future);
@@ -217,22 +217,22 @@
     });
   });
 
-  group("asStream()", () {
-    test("emits a value and then closes", () {
+  group('asStream()', () {
+    test('emits a value and then closes', () {
       var completer = CancelableCompleter();
       expect(completer.operation.asStream().toList(), completion(equals([1])));
       completer.complete(1);
     });
 
-    test("emits an error and then closes", () {
+    test('emits an error and then closes', () {
       var completer = CancelableCompleter();
       var queue = StreamQueue(completer.operation.asStream());
-      expect(queue.next, throwsA("error"));
+      expect(queue.next, throwsA('error'));
       expect(queue.hasNext, completion(isFalse));
-      completer.completeError("error");
+      completer.completeError('error');
     });
 
-    test("cancels the completer when the subscription is canceled", () {
+    test('cancels the completer when the subscription is canceled', () {
       var completer = CancelableCompleter(onCancel: expectAsync0(() {}));
       var sub =
           completer.operation.asStream().listen(expectAsync1((_) {}, count: 0));
@@ -242,7 +242,7 @@
     });
   });
 
-  group("then", () {
+  group('then', () {
     FutureOr<String> Function(int) onValue;
     FutureOr<String> Function(Object, StackTrace) onError;
     FutureOr<String> Function() onCancel;
@@ -251,9 +251,9 @@
 
     setUp(() {
       // Initialize all functions to ones that expect to not be called.
-      onValue = expectAsync1((_) => null, count: 0, id: "onValue");
-      onError = expectAsync2((e, s) => null, count: 0, id: "onError");
-      onCancel = expectAsync0(() => null, count: 0, id: "onCancel");
+      onValue = expectAsync1((_) => null, count: 0, id: 'onValue');
+      onError = expectAsync2((e, s) => null, count: 0, id: 'onError');
+      onCancel = expectAsync0(() => null, count: 0, id: 'onCancel');
       propagateCancel = false;
     });
 
@@ -265,31 +265,31 @@
           propagateCancel: propagateCancel);
     }
 
-    group("original operation completes successfully", () {
-      test("onValue completes successfully", () {
-        onValue = expectAsync1((v) => v.toString(), count: 1, id: "onValue");
+    group('original operation completes successfully', () {
+      test('onValue completes successfully', () {
+        onValue = expectAsync1((v) => v.toString(), count: 1, id: 'onValue');
 
-        expect(runThen().value, completion("1"));
+        expect(runThen().value, completion('1'));
         originalCompleter.complete(1);
       });
 
-      test("onValue throws error", () {
+      test('onValue throws error', () {
         // expectAsync1 only works with functions that do not throw.
-        onValue = (_) => throw "error";
+        onValue = (_) => throw 'error';
 
-        expect(runThen().value, throwsA("error"));
+        expect(runThen().value, throwsA('error'));
         originalCompleter.complete(1);
       });
 
-      test("onValue returns Future that throws error", () {
+      test('onValue returns Future that throws error', () {
         onValue =
-            expectAsync1((v) => Future.error("error"), count: 1, id: "onValue");
+            expectAsync1((v) => Future.error('error'), count: 1, id: 'onValue');
 
-        expect(runThen().value, throwsA("error"));
+        expect(runThen().value, throwsA('error'));
         originalCompleter.complete(1);
       });
 
-      test("and returned operation is canceled with propagateCancel = false",
+      test('and returned operation is canceled with propagateCancel = false',
           () async {
         propagateCancel = false;
 
@@ -300,51 +300,51 @@
       });
     });
 
-    group("original operation completes with error", () {
-      test("onError not set", () {
+    group('original operation completes with error', () {
+      test('onError not set', () {
         onError = null;
 
-        expect(runThen().value, throwsA("error"));
-        originalCompleter.completeError("error");
+        expect(runThen().value, throwsA('error'));
+        originalCompleter.completeError('error');
       });
 
-      test("onError completes successfully", () {
-        onError = expectAsync2((e, s) => "onError caught $e",
-            count: 1, id: "onError");
+      test('onError completes successfully', () {
+        onError = expectAsync2((e, s) => 'onError caught $e',
+            count: 1, id: 'onError');
 
-        expect(runThen().value, completion("onError caught error"));
-        originalCompleter.completeError("error");
+        expect(runThen().value, completion('onError caught error'));
+        originalCompleter.completeError('error');
       });
 
-      test("onError throws", () {
+      test('onError throws', () {
         // expectAsync2 does not work with functions that throw.
-        onError = (e, s) => throw "onError caught $e";
+        onError = (e, s) => throw 'onError caught $e';
 
-        expect(runThen().value, throwsA("onError caught error"));
-        originalCompleter.completeError("error");
+        expect(runThen().value, throwsA('onError caught error'));
+        originalCompleter.completeError('error');
       });
 
-      test("onError returns Future that throws", () {
-        onError = expectAsync2((e, s) => Future.error("onError caught $e"),
-            count: 1, id: "onError");
+      test('onError returns Future that throws', () {
+        onError = expectAsync2((e, s) => Future.error('onError caught $e'),
+            count: 1, id: 'onError');
 
-        expect(runThen().value, throwsA("onError caught error"));
-        originalCompleter.completeError("error");
+        expect(runThen().value, throwsA('onError caught error'));
+        originalCompleter.completeError('error');
       });
 
-      test("and returned operation is canceled with propagateCancel = false",
+      test('and returned operation is canceled with propagateCancel = false',
           () async {
         propagateCancel = false;
 
         runThen().cancel();
 
         // onError should not be called.
-        originalCompleter.completeError("error");
+        originalCompleter.completeError('error');
       });
     });
 
-    group("original operation canceled", () {
-      test("onCancel not set", () {
+    group('original operation canceled', () {
+      test('onCancel not set', () {
         onCancel = null;
 
         final operation = runThen();
@@ -353,32 +353,32 @@
         expect(operation.isCanceled, true);
       });
 
-      test("onCancel completes successfully", () {
-        onCancel = expectAsync0(() => "canceled", count: 1, id: "onCancel");
+      test('onCancel completes successfully', () {
+        onCancel = expectAsync0(() => 'canceled', count: 1, id: 'onCancel');
 
-        expect(runThen().value, completion("canceled"));
+        expect(runThen().value, completion('canceled'));
         originalCompleter.operation.cancel();
       });
 
-      test("onCancel throws error", () {
+      test('onCancel throws error', () {
         // expectAsync0 only works with functions that do not throw.
-        onCancel = () => throw "error";
+        onCancel = () => throw 'error';
 
-        expect(runThen().value, throwsA("error"));
+        expect(runThen().value, throwsA('error'));
         originalCompleter.operation.cancel();
       });
 
-      test("onCancel returns Future that throws error", () {
+      test('onCancel returns Future that throws error', () {
         onCancel =
-            expectAsync0(() => Future.error("error"), count: 1, id: "onCancel");
+            expectAsync0(() => Future.error('error'), count: 1, id: 'onCancel');
 
-        expect(runThen().value, throwsA("error"));
+        expect(runThen().value, throwsA('error'));
         originalCompleter.operation.cancel();
       });
     });
 
-    group("returned operation canceled", () {
-      test("propagateCancel is true", () async {
+    group('returned operation canceled', () {
+      test('propagateCancel is true', () async {
         propagateCancel = true;
 
         await runThen().cancel();
@@ -386,7 +386,7 @@
         expect(originalCompleter.isCanceled, true);
       });
 
-      test("propagateCancel is false", () async {
+      test('propagateCancel is false', () async {
         propagateCancel = false;
 
         await runThen().cancel();
diff --git a/test/future_group_test.dart b/test/future_group_test.dart
index 770a465..f99d06d 100644
--- a/test/future_group_test.dart
+++ b/test/future_group_test.dart
@@ -15,8 +15,8 @@
     futureGroup = FutureGroup();
   });
 
-  group("with no futures", () {
-    test("never completes if nothing happens", () async {
+  group('with no futures', () {
+    test('never completes if nothing happens', () async {
       var completed = false;
       futureGroup.future.then((_) => completed = true);
 
@@ -30,8 +30,8 @@
     });
   });
 
-  group("with a future that already completed", () {
-    test("never completes if nothing happens", () async {
+  group('with a future that already completed', () {
+    test('never completes if nothing happens', () async {
       futureGroup.add(Future.value());
       await flushMicrotasks();
 
@@ -57,12 +57,12 @@
     });
 
     test("completes to that future's error, even if it's not closed", () {
-      futureGroup.add(Future.error("error"));
-      expect(futureGroup.future, throwsA("error"));
+      futureGroup.add(Future.error('error'));
+      expect(futureGroup.future, throwsA('error'));
     });
   });
 
-  test("completes once all contained futures complete", () async {
+  test('completes once all contained futures complete', () async {
     var completer1 = Completer();
     var completer2 = Completer();
     var completer3 = Completer();
@@ -88,7 +88,7 @@
     expect(completed, isTrue);
   });
 
-  test("completes to the values of the futures in order of addition", () {
+  test('completes to the values of the futures in order of addition', () {
     var completer1 = Completer();
     var completer2 = Completer();
     var completer3 = Completer();
@@ -116,13 +116,13 @@
     futureGroup.add(completer2.future);
     futureGroup.add(completer3.future);
 
-    completer2.completeError("error 2");
-    completer1.completeError("error 1");
-    expect(futureGroup.future, throwsA("error 2"));
+    completer2.completeError('error 2');
+    completer1.completeError('error 1');
+    expect(futureGroup.future, throwsA('error 2'));
   });
 
-  group("onIdle:", () {
-    test("emits an event when the last pending future completes", () async {
+  group('onIdle:', () {
+    test('emits an event when the last pending future completes', () async {
       var idle = false;
       futureGroup.onIdle.listen((_) => idle = true);
 
@@ -154,7 +154,7 @@
       expect(futureGroup.isIdle, isTrue);
     });
 
-    test("emits an event each time it becomes idle", () async {
+    test('emits an event each time it becomes idle', () async {
       var idle = false;
       futureGroup.onIdle.listen((_) => idle = true);
 
@@ -180,7 +180,7 @@
       expect(futureGroup.isIdle, isTrue);
     });
 
-    test("emits an event when the group closes", () async {
+    test('emits an event when the group closes', () async {
       // It's important that the order of events here stays consistent over
       // time, since code may rely on it in subtle ways.
       var idle = false;
diff --git a/test/lazy_stream_test.dart b/test/lazy_stream_test.dart
index db1bc94..2affe5b 100644
--- a/test/lazy_stream_test.dart
+++ b/test/lazy_stream_test.dart
@@ -2,19 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
-main() {
-  test("disallows a null callback", () {
+void main() {
+  test('disallows a null callback', () {
     expect(() => LazyStream(null), throwsArgumentError);
   });
 
-  test("calls the callback when the stream is listened", () async {
+  test('calls the callback when the stream is listened', () async {
     var callbackCalled = false;
     var stream = LazyStream(expectAsync0(() {
       callbackCalled = true;
@@ -28,7 +28,7 @@
     expect(callbackCalled, isTrue);
   });
 
-  test("calls the callback when the stream is listened", () async {
+  test('calls the callback when the stream is listened', () async {
     var callbackCalled = false;
     var stream = LazyStream(expectAsync0(() {
       callbackCalled = true;
@@ -42,7 +42,7 @@
     expect(callbackCalled, isTrue);
   });
 
-  test("forwards to a synchronously-provided stream", () async {
+  test('forwards to a synchronously-provided stream', () async {
     var controller = StreamController<int>();
     var stream = LazyStream(expectAsync0(() => controller.stream));
 
@@ -64,7 +64,7 @@
     controller.close();
   });
 
-  test("forwards to an asynchronously-provided stream", () async {
+  test('forwards to an asynchronously-provided stream', () async {
     var controller = StreamController<int>();
     var stream = LazyStream(expectAsync0(() async => controller.stream));
 
diff --git a/test/null_stream_sink_test.dart b/test/null_stream_sink_test.dart
index 33e2655..649cbad 100644
--- a/test/null_stream_sink_test.dart
+++ b/test/null_stream_sink_test.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
 void main() {
-  group("constructors", () {
-    test("done defaults to a completed future", () {
+  group('constructors', () {
+    test('done defaults to a completed future', () {
       var sink = NullStreamSink();
       expect(sink.done, completes);
     });
 
-    test("a custom future may be passed to done", () async {
+    test('a custom future may be passed to done', () async {
       var completer = Completer();
       var sink = NullStreamSink(done: completer.future);
 
@@ -32,30 +32,30 @@
       expect(doneFired, isTrue);
     });
 
-    test("NullStreamSink.error passes an error to done", () {
-      var sink = NullStreamSink.error("oh no");
-      expect(sink.done, throwsA("oh no"));
+    test('NullStreamSink.error passes an error to done', () {
+      var sink = NullStreamSink.error('oh no');
+      expect(sink.done, throwsA('oh no'));
     });
   });
 
-  group("events", () {
-    test("are silently dropped before close", () {
+  group('events', () {
+    test('are silently dropped before close', () {
       var sink = NullStreamSink();
       sink.add(1);
-      sink.addError("oh no");
+      sink.addError('oh no');
     });
 
-    test("throw StateErrors after close", () {
+    test('throw StateErrors after close', () {
       var sink = NullStreamSink();
       expect(sink.close(), completes);
 
       expect(() => sink.add(1), throwsStateError);
-      expect(() => sink.addError("oh no"), throwsStateError);
+      expect(() => sink.addError('oh no'), throwsStateError);
       expect(() => sink.addStream(Stream.empty()), throwsStateError);
     });
 
-    group("addStream", () {
-      test("listens to the stream then cancels immediately", () async {
+    group('addStream', () {
+      test('listens to the stream then cancels immediately', () async {
         var sink = NullStreamSink();
         var canceled = false;
         var controller = StreamController(onCancel: () {
@@ -67,7 +67,7 @@
         expect(canceled, isTrue);
       });
 
-      test("returns the cancel future", () async {
+      test('returns the cancel future', () async {
         var completer = Completer();
         var sink = NullStreamSink();
         var controller = StreamController(onCancel: () => completer.future);
@@ -84,30 +84,30 @@
         expect(addStreamFired, isTrue);
       });
 
-      test("pipes errors from the cancel future through addStream", () async {
+      test('pipes errors from the cancel future through addStream', () async {
         var sink = NullStreamSink();
-        var controller = StreamController(onCancel: () => throw "oh no");
-        expect(sink.addStream(controller.stream), throwsA("oh no"));
+        var controller = StreamController(onCancel: () => throw 'oh no');
+        expect(sink.addStream(controller.stream), throwsA('oh no'));
       });
 
-      test("causes events to throw StateErrors until the future completes",
+      test('causes events to throw StateErrors until the future completes',
           () async {
         var sink = NullStreamSink();
         var future = sink.addStream(Stream.empty());
         expect(() => sink.add(1), throwsStateError);
-        expect(() => sink.addError("oh no"), throwsStateError);
+        expect(() => sink.addError('oh no'), throwsStateError);
         expect(() => sink.addStream(Stream.empty()), throwsStateError);
 
         await future;
         sink.add(1);
-        sink.addError("oh no");
+        sink.addError('oh no');
         expect(sink.addStream(Stream.empty()), completes);
       });
     });
   });
 
-  test("close returns the done future", () {
-    var sink = NullStreamSink.error("oh no");
-    expect(sink.close(), throwsA("oh no"));
+  test('close returns the done future', () {
+    var sink = NullStreamSink.error('oh no');
+    expect(sink.close(), throwsA('oh no'));
   });
 }
diff --git a/test/restartable_timer_test.dart b/test/restartable_timer_test.dart
index c46c87b..41f52ab 100644
--- a/test/restartable_timer_test.dart
+++ b/test/restartable_timer_test.dart
@@ -6,8 +6,8 @@
 import 'package:fake_async/fake_async.dart';
 import 'package:test/test.dart';
 
-main() {
-  test("runs the callback once the duration has elapsed", () {
+void main() {
+  test('runs the callback once the duration has elapsed', () {
     FakeAsync().run((async) {
       var fired = false;
       RestartableTimer(Duration(seconds: 5), () {
@@ -38,7 +38,7 @@
     });
   });
 
-  test("resets the duration if the timer is reset before it fires", () {
+  test('resets the duration if the timer is reset before it fires', () {
     FakeAsync().run((async) {
       var fired = false;
       var timer = RestartableTimer(Duration(seconds: 5), () {
@@ -57,7 +57,7 @@
     });
   });
 
-  test("re-runs the callback if the timer is reset after firing", () {
+  test('re-runs the callback if the timer is reset after firing', () {
     FakeAsync().run((async) {
       var fired = 0;
       var timer = RestartableTimer(Duration(seconds: 5), () {
@@ -77,7 +77,7 @@
     });
   });
 
-  test("runs the callback if the timer is reset after being canceled", () {
+  test('runs the callback if the timer is reset after being canceled', () {
     FakeAsync().run((async) {
       var fired = false;
       var timer = RestartableTimer(Duration(seconds: 5), () {
diff --git a/test/result/result_captureAll_test.dart b/test/result/result_captureAll_test.dart
index c7b688f..ba8305a 100644
--- a/test/result/result_captureAll_test.dart
+++ b/test/result/result_captureAll_test.dart
@@ -2,62 +2,64 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
-import "dart:math" show Random;
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'dart:async';
+import 'dart:math' show Random;
+
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
 final someStack = StackTrace.current;
 Result<int> res(int n) => Result<int>.value(n);
-Result err(n) => ErrorResult("$n", someStack);
+Result err(n) => ErrorResult('$n', someStack);
 
 /// Helper function creating an iterable of futures.
-Iterable<Future<int>> futures(int count, {bool throwWhen(int index)}) sync* {
-  for (int i = 0; i < count; i++) {
+Iterable<Future<int>> futures(int count,
+    {bool Function(int index) throwWhen}) sync* {
+  for (var i = 0; i < count; i++) {
     if (throwWhen != null && throwWhen(i)) {
-      yield Future<int>.error("$i", someStack);
+      yield Future<int>.error('$i', someStack);
     } else {
       yield Future<int>.value(i);
     }
   }
 }
 
-main() {
-  test("empty", () async {
+void main() {
+  test('empty', () async {
     var all = await Result.captureAll<int>(futures(0));
     expect(all, []);
   });
 
-  group("futures only,", () {
-    test("single", () async {
+  group('futures only,', () {
+    test('single', () async {
       var all = await Result.captureAll<int>(futures(1));
       expect(all, [res(0)]);
     });
 
-    test("multiple", () async {
+    test('multiple', () async {
       var all = await Result.captureAll<int>(futures(3));
       expect(all, [res(0), res(1), res(2)]);
     });
 
-    test("error only", () async {
+    test('error only', () async {
       var all =
           await Result.captureAll<int>(futures(1, throwWhen: (_) => true));
       expect(all, [err(0)]);
     });
 
-    test("multiple error only", () async {
+    test('multiple error only', () async {
       var all =
           await Result.captureAll<int>(futures(3, throwWhen: (_) => true));
       expect(all, [err(0), err(1), err(2)]);
     });
 
-    test("mixed error and value", () async {
+    test('mixed error and value', () async {
       var all =
           await Result.captureAll<int>(futures(4, throwWhen: (x) => x.isOdd));
       expect(all, [res(0), err(1), res(2), err(3)]);
     });
 
-    test("completion permutation 1-2-3", () async {
+    test('completion permutation 1-2-3', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
@@ -66,22 +68,22 @@
       await 0;
       cs[1].complete(2);
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
     });
 
-    test("completion permutation 1-3-2", () async {
+    test('completion permutation 1-3-2', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
       cs[0].complete(1);
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
       await 0;
       cs[1].complete(2);
     });
 
-    test("completion permutation 2-1-3", () async {
+    test('completion permutation 2-1-3', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
@@ -90,39 +92,39 @@
       await 0;
       cs[0].complete(1);
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
     });
 
-    test("completion permutation 2-3-1", () async {
+    test('completion permutation 2-3-1', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
       cs[1].complete(2);
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
       await 0;
       cs[0].complete(1);
     });
 
-    test("completion permutation 3-1-2", () async {
+    test('completion permutation 3-1-2', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
       await 0;
       cs[0].complete(1);
       await 0;
       cs[1].complete(2);
     });
 
-    test("completion permutation 3-2-1", () async {
+    test('completion permutation 3-2-1', () async {
       var cs = List.generate(3, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       expect(all, completion([res(1), res(2), err(3)]));
       await 0;
-      cs[2].completeError("3", someStack);
+      cs[2].completeError('3', someStack);
       await 0;
       cs[1].complete(2);
       await 0;
@@ -130,8 +132,8 @@
     });
 
     var seed = Random().nextInt(0x100000000);
-    int n = 25; // max 32, otherwise rnd.nextInt(1<<n) won't work.
-    test("randomized #$n seed:${seed.toRadixString(16)}", () async {
+    var n = 25; // max 32, otherwise rnd.nextInt(1<<n) won't work.
+    test('randomized #$n seed:${seed.toRadixString(16)}', () async {
       var cs = List.generate(n, (_) => Completer<int>());
       var all = Result.captureAll<int>(cs.map((c) => c.future));
       var rnd = Random(seed);
@@ -144,27 +146,27 @@
       var completeFunctions = List<Function()>.generate(n, (i) {
         var c = cs[i];
         return () =>
-            throws(i) ? c.completeError("$i", someStack) : c.complete(i);
+            throws(i) ? c.completeError('$i', someStack) : c.complete(i);
       });
       completeFunctions.shuffle(rnd);
-      for (int i = 0; i < n; i++) {
+      for (var i = 0; i < n; i++) {
         await 0;
         completeFunctions[i]();
       }
     });
   });
-  group("values only,", () {
-    test("single", () async {
+  group('values only,', () {
+    test('single', () async {
       var all = await Result.captureAll<int>(<int>[1]);
       expect(all, [res(1)]);
     });
-    test("multiple", () async {
+    test('multiple', () async {
       var all = await Result.captureAll<int>(<int>[1, 2, 3]);
       expect(all, [res(1), res(2), res(3)]);
     });
   });
-  group("mixed futures and values,", () {
-    test("no error", () async {
+  group('mixed futures and values,', () {
+    test('no error', () async {
       var all = await Result.captureAll<int>(<FutureOr<int>>[
         1,
         Future<int>(() => 2),
@@ -173,12 +175,12 @@
       ]);
       expect(all, [res(1), res(2), res(3), res(4)]);
     });
-    test("error", () async {
+    test('error', () async {
       var all = await Result.captureAll<int>(<FutureOr<int>>[
         1,
         Future<int>(() => 2),
         3,
-        Future<int>(() async => await Future.error("4", someStack)),
+        Future<int>(() async => await Future.error('4', someStack)),
         Future<int>.value(5)
       ]);
       expect(all, [res(1), res(2), res(3), err(4), res(5)]);
diff --git a/test/result/result_flattenAll_test.dart b/test/result/result_flattenAll_test.dart
index 4a049eb..890b2d0 100644
--- a/test/result/result_flattenAll_test.dart
+++ b/test/result/result_flattenAll_test.dart
@@ -2,16 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
 final someStack = StackTrace.current;
 Result<T> res<T>(T n) => Result<T>.value(n);
-Result err(n) => ErrorResult("$n", someStack);
+Result err(n) => ErrorResult('$n', someStack);
 
 /// Helper function creating an iterable of results.
-Iterable<Result<int>> results(int count, {bool throwWhen(int index)}) sync* {
-  for (int i = 0; i < count; i++) {
+Iterable<Result<int>> results(int count,
+    {bool Function(int index) throwWhen}) sync* {
+  for (var i = 0; i < count; i++) {
     if (throwWhen != null && throwWhen(i)) {
       yield err(i);
     } else {
@@ -20,8 +21,8 @@
   }
 }
 
-main() {
-  expectAll(result, expectation) {
+void main() {
+  void expectAll(result, expectation) {
     if (expectation.isError) {
       expect(result, expectation);
     } else {
@@ -30,24 +31,24 @@
     }
   }
 
-  test("empty", () {
+  test('empty', () {
     expectAll(Result.flattenAll<int>(results(0)), res([]));
   });
-  test("single value", () {
+  test('single value', () {
     expectAll(Result.flattenAll<int>(results(1)), res([0]));
   });
-  test("single error", () {
+  test('single error', () {
     expectAll(
         Result.flattenAll<int>(results(1, throwWhen: (_) => true)), err(0));
   });
-  test("multiple values", () {
+  test('multiple values', () {
     expectAll(Result.flattenAll<int>(results(5)), res([0, 1, 2, 3, 4]));
   });
-  test("multiple errors", () {
+  test('multiple errors', () {
     expectAll(Result.flattenAll<int>(results(5, throwWhen: (x) => x.isOdd)),
         err(1)); // First error is result.
   });
-  test("error last", () {
+  test('error last', () {
     expectAll(
         Result.flattenAll<int>(results(5, throwWhen: (x) => x == 4)), err(4));
   });
diff --git a/test/result/result_test.dart b/test/result/result_test.dart
index a33c1ba..92fc6b0 100644
--- a/test/result/result_test.dart
+++ b/test/result/result_test.dart
@@ -2,83 +2,83 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
-import "dart:collection";
+import 'dart:async';
+import 'dart:collection';
 
-import "package:async/async.dart";
-import "package:stack_trace/stack_trace.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:stack_trace/stack_trace.dart';
+import 'package:test/test.dart';
 
 void main() {
   var stack = Trace.current();
 
-  test("create result value", () {
-    Result<int> result = Result<int>.value(42);
+  test('create result value', () {
+    var result = Result<int>.value(42);
     expect(result.isValue, isTrue);
     expect(result.isError, isFalse);
     ValueResult value = result.asValue;
     expect(value.value, equals(42));
   });
 
-  test("create result value 2", () {
+  test('create result value 2', () {
     Result<int> result = ValueResult<int>(42);
     expect(result.isValue, isTrue);
     expect(result.isError, isFalse);
-    ValueResult<int> value = result.asValue;
+    var value = result.asValue;
     expect(value.value, equals(42));
   });
 
-  test("create result error", () {
-    Result<bool> result = Result<bool>.error("BAD", stack);
+  test('create result error', () {
+    var result = Result<bool>.error('BAD', stack);
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
-    ErrorResult error = result.asError;
-    expect(error.error, equals("BAD"));
+    var error = result.asError;
+    expect(error.error, equals('BAD'));
     expect(error.stackTrace, same(stack));
   });
 
-  test("create result error 2", () {
-    Result<bool> result = ErrorResult("BAD", stack);
+  test('create result error 2', () {
+    var result = ErrorResult('BAD', stack);
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
-    ErrorResult error = result.asError;
-    expect(error.error, equals("BAD"));
+    var error = result.asError;
+    expect(error.error, equals('BAD'));
     expect(error.stackTrace, same(stack));
   });
 
-  test("create result error no stack", () {
-    Result<bool> result = Result<bool>.error("BAD");
+  test('create result error no stack', () {
+    var result = Result<bool>.error('BAD');
     expect(result.isValue, isFalse);
     expect(result.isError, isTrue);
-    ErrorResult error = result.asError;
-    expect(error.error, equals("BAD"));
+    var error = result.asError;
+    expect(error.error, equals('BAD'));
     expect(error.stackTrace, isNull);
   });
 
-  test("complete with value", () {
+  test('complete with value', () {
     Result<int> result = ValueResult<int>(42);
     var c = Completer<int>();
     c.future.then(expectAsync1((int v) {
       expect(v, equals(42));
     }), onError: (e, s) {
-      fail("Unexpected error");
+      fail('Unexpected error');
     });
     result.complete(c);
   });
 
-  test("complete with error", () {
-    Result<bool> result = ErrorResult("BAD", stack);
+  test('complete with error', () {
+    Result<bool> result = ErrorResult('BAD', stack);
     var c = Completer<bool>();
     c.future.then((bool v) {
-      fail("Unexpected value $v");
+      fail('Unexpected value $v');
     }, onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }));
     result.complete(c);
   });
 
-  test("add sink value", () {
+  test('add sink value', () {
     var result = ValueResult<int>(42);
     EventSink<int> sink = TestSink(onData: expectAsync1((v) {
       expect(v, equals(42));
@@ -86,97 +86,95 @@
     result.addTo(sink);
   });
 
-  test("add sink error", () {
-    Result<bool> result = ErrorResult("BAD", stack);
+  test('add sink error', () {
+    Result<bool> result = ErrorResult('BAD', stack);
     EventSink<bool> sink = TestSink(onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }));
     result.addTo(sink);
   });
 
-  test("value as future", () {
+  test('value as future', () {
     Result<int> result = ValueResult<int>(42);
     result.asFuture.then(expectAsync1((int v) {
       expect(v, equals(42));
     }), onError: (e, s) {
-      fail("Unexpected error");
+      fail('Unexpected error');
     });
   });
 
-  test("error as future", () {
-    Result<bool> result = ErrorResult("BAD", stack);
+  test('error as future', () {
+    Result<bool> result = ErrorResult('BAD', stack);
     result.asFuture.then((bool v) {
-      fail("Unexpected value $v");
+      fail('Unexpected value $v');
     }, onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }));
   });
 
-  test("capture future value", () {
-    Future<int> value = Future<int>.value(42);
+  test('capture future value', () {
+    var value = Future<int>.value(42);
     Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isTrue);
       expect(result.isError, isFalse);
-      ValueResult value = result.asValue;
+      var value = result.asValue;
       expect(value.value, equals(42));
     }), onError: (e, s) {
-      fail("Unexpected error: $e");
+      fail('Unexpected error: $e');
     });
   });
 
-  test("capture future error", () {
-    Future<bool> value = Future<bool>.error("BAD", stack);
+  test('capture future error', () {
+    var value = Future<bool>.error('BAD', stack);
     Result.capture(value).then(expectAsync1((Result result) {
       expect(result.isValue, isFalse);
       expect(result.isError, isTrue);
-      ErrorResult error = result.asError;
-      expect(error.error, equals("BAD"));
+      var error = result.asError;
+      expect(error.error, equals('BAD'));
       expect(error.stackTrace, same(stack));
     }), onError: (e, s) {
-      fail("Unexpected error: $e");
+      fail('Unexpected error: $e');
     });
   });
 
-  test("release future value", () {
-    Future<Result<int>> future =
-        Future<Result<int>>.value(Result<int>.value(42));
+  test('release future value', () {
+    var future = Future<Result<int>>.value(Result<int>.value(42));
     Result.release(future).then(expectAsync1((v) {
       expect(v, equals(42));
     }), onError: (e, s) {
-      fail("Unexpected error: $e");
+      fail('Unexpected error: $e');
     });
   });
 
-  test("release future error", () {
+  test('release future error', () {
     // An error in the result is unwrapped and reified by release.
-    Future<Result<bool>> future =
-        Future<Result<bool>>.value(Result<bool>.error("BAD", stack));
+    var future = Future<Result<bool>>.value(Result<bool>.error('BAD', stack));
     Result.release(future).then((v) {
-      fail("Unexpected value: $v");
+      fail('Unexpected value: $v');
     }, onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }));
   });
 
-  test("release future real error", () {
+  test('release future real error', () {
     // An error in the error lane is passed through by release.
-    Future<Result<bool>> future = Future<Result<bool>>.error("BAD", stack);
+    var future = Future<Result<bool>>.error('BAD', stack);
     Result.release(future).then((v) {
-      fail("Unexpected value: $v");
+      fail('Unexpected value: $v');
     }, onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }));
   });
 
-  test("capture stream", () {
+  test('capture stream', () {
     var c = StreamController<int>();
     var stream = Result.captureStream(c.stream);
     var expectedList = Queue.from(
-        [Result.value(42), Result.error("BAD", stack), Result.value(37)]);
+        [Result.value(42), Result.error('BAD', stack), Result.value(37)]);
     void listener(Result actual) {
       expect(expectedList.isEmpty, isFalse);
       expectResult(actual, expectedList.removeFirst());
@@ -185,21 +183,21 @@
     stream.listen(expectAsync1(listener, count: 3),
         onDone: expectAsync0(() {}), cancelOnError: true);
     c.add(42);
-    c.addError("BAD", stack);
+    c.addError('BAD', stack);
     c.add(37);
     c.close();
   });
 
-  test("release stream", () {
-    StreamController<Result<int>> c = StreamController<Result<int>>();
-    Stream<int> stream = Result.releaseStream(c.stream);
+  test('release stream', () {
+    var c = StreamController<Result<int>>();
+    var stream = Result.releaseStream(c.stream);
     var events = [
       Result<int>.value(42),
-      Result<int>.error("BAD", stack),
+      Result<int>.error('BAD', stack),
       Result<int>.value(37)
     ];
     // Expect the data events, and an extra error event.
-    var expectedList = Queue.from(events)..add(Result.error("BAD2", stack));
+    var expectedList = Queue.from(events)..add(Result.error('BAD2', stack));
 
     void dataListener(int v) {
       expect(expectedList.isEmpty, isFalse);
@@ -219,95 +217,93 @@
     stream.listen(expectAsync1(dataListener, count: 2),
         onError: expectAsync2(errorListener, count: 2),
         onDone: expectAsync0(() {}));
-    for (Result<int> result in events) {
+    for (var result in events) {
       c.add(result); // Result value or error in data line.
     }
-    c.addError("BAD2", stack); // Error in error line.
+    c.addError('BAD2', stack); // Error in error line.
     c.close();
   });
 
-  test("release stream cancel on error", () {
-    StreamController<Result<int>> c = StreamController<Result<int>>();
-    Stream<int> stream = Result.releaseStream(c.stream);
+  test('release stream cancel on error', () {
+    var c = StreamController<Result<int>>();
+    var stream = Result.releaseStream(c.stream);
     stream.listen(expectAsync1((v) {
       expect(v, equals(42));
     }), onError: expectAsync2((e, s) {
-      expect(e, equals("BAD"));
+      expect(e, equals('BAD'));
       expect(s, same(stack));
     }), onDone: () {
-      fail("Unexpected done event");
+      fail('Unexpected done event');
     }, cancelOnError: true);
     c.add(Result.value(42));
-    c.add(Result.error("BAD", stack));
+    c.add(Result.error('BAD', stack));
     c.add(Result.value(37));
     c.close();
   });
 
-  test("flatten error 1", () {
-    Result<int> error = Result<int>.error("BAD", stack);
-    Result<int> flattened =
-        Result.flatten(Result<Result<int>>.error("BAD", stack));
+  test('flatten error 1', () {
+    var error = Result<int>.error('BAD', stack);
+    var flattened = Result.flatten(Result<Result<int>>.error('BAD', stack));
     expectResult(flattened, error);
   });
 
-  test("flatten error 2", () {
-    Result<int> error = Result<int>.error("BAD", stack);
-    Result<Result<int>> result = Result<Result<int>>.value(error);
-    Result<int> flattened = Result.flatten(result);
+  test('flatten error 2', () {
+    var error = Result<int>.error('BAD', stack);
+    var result = Result<Result<int>>.value(error);
+    var flattened = Result.flatten(result);
     expectResult(flattened, error);
   });
 
-  test("flatten value", () {
-    Result<Result<int>> result =
-        Result<Result<int>>.value(Result<int>.value(42));
+  test('flatten value', () {
+    var result = Result<Result<int>>.value(Result<int>.value(42));
     expectResult(Result.flatten(result), Result<int>.value(42));
   });
 
-  test("handle unary", () {
-    ErrorResult result = Result.error("error", stack);
-    bool called = false;
+  test('handle unary', () {
+    ErrorResult result = Result.error('error', stack);
+    var called = false;
     result.handle((error) {
       called = true;
-      expect(error, "error");
+      expect(error, 'error');
     });
     expect(called, isTrue);
   });
 
-  test("handle binary", () {
-    ErrorResult result = Result.error("error", stack);
-    bool called = false;
+  test('handle binary', () {
+    ErrorResult result = Result.error('error', stack);
+    var called = false;
     result.handle((error, stackTrace) {
       called = true;
-      expect(error, "error");
+      expect(error, 'error');
       expect(stackTrace, same(stack));
     });
     expect(called, isTrue);
   });
 
-  test("handle unary and binary", () {
-    ErrorResult result = Result.error("error", stack);
-    bool called = false;
+  test('handle unary and binary', () {
+    ErrorResult result = Result.error('error', stack);
+    var called = false;
     result.handle((error, [stackTrace]) {
       called = true;
-      expect(error, "error");
+      expect(error, 'error');
       expect(stackTrace, same(stack));
     });
     expect(called, isTrue);
   });
 
-  test("handle neither unary nor binary", () {
-    ErrorResult result = Result.error("error", stack);
-    expect(() => result.handle(() => fail("unreachable")), throwsA(anything));
-    expect(() => result.handle((a, b, c) => fail("unreachable")),
+  test('handle neither unary nor binary', () {
+    ErrorResult result = Result.error('error', stack);
+    expect(() => result.handle(() => fail('unreachable')), throwsA(anything));
+    expect(() => result.handle((a, b, c) => fail('unreachable')),
         throwsA(anything));
-    expect(() => result.handle((a, b, {c}) => fail("unreachable")),
+    expect(() => result.handle((a, b, {c}) => fail('unreachable')),
         throwsA(anything));
-    expect(() => result.handle((a, {b}) => fail("unreachable")),
+    expect(() => result.handle((a, {b}) => fail('unreachable')),
         throwsA(anything));
-    expect(() => result.handle(({a, b}) => fail("unreachable")),
+    expect(() => result.handle(({a, b}) => fail('unreachable')),
         throwsA(anything));
     expect(
-        () => result.handle(({a}) => fail("unreachable")), throwsA(anything));
+        () => result.handle(({a}) => fail('unreachable')), throwsA(anything));
   });
 }
 
@@ -323,36 +319,39 @@
 }
 
 class TestSink<T> implements EventSink<T> {
-  final Function onData;
-  final Function onError;
-  final Function onDone;
+  final void Function(T) onData;
+  final void Function(dynamic, StackTrace) onError;
+  final void Function() onDone;
 
   TestSink(
-      {void this.onData(T data) = _nullData,
-      void this.onError(e, StackTrace s) = _nullError,
-      void this.onDone() = _nullDone});
+      {this.onData = _nullData,
+      this.onError = _nullError,
+      this.onDone = _nullDone});
 
+  @override
   void add(T value) {
     onData(value);
   }
 
+  @override
   void addError(error, [StackTrace stack]) {
     onError(error, stack);
   }
 
+  @override
   void close() {
     onDone();
   }
 
   static void _nullData(value) {
-    fail("Unexpected sink add: $value");
+    fail('Unexpected sink add: $value');
   }
 
   static void _nullError(e, StackTrace s) {
-    fail("Unexpected sink addError: $e");
+    fail('Unexpected sink addError: $e');
   }
 
   static void _nullDone() {
-    fail("Unepxected sink close");
+    fail('Unepxected sink close');
   }
 }
diff --git a/test/stream_completer_test.dart b/test/stream_completer_test.dart
index fb1f4a5..2cf6728 100644
--- a/test/stream_completer_test.dart
+++ b/test/stream_completer_test.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart" show StreamCompleter;
-import "package:test/test.dart";
+import 'package:async/async.dart' show StreamCompleter;
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
-main() {
-  test("a stream is linked before listening", () async {
+void main() {
+  test('a stream is linked before listening', () async {
     var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     expect(completer.stream.toList(), completion([1, 2, 3, 4]));
   });
 
-  test("listened to before a stream is linked", () async {
+  test('listened to before a stream is linked', () async {
     var completer = StreamCompleter();
     var done = completer.stream.toList();
     await flushMicrotasks();
@@ -32,7 +32,7 @@
     completer.setSourceStream(UnusableStream()); // Doesn't throw.
   });
 
-  test("listen and pause before linking stream", () async {
+  test('listen and pause before linking stream', () async {
     var controller = StreamCompleter();
     var events = [];
     var subscription = controller.stream.listen(events.add);
@@ -55,7 +55,7 @@
     expect(events, [1, 2, 3, 4]);
   });
 
-  test("pause more than once", () async {
+  test('pause more than once', () async {
     var completer = StreamCompleter();
     var events = [];
     var subscription = completer.stream.listen(events.add);
@@ -64,7 +64,7 @@
     subscription.pause();
     subscription.pause();
     completer.setSourceStream(createStream());
-    for (int i = 0; i < 3; i++) {
+    for (var i = 0; i < 3; i++) {
       await flushMicrotasks();
       expect(events, []);
       subscription.resume();
@@ -73,7 +73,7 @@
     expect(events, [1, 2, 3, 4]);
   });
 
-  test("cancel new stream before source is done", () async {
+  test('cancel new stream before source is done', () async {
     var completer = StreamCompleter();
     var lastEvent = -1;
     var controller = StreamController();
@@ -85,8 +85,8 @@
         subscription.cancel();
       }
     },
-        onError: unreachable("error"),
-        onDone: unreachable("done"),
+        onError: unreachable('error'),
+        onDone: unreachable('done'),
         cancelOnError: true);
     completer.setSourceStream(controller.stream);
     expect(controller.hasListener, isTrue);
@@ -105,20 +105,20 @@
     expect(controller.hasListener, isFalse);
   });
 
-  test("complete with setEmpty before listening", () async {
+  test('complete with setEmpty before listening', () async {
     var completer = StreamCompleter();
     completer.setEmpty();
     var done = Completer();
-    completer.stream.listen(unreachable("data"),
-        onError: unreachable("error"), onDone: done.complete);
+    completer.stream.listen(unreachable('data'),
+        onError: unreachable('error'), onDone: done.complete);
     await done.future;
   });
 
-  test("complete with setEmpty after listening", () async {
+  test('complete with setEmpty after listening', () async {
     var completer = StreamCompleter();
     var done = Completer();
-    completer.stream.listen(unreachable("data"),
-        onError: unreachable("error"), onDone: done.complete);
+    completer.stream.listen(unreachable('data'),
+        onError: unreachable('error'), onDone: done.complete);
     completer.setEmpty();
     await done.future;
   });
@@ -138,7 +138,7 @@
     await subscription.asFuture();
   });
 
-  test("cancelOnError true when listening before linking stream", () async {
+  test('cancelOnError true when listening before linking stream', () async {
     var completer = StreamCompleter();
     Object lastEvent = -1;
     var controller = StreamController();
@@ -146,9 +146,9 @@
       expect(value, lessThan(3));
       lastEvent = value;
     }, onError: (value) {
-      expect(value, "3");
+      expect(value, '3');
       lastEvent = value;
-    }, onDone: unreachable("done"), cancelOnError: true);
+    }, onDone: unreachable('done'), cancelOnError: true);
     completer.setSourceStream(controller.stream);
     expect(controller.hasListener, isTrue);
 
@@ -164,14 +164,14 @@
     await flushMicrotasks();
     expect(lastEvent, 2);
     expect(controller.hasListener, isTrue);
-    controller.addError("3");
+    controller.addError('3');
 
     await flushMicrotasks();
-    expect(lastEvent, "3");
+    expect(lastEvent, '3');
     expect(controller.hasListener, isFalse);
   });
 
-  test("cancelOnError true when listening after linking stream", () async {
+  test('cancelOnError true when listening after linking stream', () async {
     var completer = StreamCompleter();
     Object lastEvent = -1;
     var controller = StreamController();
@@ -183,9 +183,9 @@
       expect(value, lessThan(3));
       lastEvent = value;
     }, onError: (value) {
-      expect(value, "3");
+      expect(value, '3');
       lastEvent = value;
-    }, onDone: unreachable("done"), cancelOnError: true);
+    }, onDone: unreachable('done'), cancelOnError: true);
 
     expect(controller.hasListener, isTrue);
 
@@ -197,13 +197,13 @@
     await flushMicrotasks();
     expect(lastEvent, 2);
     expect(controller.hasListener, isTrue);
-    controller.addError("3");
+    controller.addError('3');
 
     await flushMicrotasks();
     expect(controller.hasListener, isFalse);
   });
 
-  test("linking a stream after setSourceStream before listen", () async {
+  test('linking a stream after setSourceStream before listen', () async {
     var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
@@ -214,7 +214,7 @@
     expect(() => completer.setEmpty(), throwsStateError);
   });
 
-  test("linking a stream after setSourceStream after listen", () async {
+  test('linking a stream after setSourceStream after listen', () async {
     var completer = StreamCompleter();
     var list = completer.stream.toList();
     completer.setSourceStream(createStream());
@@ -226,7 +226,7 @@
     expect(() => completer.setEmpty(), throwsStateError);
   });
 
-  test("linking a stream after setEmpty before listen", () async {
+  test('linking a stream after setEmpty before listen', () async {
     var completer = StreamCompleter();
     completer.setEmpty();
     expect(() => completer.setSourceStream(createStream()), throwsStateError);
@@ -237,7 +237,7 @@
     expect(() => completer.setEmpty(), throwsStateError);
   });
 
-  test("linking a stream after setEmpty() after listen", () async {
+  test('linking a stream after setEmpty() after listen', () async {
     var completer = StreamCompleter();
     var list = completer.stream.toList();
     completer.setEmpty();
@@ -249,7 +249,7 @@
     expect(() => completer.setEmpty(), throwsStateError);
   });
 
-  test("listening more than once after setting stream", () async {
+  test('listening more than once after setting stream', () async {
     var completer = StreamCompleter();
     completer.setSourceStream(createStream());
     var list = completer.stream.toList();
@@ -258,19 +258,19 @@
     expect(() => completer.stream.toList(), throwsStateError);
   });
 
-  test("listening more than once before setting stream", () async {
+  test('listening more than once before setting stream', () async {
     var completer = StreamCompleter();
     completer.stream.toList();
     expect(() => completer.stream.toList(), throwsStateError);
   });
 
-  test("setting onData etc. before and after setting stream", () async {
+  test('setting onData etc. before and after setting stream', () async {
     var completer = StreamCompleter();
     var controller = StreamController();
     var subscription = completer.stream.listen(null);
     Object lastEvent = 0;
     subscription.onData((value) => lastEvent = value);
-    subscription.onError((value) => lastEvent = "$value");
+    subscription.onError((value) => lastEvent = '$value');
     subscription.onDone(() => lastEvent = -1);
     completer.setSourceStream(controller.stream);
     await flushMicrotasks();
@@ -279,24 +279,24 @@
     expect(lastEvent, 1);
     controller.addError(2);
     await flushMicrotasks();
-    expect(lastEvent, "2");
+    expect(lastEvent, '2');
     subscription.onData((value) => lastEvent = -value);
-    subscription.onError((value) => lastEvent = "${-value}");
+    subscription.onError((value) => lastEvent = '${-value}');
     controller.add(1);
     await flushMicrotasks();
     expect(lastEvent, -1);
     controller.addError(2);
     await flushMicrotasks();
-    expect(lastEvent, "-2");
+    expect(lastEvent, '-2');
     controller.close();
     await flushMicrotasks();
     expect(lastEvent, -1);
   });
 
-  test("pause w/ resume future accross setting stream", () async {
+  test('pause w/ resume future accross setting stream', () async {
     var completer = StreamCompleter();
     var resume = Completer();
-    var subscription = completer.stream.listen(unreachable("data"));
+    var subscription = completer.stream.listen(unreachable('data'));
     subscription.pause(resume.future);
     await flushMicrotasks();
     completer.setSourceStream(createStream());
@@ -308,43 +308,43 @@
     expect(events, [1, 2, 3, 4]);
   });
 
-  test("asFuture with error accross setting stream", () async {
+  test('asFuture with error accross setting stream', () async {
     var completer = StreamCompleter();
     var controller = StreamController();
     var subscription =
-        completer.stream.listen(unreachable("data"), cancelOnError: false);
+        completer.stream.listen(unreachable('data'), cancelOnError: false);
     var done = subscription.asFuture();
     expect(controller.hasListener, isFalse);
     completer.setSourceStream(controller.stream);
     await flushMicrotasks();
     expect(controller.hasListener, isTrue);
     controller.addError(42);
-    await done.then(unreachable("data"), onError: (error) {
+    await done.then(unreachable('data'), onError: (error) {
       expect(error, 42);
     });
     expect(controller.hasListener, isFalse);
   });
 
-  group("setError()", () {
-    test("produces a stream that emits a single error", () {
+  group('setError()', () {
+    test('produces a stream that emits a single error', () {
       var completer = StreamCompleter();
-      completer.stream.listen(unreachable("data"),
+      completer.stream.listen(unreachable('data'),
           onError: expectAsync2((error, stackTrace) {
-        expect(error, equals("oh no"));
+        expect(error, equals('oh no'));
       }), onDone: expectAsync0(() {}));
 
-      completer.setError("oh no");
+      completer.setError('oh no');
     });
 
-    test("produces a stream that emits a single error on a later listen",
+    test('produces a stream that emits a single error on a later listen',
         () async {
       var completer = StreamCompleter();
-      completer.setError("oh no");
+      completer.setError('oh no');
       await flushMicrotasks();
 
-      completer.stream.listen(unreachable("data"),
+      completer.stream.listen(unreachable('data'),
           onError: expectAsync2((error, stackTrace) {
-        expect(error, equals("oh no"));
+        expect(error, equals('oh no'));
       }), onDone: expectAsync0(() {}));
     });
   });
diff --git a/test/stream_group_test.dart b/test/stream_group_test.dart
index 799d998..690fbc1 100644
--- a/test/stream_group_test.dart
+++ b/test/stream_group_test.dart
@@ -7,22 +7,22 @@
 import 'package:async/async.dart';
 import 'package:test/test.dart';
 
-main() {
-  group("single-subscription", () {
+void main() {
+  group('single-subscription', () {
     StreamGroup<String> streamGroup;
     setUp(() {
       streamGroup = StreamGroup<String>();
     });
 
-    test("buffers events from multiple sources", () async {
+    test('buffers events from multiple sources', () async {
       var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
-      controller1.add("first");
+      controller1.add('first');
       controller1.close();
 
       var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
-      controller2.add("second");
+      controller2.add('second');
       controller2.close();
 
       await flushMicrotasks();
@@ -30,18 +30,18 @@
       expect(streamGroup.close(), completes);
 
       expect(streamGroup.stream.toList(),
-          completion(unorderedEquals(["first", "second"])));
+          completion(unorderedEquals(['first', 'second'])));
     });
 
-    test("buffers errors from multiple sources", () async {
+    test('buffers errors from multiple sources', () async {
       var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
-      controller1.addError("first");
+      controller1.addError('first');
       controller1.close();
 
       var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
-      controller2.addError("second");
+      controller2.addError('second');
       controller2.close();
 
       await flushMicrotasks();
@@ -50,21 +50,21 @@
 
       var transformed = streamGroup.stream.transform(
           StreamTransformer<String, String>.fromHandlers(
-              handleError: (error, _, sink) => sink.add("error: $error")));
+              handleError: (error, _, sink) => sink.add('error: $error')));
       expect(transformed.toList(),
-          completion(equals(["error: first", "error: second"])));
+          completion(equals(['error: first', 'error: second'])));
     });
 
-    test("buffers events and errors together", () async {
+    test('buffers events and errors together', () async {
       var controller = StreamController<String>();
       streamGroup.add(controller.stream);
 
-      controller.add("first");
-      controller.addError("second");
-      controller.add("third");
-      controller.addError("fourth");
-      controller.addError("fifth");
-      controller.add("sixth");
+      controller.add('first');
+      controller.addError('second');
+      controller.add('third');
+      controller.addError('fourth');
+      controller.addError('fifth');
+      controller.add('sixth');
       controller.close();
 
       await flushMicrotasks();
@@ -73,17 +73,17 @@
 
       var transformed = streamGroup.stream.transform(
           StreamTransformer<String, String>.fromHandlers(
-              handleData: (data, sink) => sink.add("data: $data"),
-              handleError: (error, _, sink) => sink.add("error: $error")));
+              handleData: (data, sink) => sink.add('data: $data'),
+              handleError: (error, _, sink) => sink.add('error: $error')));
       expect(
           transformed.toList(),
           completion(equals([
-            "data: first",
-            "error: second",
-            "data: third",
-            "error: fourth",
-            "error: fifth",
-            "data: sixth"
+            'data: first',
+            'error: second',
+            'data: third',
+            'error: fourth',
+            'error: fifth',
+            'data: sixth'
           ])));
     });
 
@@ -92,10 +92,10 @@
       streamGroup.add(controller.stream);
 
       expect(
-          streamGroup.stream.toList(), completion(equals(["first", "second"])));
+          streamGroup.stream.toList(), completion(equals(['first', 'second'])));
 
-      controller.add("first");
-      controller.add("second");
+      controller.add('first');
+      controller.add('second');
       controller.close();
 
       expect(streamGroup.close(), completes);
@@ -105,8 +105,8 @@
       var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
-      controller.add("first");
-      controller.add("second");
+      controller.add('first');
+      controller.add('second');
       controller.close();
 
       await flushMicrotasks();
@@ -115,7 +115,7 @@
       expect(streamGroup.stream.toList(), completion(isEmpty));
     });
 
-    test("when paused, buffers events from a broadcast stream", () async {
+    test('when paused, buffers events from a broadcast stream', () async {
       var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
 
@@ -123,8 +123,8 @@
       var subscription = streamGroup.stream.listen(events.add);
       subscription.pause();
 
-      controller.add("first");
-      controller.add("second");
+      controller.add('first');
+      controller.add('second');
       controller.close();
       await flushMicrotasks();
 
@@ -132,7 +132,7 @@
       expect(streamGroup.close(), completes);
       await flushMicrotasks();
 
-      expect(events, equals(["first", "second"]));
+      expect(events, equals(['first', 'second']));
     });
 
     test("emits events from a broadcast stream once there's a listener", () {
@@ -140,26 +140,26 @@
       streamGroup.add(controller.stream);
 
       expect(
-          streamGroup.stream.toList(), completion(equals(["first", "second"])));
+          streamGroup.stream.toList(), completion(equals(['first', 'second'])));
 
-      controller.add("first");
-      controller.add("second");
+      controller.add('first');
+      controller.add('second');
       controller.close();
 
       expect(streamGroup.close(), completes);
     });
 
-    test("forwards cancel errors", () async {
+    test('forwards cancel errors', () async {
       var subscription = streamGroup.stream.listen(null);
 
-      var controller = StreamController<String>(onCancel: () => throw "error");
+      var controller = StreamController<String>(onCancel: () => throw 'error');
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
-      expect(subscription.cancel(), throwsA("error"));
+      expect(subscription.cancel(), throwsA('error'));
     });
 
-    test("forwards a cancel future", () async {
+    test('forwards a cancel future', () async {
       var subscription = streamGroup.stream.listen(null);
 
       var completer = Completer();
@@ -180,8 +180,8 @@
     });
 
     test(
-        "add() while active pauses the stream if the group is paused, then "
-        "resumes once the group resumes", () async {
+        'add() while active pauses the stream if the group is paused, then '
+        'resumes once the group resumes', () async {
       var subscription = streamGroup.stream.listen(null);
       await flushMicrotasks();
 
@@ -201,13 +201,13 @@
       expect(paused, isFalse);
     });
 
-    group("add() while canceled", () {
+    group('add() while canceled', () {
       setUp(() async {
         streamGroup.stream.listen(null).cancel();
         await flushMicrotasks();
       });
 
-      test("immediately listens to and cancels the stream", () async {
+      test('immediately listens to and cancels the stream', () async {
         var listened = false;
         var canceled = false;
         var controller = StreamController<String>(onListen: () {
@@ -223,14 +223,14 @@
         expect(canceled, isTrue);
       });
 
-      test("forwards cancel errors", () {
+      test('forwards cancel errors', () {
         var controller =
-            StreamController<String>(onCancel: () => throw "error");
+            StreamController<String>(onCancel: () => throw 'error');
 
-        expect(streamGroup.add(controller.stream), throwsA("error"));
+        expect(streamGroup.add(controller.stream), throwsA('error'));
       });
 
-      test("forwards a cancel future", () async {
+      test('forwards a cancel future', () async {
         var completer = Completer();
         var controller =
             StreamController<String>(onCancel: () => completer.future);
@@ -248,21 +248,21 @@
     });
   });
 
-  group("broadcast", () {
+  group('broadcast', () {
     StreamGroup<String> streamGroup;
     setUp(() {
       streamGroup = StreamGroup<String>.broadcast();
     });
 
-    test("buffers events from multiple sources", () async {
+    test('buffers events from multiple sources', () async {
       var controller1 = StreamController<String>();
       streamGroup.add(controller1.stream);
-      controller1.add("first");
+      controller1.add('first');
       controller1.close();
 
       var controller2 = StreamController<String>();
       streamGroup.add(controller2.stream);
-      controller2.add("second");
+      controller2.add('second');
       controller2.close();
 
       await flushMicrotasks();
@@ -270,7 +270,7 @@
       expect(streamGroup.close(), completes);
 
       expect(
-          streamGroup.stream.toList(), completion(equals(["first", "second"])));
+          streamGroup.stream.toList(), completion(equals(['first', 'second'])));
     });
 
     test("emits events from multiple sources once there's a listener", () {
@@ -281,10 +281,10 @@
       streamGroup.add(controller2.stream);
 
       expect(
-          streamGroup.stream.toList(), completion(equals(["first", "second"])));
+          streamGroup.stream.toList(), completion(equals(['first', 'second'])));
 
-      controller1.add("first");
-      controller2.add("second");
+      controller1.add('first');
+      controller2.add('second');
       controller1.close();
       controller2.close();
 
@@ -299,8 +299,8 @@
       streamGroup.stream.listen(null).cancel();
       await flushMicrotasks();
 
-      controller.add("first");
-      controller.addError("second");
+      controller.add('first');
+      controller.addError('second');
       controller.close();
 
       await flushMicrotasks();
@@ -312,8 +312,8 @@
     test("doesn't buffer events from a broadcast stream", () async {
       var controller = StreamController<String>.broadcast();
       streamGroup.add(controller.stream);
-      controller.add("first");
-      controller.addError("second");
+      controller.add('first');
+      controller.addError('second');
       controller.close();
 
       await flushMicrotasks();
@@ -327,16 +327,16 @@
       streamGroup.add(controller.stream);
 
       expect(
-          streamGroup.stream.toList(), completion(equals(["first", "second"])));
+          streamGroup.stream.toList(), completion(equals(['first', 'second'])));
 
-      controller.add("first");
-      controller.add("second");
+      controller.add('first');
+      controller.add('second');
       controller.close();
 
       expect(streamGroup.close(), completes);
     });
 
-    test("cancels and re-listens broadcast streams", () async {
+    test('cancels and re-listens broadcast streams', () async {
       var subscription = streamGroup.stream.listen(null);
 
       var controller = StreamController<String>.broadcast();
@@ -354,7 +354,7 @@
       expect(controller.hasListener, isTrue);
     });
 
-    test("never cancels single-subscription streams", () async {
+    test('never cancels single-subscription streams', () async {
       var subscription = streamGroup.stream.listen(null);
 
       var controller =
@@ -370,7 +370,7 @@
       await flushMicrotasks();
     });
 
-    test("drops events from a single-subscription stream while dormant",
+    test('drops events from a single-subscription stream while dormant',
         () async {
       var events = [];
       var subscription = streamGroup.stream.listen(events.add);
@@ -379,22 +379,22 @@
       streamGroup.add(controller.stream);
       await flushMicrotasks();
 
-      controller.add("first");
+      controller.add('first');
       await flushMicrotasks();
-      expect(events, equals(["first"]));
+      expect(events, equals(['first']));
 
       subscription.cancel();
-      controller.add("second");
+      controller.add('second');
       await flushMicrotasks();
-      expect(events, equals(["first"]));
+      expect(events, equals(['first']));
 
       streamGroup.stream.listen(events.add);
-      controller.add("third");
+      controller.add('third');
       await flushMicrotasks();
-      expect(events, equals(["first", "third"]));
+      expect(events, equals(['first', 'third']));
     });
 
-    test("a single-subscription stream can be removed while dormant", () async {
+    test('a single-subscription stream can be removed while dormant', () async {
       var controller = StreamController<String>();
       streamGroup.add(controller.stream);
       await flushMicrotasks();
@@ -407,61 +407,61 @@
       await flushMicrotasks();
 
       expect(streamGroup.stream.toList(), completion(isEmpty));
-      controller.add("first");
+      controller.add('first');
       expect(streamGroup.close(), completes);
     });
   });
 
-  group("regardless of type", () {
-    group("single-subscription", () {
+  group('regardless of type', () {
+    group('single-subscription', () {
       regardlessOfType(() => StreamGroup<String>());
     });
 
-    group("broadcast", () {
+    group('broadcast', () {
       regardlessOfType(() => StreamGroup<String>.broadcast());
     });
   });
 
-  test("merge() emits events from all components streams", () async {
+  test('merge() emits events from all components streams', () async {
     var controller1 = StreamController<String>();
     var controller2 = StreamController<String>();
 
     var merged = StreamGroup.merge([controller1.stream, controller2.stream]);
 
-    controller1.add("first");
+    controller1.add('first');
     controller1.close();
-    controller2.add("second");
+    controller2.add('second');
     controller2.close();
 
-    expect(await merged.toList(), ["first", "second"]);
+    expect(await merged.toList(), ['first', 'second']);
   });
 
-  test("mergeBroadcast() emits events from all components streams", () async {
+  test('mergeBroadcast() emits events from all components streams', () async {
     var controller1 = StreamController<String>();
     var controller2 = StreamController<String>();
 
     var merged =
         StreamGroup.mergeBroadcast([controller1.stream, controller2.stream]);
 
-    controller1.add("first");
+    controller1.add('first');
     controller1.close();
-    controller2.add("second");
+    controller2.add('second');
     controller2.close();
 
     expect(merged.isBroadcast, isTrue);
 
-    expect(await merged.toList(), ["first", "second"]);
+    expect(await merged.toList(), ['first', 'second']);
   });
 }
 
-void regardlessOfType(StreamGroup<String> newStreamGroup()) {
+void regardlessOfType(StreamGroup<String> Function() newStreamGroup) {
   StreamGroup<String> streamGroup;
   setUp(() {
     streamGroup = newStreamGroup();
   });
 
-  group("add()", () {
-    group("while dormant", () {
+  group('add()', () {
+    group('while dormant', () {
       test("doesn't listen to the stream until the group is listened to",
           () async {
         var controller = StreamController<String>();
@@ -475,7 +475,7 @@
         expect(controller.hasListener, isTrue);
       });
 
-      test("is a no-op if the stream is already in the group", () {
+      test('is a no-op if the stream is already in the group', () {
         var controller = StreamController<String>();
         streamGroup.add(controller.stream);
         streamGroup.add(controller.stream);
@@ -487,13 +487,13 @@
       });
     });
 
-    group("while active", () {
+    group('while active', () {
       setUp(() async {
         streamGroup.stream.listen(null);
         await flushMicrotasks();
       });
 
-      test("listens to the stream immediately", () async {
+      test('listens to the stream immediately', () async {
         var controller = StreamController<String>();
 
         expect(streamGroup.add(controller.stream), isNull);
@@ -501,7 +501,7 @@
         expect(controller.hasListener, isTrue);
       });
 
-      test("is a no-op if the stream is already in the group", () async {
+      test('is a no-op if the stream is already in the group', () async {
         var controller = StreamController<String>();
 
         // If the stream were actually listened to more than once, future
@@ -513,28 +513,28 @@
     });
   });
 
-  group("remove()", () {
-    group("while dormant", () {
+  group('remove()', () {
+    group('while dormant', () {
       test("stops emitting events for a stream that's removed", () async {
         var controller = StreamController<String>();
         streamGroup.add(controller.stream);
 
-        expect(streamGroup.stream.toList(), completion(equals(["first"])));
+        expect(streamGroup.stream.toList(), completion(equals(['first'])));
 
-        controller.add("first");
+        controller.add('first');
         await flushMicrotasks();
-        controller.add("second");
+        controller.add('second');
 
         expect(streamGroup.remove(controller.stream), completion(null));
         expect(streamGroup.close(), completes);
       });
 
-      test("is a no-op for an unknown stream", () {
+      test('is a no-op for an unknown stream', () {
         var controller = StreamController<String>();
         expect(streamGroup.remove(controller.stream), isNull);
       });
 
-      test("and closed closes the group when the last stream is removed",
+      test('and closed closes the group when the last stream is removed',
           () async {
         var controller1 = StreamController<String>();
         var controller2 = StreamController<String>();
@@ -555,7 +555,7 @@
       });
     });
 
-    group("while listening", () {
+    group('while listening', () {
       test("doesn't emit events from a removed stream", () {
         var controller = StreamController<String>();
         streamGroup.add(controller.stream);
@@ -565,9 +565,9 @@
         // removal. This is documented in [StreamGroup.remove].
         expect(streamGroup.stream.toList(), completion(isEmpty));
 
-        controller.add("first");
+        controller.add('first');
         expect(streamGroup.remove(controller.stream), completion(null));
-        controller.add("second");
+        controller.add('second');
 
         expect(streamGroup.close(), completes);
       });
@@ -585,18 +585,18 @@
         expect(controller.hasListener, isFalse);
       });
 
-      test("forwards cancel errors", () async {
+      test('forwards cancel errors', () async {
         var controller =
-            StreamController<String>(onCancel: () => throw "error");
+            StreamController<String>(onCancel: () => throw 'error');
         streamGroup.add(controller.stream);
 
         streamGroup.stream.listen(null);
         await flushMicrotasks();
 
-        expect(streamGroup.remove(controller.stream), throwsA("error"));
+        expect(streamGroup.remove(controller.stream), throwsA('error'));
       });
 
-      test("forwards cancel futures", () async {
+      test('forwards cancel futures', () async {
         var completer = Completer();
         var controller =
             StreamController<String>(onCancel: () => completer.future);
@@ -618,7 +618,7 @@
         expect(fired, isTrue);
       });
 
-      test("is a no-op for an unknown stream", () async {
+      test('is a no-op for an unknown stream', () async {
         var controller = StreamController<String>();
         streamGroup.stream.listen(null);
         await flushMicrotasks();
@@ -626,7 +626,7 @@
         expect(streamGroup.remove(controller.stream), isNull);
       });
 
-      test("and closed closes the group when the last stream is removed",
+      test('and closed closes the group when the last stream is removed',
           () async {
         var done = false;
         streamGroup.stream.listen(null, onDone: () => done = true);
@@ -652,15 +652,15 @@
     });
   });
 
-  group("close()", () {
-    group("while dormant", () {
-      test("if there are no streams, closes the group", () {
+  group('close()', () {
+    group('while dormant', () {
+      test('if there are no streams, closes the group', () {
         expect(streamGroup.close(), completes);
         expect(streamGroup.stream.toList(), completion(isEmpty));
       });
 
       test(
-          "if there are streams, closes the group once those streams close "
+          'if there are streams, closes the group once those streams close '
           "and there's a listener", () async {
         var controller1 = StreamController<String>();
         var controller2 = StreamController<String>();
@@ -677,13 +677,13 @@
       });
     });
 
-    group("while active", () {
-      test("if there are no streams, closes the group", () {
+    group('while active', () {
+      test('if there are no streams, closes the group', () {
         expect(streamGroup.stream.toList(), completion(isEmpty));
         expect(streamGroup.close(), completes);
       });
 
-      test("if there are streams, closes the group once those streams close",
+      test('if there are streams, closes the group once those streams close',
           () async {
         var done = false;
         streamGroup.stream.listen(null, onDone: () => done = true);
@@ -710,7 +710,7 @@
       });
     });
 
-    test("returns a Future that completes once all events are dispatched",
+    test('returns a Future that completes once all events are dispatched',
         () async {
       var events = [];
       streamGroup.stream.listen(events.add);
@@ -722,16 +722,16 @@
       // Add a bunch of events. Each of these will get dispatched in a
       // separate microtask, so we can test that [close] only completes once
       // all of them have dispatched.
-      controller.add("one");
-      controller.add("two");
-      controller.add("three");
-      controller.add("four");
-      controller.add("five");
-      controller.add("six");
+      controller.add('one');
+      controller.add('two');
+      controller.add('three');
+      controller.add('four');
+      controller.add('five');
+      controller.add('six');
       controller.close();
 
       await streamGroup.close();
-      expect(events, equals(["one", "two", "three", "four", "five", "six"]));
+      expect(events, equals(['one', 'two', 'three', 'four', 'five', 'six']));
     });
   });
 }
diff --git a/test/stream_queue_test.dart b/test/stream_queue_test.dart
index b2a8625..fa286a8 100644
--- a/test/stream_queue_test.dart
+++ b/test/stream_queue_test.dart
@@ -2,16 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE filevents.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
-main() {
-  group("source stream", () {
-    test("is listened to on first request, paused between requests", () async {
+void main() {
+  group('source stream', () {
+    test('is listened to on first request, paused between requests', () async {
       var controller = StreamController<int>();
       var events = StreamQueue<int>(controller.stream);
       await flushMicrotasks();
@@ -42,8 +42,8 @@
     });
   });
 
-  group("eventsDispatched", () {
-    test("increments after a next future completes", () async {
+  group('eventsDispatched', () {
+    test('increments after a next future completes', () async {
       var events = StreamQueue<int>(createStream());
 
       expect(events.eventsDispatched, equals(0));
@@ -60,13 +60,13 @@
       expect(events.eventsDispatched, equals(2));
     });
 
-    test("increments multiple times for multi-value requests", () async {
+    test('increments multiple times for multi-value requests', () async {
       var events = StreamQueue<int>(createStream());
       await events.take(3);
       expect(events.eventsDispatched, equals(3));
     });
 
-    test("increments multiple times for an accepted transaction", () async {
+    test('increments multiple times for an accepted transaction', () async {
       var events = StreamQueue<int>(createStream());
       await events.withTransaction((queue) async {
         await queue.next;
@@ -83,8 +83,8 @@
     });
   });
 
-  group("lookAhead operation", () {
-    test("as simple list of events", () async {
+  group('lookAhead operation', () {
+    test('as simple list of events', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.lookAhead(4), [1, 2, 3, 4]);
       expect(await events.next, 1);
@@ -94,7 +94,7 @@
       await events.cancel();
     });
 
-    test("of 0 events", () async {
+    test('of 0 events', () async {
       var events = StreamQueue<int>(createStream());
       expect(events.lookAhead(0), completion([]));
       expect(events.next, completion(1));
@@ -110,7 +110,7 @@
       await events.cancel();
     });
 
-    test("with bad arguments throws", () async {
+    test('with bad arguments throws', () async {
       var events = StreamQueue<int>(createStream());
       expect(() => events.lookAhead(-1), throwsArgumentError);
       expect(await events.next, 1); // Did not consume event.
@@ -119,13 +119,13 @@
       await events.cancel();
     });
 
-    test("of too many arguments", () async {
+    test('of too many arguments', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.lookAhead(6), [1, 2, 3, 4]);
       await events.cancel();
     });
 
-    test("too large later", () async {
+    test('too large later', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -133,25 +133,25 @@
       await events.cancel();
     });
 
-    test("error", () async {
+    test('error', () async {
       var events = StreamQueue<int>(createErrorStream());
-      expect(events.lookAhead(4), throwsA("To err is divine!"));
-      expect(events.take(4), throwsA("To err is divine!"));
+      expect(events.lookAhead(4), throwsA('To err is divine!'));
+      expect(events.take(4), throwsA('To err is divine!'));
       expect(await events.next, 4);
       await events.cancel();
     });
   });
 
-  group("next operation", () {
-    test("simple sequence of requests", () async {
+  group('next operation', () {
+    test('simple sequence of requests', () async {
       var events = StreamQueue<int>(createStream());
-      for (int i = 1; i <= 4; i++) {
+      for (var i = 1; i <= 4; i++) {
         expect(await events.next, i);
       }
       expect(events.next, throwsStateError);
     });
 
-    test("multiple requests at the same time", () async {
+    test('multiple requests at the same time', () async {
       var events = StreamQueue<int>(createStream());
       var result = await Future.wait(
           [events.next, events.next, events.next, events.next]);
@@ -159,18 +159,18 @@
       await events.cancel();
     });
 
-    test("sequence of requests with error", () async {
+    test('sequence of requests with error', () async {
       var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
-      expect(events.next, throwsA("To err is divine!"));
+      expect(events.next, throwsA('To err is divine!'));
       expect(await events.next, 4);
       await events.cancel();
     });
   });
 
-  group("skip operation", () {
-    test("of two elements in the middle of sequence", () async {
+  group('skip operation', () {
+    test('of two elements in the middle of sequence', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.skip(2), 0);
@@ -178,7 +178,7 @@
       await events.cancel();
     });
 
-    test("with negative/bad arguments throws", () async {
+    test('with negative/bad arguments throws', () async {
       var events = StreamQueue<int>(createStream());
       expect(() => events.skip(-1), throwsArgumentError);
       // A non-int throws either a type error or an argument error,
@@ -189,7 +189,7 @@
       await events.cancel();
     });
 
-    test("of 0 elements works", () async {
+    test('of 0 elements works', () async {
       var events = StreamQueue<int>(createStream());
       expect(events.skip(0), completion(0));
       expect(events.next, completion(1));
@@ -205,13 +205,13 @@
       await events.cancel();
     });
 
-    test("of too many events ends at stream start", () async {
+    test('of too many events ends at stream start', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.skip(6), 2);
       await events.cancel();
     });
 
-    test("of too many events after some events", () async {
+    test('of too many events after some events', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -219,7 +219,7 @@
       await events.cancel();
     });
 
-    test("of too many events ends at stream end", () async {
+    test('of too many events ends at stream end', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -229,20 +229,20 @@
       await events.cancel();
     });
 
-    test("of events with error", () async {
+    test('of events with error', () async {
       var events = StreamQueue<int>(createErrorStream());
-      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(events.skip(4), throwsA('To err is divine!'));
       expect(await events.next, 4);
       await events.cancel();
     });
 
-    test("of events with error, and skip again after", () async {
+    test('of events with error, and skip again after', () async {
       var events = StreamQueue<int>(createErrorStream());
-      expect(events.skip(4), throwsA("To err is divine!"));
+      expect(events.skip(4), throwsA('To err is divine!'));
       expect(events.skip(2), completion(1));
       await events.cancel();
     });
-    test("multiple skips at same time complete in order.", () async {
+    test('multiple skips at same time complete in order.', () async {
       var events = StreamQueue<int>(createStream());
       var skip1 = events.skip(1);
       var skip2 = events.skip(0);
@@ -266,8 +266,8 @@
     });
   });
 
-  group("take operation", () {
-    test("as simple take of events", () async {
+  group('take operation', () {
+    test('as simple take of events', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.take(2), [2, 3]);
@@ -275,7 +275,7 @@
       await events.cancel();
     });
 
-    test("of 0 events", () async {
+    test('of 0 events', () async {
       var events = StreamQueue<int>(createStream());
       expect(events.take(0), completion([]));
       expect(events.next, completion(1));
@@ -291,7 +291,7 @@
       await events.cancel();
     });
 
-    test("with bad arguments throws", () async {
+    test('with bad arguments throws', () async {
       var events = StreamQueue<int>(createStream());
       expect(() => events.take(-1), throwsArgumentError);
       expect(await events.next, 1); // Did not consume event.
@@ -300,13 +300,13 @@
       await events.cancel();
     });
 
-    test("of too many arguments", () async {
+    test('of too many arguments', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.take(6), [1, 2, 3, 4]);
       await events.cancel();
     });
 
-    test("too large later", () async {
+    test('too large later', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -314,27 +314,27 @@
       await events.cancel();
     });
 
-    test("error", () async {
+    test('error', () async {
       var events = StreamQueue<int>(createErrorStream());
-      expect(events.take(4), throwsA("To err is divine!"));
+      expect(events.take(4), throwsA('To err is divine!'));
       expect(await events.next, 4);
       await events.cancel();
     });
   });
 
-  group("rest operation", () {
-    test("after single next", () async {
+  group('rest operation', () {
+    test('after single next', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.rest.toList(), [2, 3, 4]);
     });
 
-    test("at start", () async {
+    test('at start', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.rest.toList(), [1, 2, 3, 4]);
     });
 
-    test("at end", () async {
+    test('at end', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -343,7 +343,7 @@
       expect(await events.rest.toList(), isEmpty);
     });
 
-    test("after end", () async {
+    test('after end', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -353,13 +353,13 @@
       expect(await events.rest.toList(), isEmpty);
     });
 
-    test("after receiving done requested before", () async {
+    test('after receiving done requested before', () async {
       var events = StreamQueue<int>(createStream());
       var next1 = events.next;
       var next2 = events.next;
       var next3 = events.next;
       var rest = events.rest;
-      for (int i = 0; i < 10; i++) {
+      for (var i = 0; i < 10; i++) {
         await flushMicrotasks();
       }
       expect(await next1, 1);
@@ -368,17 +368,17 @@
       expect(await rest.toList(), [4]);
     });
 
-    test("with an error event error", () async {
+    test('with an error event error', () async {
       var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       var rest = events.rest;
       var events2 = StreamQueue(rest);
       expect(await events2.next, 2);
-      expect(events2.next, throwsA("To err is divine!"));
+      expect(events2.next, throwsA('To err is divine!'));
       expect(await events2.next, 4);
     });
 
-    test("closes the events, prevents other operations", () async {
+    test('closes the events, prevents other operations', () async {
       var events = StreamQueue<int>(createStream());
       var stream = events.rest;
       expect(() => events.next, throwsStateError);
@@ -389,7 +389,7 @@
       expect(stream.toList(), completion([1, 2, 3, 4]));
     });
 
-    test("forwards to underlying stream", () async {
+    test('forwards to underlying stream', () async {
       var cancel = Completer();
       var controller = StreamController<int>(onCancel: () => cancel.future);
       var events = StreamQueue<int>(controller.stream);
@@ -436,8 +436,8 @@
     });
   });
 
-  group("peek operation", () {
-    test("peeks one event", () async {
+  group('peek operation', () {
+    test('peeks one event', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.peek, 1);
       expect(await events.next, 1);
@@ -449,28 +449,28 @@
       expect(events.peek, throwsA(anything));
       await events.cancel();
     });
-    test("multiple requests at the same time", () async {
+    test('multiple requests at the same time', () async {
       var events = StreamQueue<int>(createStream());
       var result = await Future.wait(
           [events.peek, events.peek, events.next, events.peek, events.peek]);
       expect(result, [1, 1, 1, 2, 2]);
       await events.cancel();
     });
-    test("sequence of requests with error", () async {
+    test('sequence of requests with error', () async {
       var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
-      expect(events.peek, throwsA("To err is divine!"));
+      expect(events.peek, throwsA('To err is divine!'));
       // Error stays in queue.
-      expect(events.peek, throwsA("To err is divine!"));
-      expect(events.next, throwsA("To err is divine!"));
+      expect(events.peek, throwsA('To err is divine!'));
+      expect(events.next, throwsA('To err is divine!'));
       expect(await events.next, 4);
       await events.cancel();
     });
   });
 
-  group("cancel operation", () {
-    test("closes the events, prevents any other operation", () async {
+  group('cancel operation', () {
+    test('closes the events, prevents any other operation', () async {
       var events = StreamQueue<int>(createStream());
       await events.cancel();
       expect(() => events.lookAhead(1), throwsStateError);
@@ -482,7 +482,7 @@
       expect(() => events.cancel(), throwsStateError);
     });
 
-    test("cancels underlying subscription when called before any event",
+    test('cancels underlying subscription when called before any event',
         () async {
       var cancelFuture = Future.value(42);
       var controller = StreamController<int>(onCancel: () => cancelFuture);
@@ -490,7 +490,7 @@
       expect(await events.cancel(), 42);
     });
 
-    test("cancels underlying subscription, returns result", () async {
+    test('cancels underlying subscription, returns result', () async {
       var cancelFuture = Future.value(42);
       var controller = StreamController<int>(onCancel: () => cancelFuture);
       var events = StreamQueue<int>(controller.stream);
@@ -499,8 +499,8 @@
       expect(await events.cancel(), 42);
     });
 
-    group("with immediate: true", () {
-      test("closes the events, prevents any other operation", () async {
+    group('with immediate: true', () {
+      test('closes the events, prevents any other operation', () async {
         var events = StreamQueue<int>(createStream());
         await events.cancel(immediate: true);
         expect(() => events.next, throwsStateError);
@@ -510,7 +510,7 @@
         expect(() => events.cancel(), throwsStateError);
       });
 
-      test("cancels the underlying subscription immediately", () async {
+      test('cancels the underlying subscription immediately', () async {
         var controller = StreamController<int>();
         controller.add(1);
 
@@ -522,7 +522,7 @@
         expect(controller.hasListener, isFalse);
       });
 
-      test("cancels the underlying subscription when called before any event",
+      test('cancels the underlying subscription when called before any event',
           () async {
         var cancelFuture = Future.value(42);
         var controller = StreamController<int>(onCancel: () => cancelFuture);
@@ -531,7 +531,7 @@
         expect(await events.cancel(immediate: true), 42);
       });
 
-      test("closes pending requests", () async {
+      test('closes pending requests', () async {
         var events = StreamQueue<int>(createStream());
         expect(await events.next, 1);
         expect(events.next, throwsStateError);
@@ -540,7 +540,7 @@
         await events.cancel(immediate: true);
       });
 
-      test("returns the result of closing the underlying subscription",
+      test('returns the result of closing the underlying subscription',
           () async {
         var controller =
             StreamController<int>(onCancel: () => Future.value(42));
@@ -564,30 +564,30 @@
     });
   });
 
-  group("hasNext operation", () {
-    test("true at start", () async {
+  group('hasNext operation', () {
+    test('true at start', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.hasNext, isTrue);
     });
 
-    test("true after start", () async {
+    test('true after start', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, isTrue);
     });
 
-    test("true at end", () async {
+    test('true at end', () async {
       var events = StreamQueue<int>(createStream());
-      for (int i = 1; i <= 4; i++) {
+      for (var i = 1; i <= 4; i++) {
         expect(await events.next, i);
       }
       expect(await events.hasNext, isFalse);
     });
 
-    test("true when enqueued", () async {
+    test('true when enqueued', () async {
       var events = StreamQueue<int>(createStream());
       var values = <int>[];
-      for (int i = 1; i <= 3; i++) {
+      for (var i = 1; i <= 3; i++) {
         events.next.then(values.add);
       }
       expect(values, isEmpty);
@@ -595,10 +595,10 @@
       expect(values, [1, 2, 3]);
     });
 
-    test("false when enqueued", () async {
+    test('false when enqueued', () async {
       var events = StreamQueue<int>(createStream());
       var values = <int>[];
-      for (int i = 1; i <= 4; i++) {
+      for (var i = 1; i <= 4; i++) {
         events.next.then(values.add);
       }
       expect(values, isEmpty);
@@ -606,7 +606,7 @@
       expect(values, [1, 2, 3, 4]);
     });
 
-    test("true when data event", () async {
+    test('true when data event', () async {
       var controller = StreamController<int>();
       var events = StreamQueue<int>(controller.stream);
 
@@ -622,7 +622,7 @@
       expect(hasNext, isTrue);
     });
 
-    test("true when error event", () async {
+    test('true when error event', () async {
       var controller = StreamController<int>();
       var events = StreamQueue<int>(controller.stream);
 
@@ -632,14 +632,14 @@
       });
       await flushMicrotasks();
       expect(hasNext, isNull);
-      controller.addError("BAD");
+      controller.addError('BAD');
       expect(hasNext, isNull);
       await flushMicrotasks();
       expect(hasNext, isTrue);
-      expect(events.next, throwsA("BAD"));
+      expect(events.next, throwsA('BAD'));
     });
 
-    test("- hasNext after hasNext", () async {
+    test('- hasNext after hasNext', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.hasNext, true);
       expect(await events.hasNext, true);
@@ -657,7 +657,7 @@
       expect(await events.hasNext, false);
     });
 
-    test("- next after true", () async {
+    test('- next after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -665,7 +665,7 @@
       expect(await events.next, 3);
     });
 
-    test("- next after true, enqueued", () async {
+    test('- next after true, enqueued', () async {
       var events = StreamQueue<int>(createStream());
       var responses = <Object>[];
       events.next.then(responses.add);
@@ -677,7 +677,7 @@
       expect(responses, [1, true, 2]);
     });
 
-    test("- skip 0 after true", () async {
+    test('- skip 0 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -685,7 +685,7 @@
       expect(await events.next, 2);
     });
 
-    test("- skip 1 after true", () async {
+    test('- skip 1 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -693,7 +693,7 @@
       expect(await events.next, 3);
     });
 
-    test("- skip 2 after true", () async {
+    test('- skip 2 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -701,7 +701,7 @@
       expect(await events.next, 4);
     });
 
-    test("- take 0 after true", () async {
+    test('- take 0 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -709,7 +709,7 @@
       expect(await events.next, 2);
     });
 
-    test("- take 1 after true", () async {
+    test('- take 1 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -717,7 +717,7 @@
       expect(await events.next, 3);
     });
 
-    test("- take 2 after true", () async {
+    test('- take 2 after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -725,7 +725,7 @@
       expect(await events.next, 4);
     });
 
-    test("- rest after true", () async {
+    test('- rest after true', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.hasNext, true);
@@ -733,7 +733,7 @@
       expect(await stream.toList(), [2, 3, 4]);
     });
 
-    test("- rest after true, at last", () async {
+    test('- rest after true, at last', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -743,7 +743,7 @@
       expect(await stream.toList(), [4]);
     });
 
-    test("- rest after false", () async {
+    test('- rest after false', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -754,7 +754,7 @@
       expect(await stream.toList(), isEmpty);
     });
 
-    test("- cancel after true on data", () async {
+    test('- cancel after true on data', () async {
       var events = StreamQueue<int>(createStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -762,7 +762,7 @@
       expect(await events.cancel(), null);
     });
 
-    test("- cancel after true on error", () async {
+    test('- cancel after true on error', () async {
       var events = StreamQueue<int>(createErrorStream());
       expect(await events.next, 1);
       expect(await events.next, 2);
@@ -771,7 +771,7 @@
     });
   });
 
-  group("startTransaction operation produces a transaction that", () {
+  group('startTransaction operation produces a transaction that', () {
     StreamQueue<int> events;
     StreamQueueTransaction<int> transaction;
     StreamQueue<int> queue1;
@@ -784,8 +784,8 @@
       queue2 = transaction.newQueue();
     });
 
-    group("emits queues that", () {
-      test("independently emit events", () async {
+    group('emits queues that', () {
+      test('independently emit events', () async {
         expect(await queue1.next, 2);
         expect(await queue2.next, 2);
         expect(await queue2.next, 3);
@@ -796,7 +796,7 @@
         expect(await queue2.hasNext, isFalse);
       });
 
-      test("queue requests for events", () async {
+      test('queue requests for events', () async {
         expect(queue1.next, completion(2));
         expect(queue2.next, completion(2));
         expect(queue2.next, completion(3));
@@ -807,7 +807,7 @@
         expect(queue2.hasNext, completion(isFalse));
       });
 
-      test("independently emit errors", () async {
+      test('independently emit errors', () async {
         events = StreamQueue(createErrorStream());
         expect(await events.next, 1);
         transaction = events.startTransaction();
@@ -816,8 +816,8 @@
 
         expect(queue1.next, completion(2));
         expect(queue2.next, completion(2));
-        expect(queue2.next, throwsA("To err is divine!"));
-        expect(queue1.next, throwsA("To err is divine!"));
+        expect(queue2.next, throwsA('To err is divine!'));
+        expect(queue1.next, throwsA('To err is divine!'));
         expect(queue1.next, completion(4));
         expect(queue2.next, completion(4));
         expect(queue1.hasNext, completion(isFalse));
@@ -825,8 +825,8 @@
       });
     });
 
-    group("when rejected", () {
-      test("further original requests use the previous state", () async {
+    group('when rejected', () {
+      test('further original requests use the previous state', () async {
         expect(await queue1.next, 2);
         expect(await queue2.next, 2);
         expect(await queue2.next, 3);
@@ -840,7 +840,7 @@
         expect(await events.hasNext, isFalse);
       });
 
-      test("pending original requests use the previous state", () async {
+      test('pending original requests use the previous state', () async {
         expect(await queue1.next, 2);
         expect(await queue2.next, 2);
         expect(await queue2.next, 3);
@@ -853,7 +853,7 @@
         transaction.reject();
       });
 
-      test("further child requests act as though the stream was closed",
+      test('further child requests act as though the stream was closed',
           () async {
         expect(await queue1.next, 2);
         transaction.reject();
@@ -862,7 +862,7 @@
         expect(queue1.next, throwsStateError);
       });
 
-      test("pending child requests act as though the stream was closed",
+      test('pending child requests act as though the stream was closed',
           () async {
         expect(await queue1.next, 2);
         expect(queue1.hasNext, completion(isFalse));
@@ -871,7 +871,7 @@
       });
 
       // Regression test.
-      test("pending child rest requests emit no more events", () async {
+      test('pending child rest requests emit no more events', () async {
         var controller = StreamController();
         var events = StreamQueue(controller.stream);
         var transaction = events.startTransaction();
@@ -899,13 +899,13 @@
         await queue1.cancel();
       });
 
-      test("calls to commit() or reject() fail", () async {
+      test('calls to commit() or reject() fail', () async {
         transaction.reject();
         expect(transaction.reject, throwsStateError);
         expect(() => transaction.commit(queue1), throwsStateError);
       });
 
-      test("before the transaction emits any events, does nothing", () async {
+      test('before the transaction emits any events, does nothing', () async {
         var controller = StreamController();
         var events = StreamQueue(controller.stream);
 
@@ -924,22 +924,22 @@
       });
     });
 
-    group("when committed", () {
-      test("further original requests use the committed state", () async {
+    group('when committed', () {
+      test('further original requests use the committed state', () async {
         expect(await queue1.next, 2);
         await flushMicrotasks();
         transaction.commit(queue1);
         expect(await events.next, 3);
       });
 
-      test("pending original requests use the committed state", () async {
+      test('pending original requests use the committed state', () async {
         expect(await queue1.next, 2);
         expect(events.next, completion(3));
         await flushMicrotasks();
         transaction.commit(queue1);
       });
 
-      test("further child requests act as though the stream was closed",
+      test('further child requests act as though the stream was closed',
           () async {
         expect(await queue2.next, 2);
         transaction.commit(queue2);
@@ -948,7 +948,7 @@
         expect(queue1.next, throwsStateError);
       });
 
-      test("pending child requests act as though the stream was closed",
+      test('pending child requests act as though the stream was closed',
           () async {
         expect(await queue2.next, 2);
         expect(queue1.hasNext, completion(isFalse));
@@ -956,7 +956,7 @@
         transaction.commit(queue2);
       });
 
-      test("further requests act as though the stream was closed", () async {
+      test('further requests act as though the stream was closed', () async {
         expect(await queue1.next, 2);
         transaction.commit(queue1);
 
@@ -964,25 +964,25 @@
         expect(queue1.next, throwsStateError);
       });
 
-      test("cancel() may still be called explicitly", () async {
+      test('cancel() may still be called explicitly', () async {
         expect(await queue1.next, 2);
         transaction.commit(queue1);
         await queue1.cancel();
       });
 
-      test("throws if there are pending requests", () async {
+      test('throws if there are pending requests', () async {
         expect(await queue1.next, 2);
         expect(queue1.hasNext, completion(isTrue));
         expect(() => transaction.commit(queue1), throwsStateError);
       });
 
-      test("calls to commit() or reject() fail", () async {
+      test('calls to commit() or reject() fail', () async {
         transaction.commit(queue1);
         expect(transaction.reject, throwsStateError);
         expect(() => transaction.commit(queue1), throwsStateError);
       });
 
-      test("before the transaction emits any events, does nothing", () async {
+      test('before the transaction emits any events, does nothing', () async {
         var controller = StreamController();
         var events = StreamQueue(controller.stream);
 
@@ -1003,14 +1003,14 @@
     });
   });
 
-  group("withTransaction operation", () {
+  group('withTransaction operation', () {
     StreamQueue<int> events;
     setUp(() async {
       events = StreamQueue(createStream());
       expect(await events.next, 1);
     });
 
-    test("passes a copy of the parent queue", () async {
+    test('passes a copy of the parent queue', () async {
       await events.withTransaction(expectAsync1((queue) async {
         expect(await queue.next, 2);
         expect(await queue.next, 3);
@@ -1021,8 +1021,8 @@
     });
 
     test(
-        "the parent queue continues from the child position if it returns "
-        "true", () async {
+        'the parent queue continues from the child position if it returns '
+        'true', () async {
       await events.withTransaction(expectAsync1((queue) async {
         expect(await queue.next, 2);
         return true;
@@ -1032,8 +1032,8 @@
     });
 
     test(
-        "the parent queue continues from its original position if it returns "
-        "false", () async {
+        'the parent queue continues from its original position if it returns '
+        'false', () async {
       await events.withTransaction(expectAsync1((queue) async {
         expect(await queue.next, 2);
         return false;
@@ -1042,29 +1042,29 @@
       expect(await events.next, 2);
     });
 
-    test("the parent queue continues from the child position if it throws", () {
+    test('the parent queue continues from the child position if it throws', () {
       expect(events.withTransaction(expectAsync1((queue) async {
         expect(await queue.next, 2);
-        throw "oh no";
-      })), throwsA("oh no"));
+        throw 'oh no';
+      })), throwsA('oh no'));
 
       expect(events.next, completion(3));
     });
 
-    test("returns whether the transaction succeeded", () {
+    test('returns whether the transaction succeeded', () {
       expect(events.withTransaction((_) async => true), completion(isTrue));
       expect(events.withTransaction((_) async => false), completion(isFalse));
     });
   });
 
-  group("cancelable operation", () {
+  group('cancelable operation', () {
     StreamQueue<int> events;
     setUp(() async {
       events = StreamQueue(createStream());
       expect(await events.next, 1);
     });
 
-    test("passes a copy of the parent queue", () async {
+    test('passes a copy of the parent queue', () async {
       await events.cancelable(expectAsync1((queue) async {
         expect(await queue.next, 2);
         expect(await queue.next, 3);
@@ -1073,7 +1073,7 @@
       })).value;
     });
 
-    test("the parent queue continues from the child position by default",
+    test('the parent queue continues from the child position by default',
         () async {
       await events.cancelable(expectAsync1((queue) async {
         expect(await queue.next, 2);
@@ -1083,19 +1083,19 @@
     });
 
     test(
-        "the parent queue continues from the child position if an error is "
-        "thrown", () async {
+        'the parent queue continues from the child position if an error is '
+        'thrown', () async {
       expect(
           events.cancelable(expectAsync1((queue) async {
             expect(await queue.next, 2);
-            throw "oh no";
+            throw 'oh no';
           })).value,
-          throwsA("oh no"));
+          throwsA('oh no'));
 
       expect(events.next, completion(3));
     });
 
-    test("the parent queue continues from the original position if canceled",
+    test('the parent queue continues from the original position if canceled',
         () async {
       var operation = events.cancelable(expectAsync1((queue) async {
         expect(await queue.next, 2);
@@ -1105,17 +1105,17 @@
       expect(await events.next, 2);
     });
 
-    test("forwards the value from the callback", () async {
+    test('forwards the value from the callback', () async {
       expect(
           await events.cancelable(expectAsync1((queue) async {
             expect(await queue.next, 2);
-            return "value";
+            return 'value';
           })).value,
-          "value");
+          'value');
     });
   });
 
-  test("all combinations sequential skip/next/take operations", () async {
+  test('all combinations sequential skip/next/take operations', () async {
     // Takes all combinations of two of next, skip and take, then ends with
     // doing rest. Each of the first rounds do 10 events of each type,
     // the rest does 20 elements.
@@ -1124,30 +1124,30 @@
 
     // Test expecting [startIndex .. startIndex + 9] as events using
     // `next`.
-    nextTest(startIndex) {
-      for (int i = 0; i < 10; i++) {
+    void nextTest(startIndex) {
+      for (var i = 0; i < 10; i++) {
         expect(events.next, completion(startIndex + i));
       }
     }
 
     // Test expecting 10 events to be skipped.
-    skipTest(startIndex) {
+    void skipTest(startIndex) {
       expect(events.skip(10), completion(0));
     }
 
     // Test expecting [startIndex .. startIndex + 9] as events using
     // `take(10)`.
-    takeTest(startIndex) {
+    void takeTest(startIndex) {
       expect(events.take(10),
           completion(List.generate(10, (i) => startIndex + i)));
     }
 
     var tests = [nextTest, skipTest, takeTest];
 
-    int counter = 0;
+    var counter = 0;
     // Run through all pairs of two tests and run them.
-    for (int i = 0; i < tests.length; i++) {
-      for (int j = 0; j < tests.length; j++) {
+    for (var i = 0; i < tests.length; i++) {
+      for (var j = 0; j < tests.length; j++) {
         tests[i](counter);
         tests[j](counter + 10);
         counter += 20;
@@ -1178,7 +1178,7 @@
     await flushMicrotasks();
     controller.add(2);
     await flushMicrotasks();
-    controller.addError("To err is divine!");
+    controller.addError('To err is divine!');
     await flushMicrotasks();
     controller.add(4);
     await flushMicrotasks();
@@ -1188,5 +1188,7 @@
 }
 
 Stream<int> createLongStream(int eventCount) async* {
-  for (int i = 0; i < eventCount; i++) yield i;
+  for (var i = 0; i < eventCount; i++) {
+    yield i;
+  }
 }
diff --git a/test/stream_sink_completer_test.dart b/test/stream_sink_completer_test.dart
index 56860ce..69d1d8a 100644
--- a/test/stream_sink_completer_test.dart
+++ b/test/stream_sink_completer_test.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
-main() {
+void main() {
   StreamSinkCompleter completer;
   setUp(() {
     completer = StreamSinkCompleter();
   });
 
-  group("when a stream is linked before events are added", () {
-    test("data events are forwarded", () {
+  group('when a stream is linked before events are added', () {
+    test('data events are forwarded', () {
       var sink = TestSink();
       completer.setDestinationSink(sink);
       completer.sink..add(1)..add(2)..add(3)..add(4);
@@ -27,16 +27,16 @@
       expect(sink.results[3].asValue.value, equals(4));
     });
 
-    test("error events are forwarded", () {
+    test('error events are forwarded', () {
       var sink = TestSink();
       completer.setDestinationSink(sink);
-      completer.sink..addError("oh no")..addError("that's bad");
+      completer.sink..addError('oh no')..addError("that's bad");
 
-      expect(sink.results[0].asError.error, equals("oh no"));
+      expect(sink.results[0].asError.error, equals('oh no'));
       expect(sink.results[1].asError.error, equals("that's bad"));
     });
 
-    test("addStream is forwarded", () async {
+    test('addStream is forwarded', () async {
       var sink = TestSink();
       completer.setDestinationSink(sink);
 
@@ -44,13 +44,13 @@
       completer.sink.addStream(controller.stream);
 
       controller.add(1);
-      controller.addError("oh no");
+      controller.addError('oh no');
       controller.add(2);
       controller.addError("that's bad");
       await flushMicrotasks();
 
       expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asError.error, equals("oh no"));
+      expect(sink.results[1].asError.error, equals('oh no'));
       expect(sink.results[2].asValue.value, equals(2));
       expect(sink.results[3].asError.error, equals("that's bad"));
       expect(sink.isClosed, isFalse);
@@ -60,14 +60,14 @@
       expect(sink.isClosed, isFalse);
     });
 
-    test("close() is forwarded", () {
+    test('close() is forwarded', () {
       var sink = TestSink();
       completer.setDestinationSink(sink);
       completer.sink.close();
       expect(sink.isClosed, isTrue);
     });
 
-    test("the future from the inner close() is returned", () async {
+    test('the future from the inner close() is returned', () async {
       var closeCompleter = Completer();
       var sink = TestSink(onDone: () => closeCompleter.future);
       completer.setDestinationSink(sink);
@@ -85,35 +85,35 @@
       expect(closeCompleted, isTrue);
     });
 
-    test("errors are forwarded from the inner close()", () {
-      var sink = TestSink(onDone: () => throw "oh no");
+    test('errors are forwarded from the inner close()', () {
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
+      expect(completer.sink.done, throwsA('oh no'));
+      expect(completer.sink.close(), throwsA('oh no'));
     });
 
     test("errors aren't top-leveled if only close() is listened to", () async {
-      var sink = TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
-      expect(completer.sink.close(), throwsA("oh no"));
+      expect(completer.sink.close(), throwsA('oh no'));
 
       // Give the event loop a chance to top-level errors if it's going to.
       await flushMicrotasks();
     });
 
     test("errors aren't top-leveled if only done is listened to", () async {
-      var sink = TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
       completer.sink.close();
-      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.done, throwsA('oh no'));
 
       // Give the event loop a chance to top-level errors if it's going to.
       await flushMicrotasks();
     });
   });
 
-  group("when a stream is linked after events are added", () {
-    test("data events are forwarded", () async {
+  group('when a stream is linked after events are added', () {
+    test('data events are forwarded', () async {
       completer.sink..add(1)..add(2)..add(3)..add(4);
       await flushMicrotasks();
 
@@ -127,24 +127,24 @@
       expect(sink.results[3].asValue.value, equals(4));
     });
 
-    test("error events are forwarded", () async {
-      completer.sink..addError("oh no")..addError("that's bad");
+    test('error events are forwarded', () async {
+      completer.sink..addError('oh no')..addError("that's bad");
       await flushMicrotasks();
 
       var sink = TestSink();
       completer.setDestinationSink(sink);
       await flushMicrotasks();
 
-      expect(sink.results[0].asError.error, equals("oh no"));
+      expect(sink.results[0].asError.error, equals('oh no'));
       expect(sink.results[1].asError.error, equals("that's bad"));
     });
 
-    test("addStream is forwarded", () async {
+    test('addStream is forwarded', () async {
       var controller = StreamController();
       completer.sink.addStream(controller.stream);
 
       controller.add(1);
-      controller.addError("oh no");
+      controller.addError('oh no');
       controller.add(2);
       controller.addError("that's bad");
       controller.close();
@@ -155,13 +155,13 @@
       await flushMicrotasks();
 
       expect(sink.results[0].asValue.value, equals(1));
-      expect(sink.results[1].asError.error, equals("oh no"));
+      expect(sink.results[1].asError.error, equals('oh no'));
       expect(sink.results[2].asValue.value, equals(2));
       expect(sink.results[3].asError.error, equals("that's bad"));
       expect(sink.isClosed, isFalse);
     });
 
-    test("close() is forwarded", () async {
+    test('close() is forwarded', () async {
       completer.sink.close();
       await flushMicrotasks();
 
@@ -172,7 +172,7 @@
       expect(sink.isClosed, isTrue);
     });
 
-    test("the future from the inner close() is returned", () async {
+    test('the future from the inner close() is returned', () async {
       var closeCompleted = false;
       completer.sink.close().then(expectAsync1((_) {
         closeCompleted = true;
@@ -190,20 +190,20 @@
       expect(closeCompleted, isTrue);
     });
 
-    test("errors are forwarded from the inner close()", () async {
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
+    test('errors are forwarded from the inner close()', () async {
+      expect(completer.sink.done, throwsA('oh no'));
+      expect(completer.sink.close(), throwsA('oh no'));
       await flushMicrotasks();
 
-      var sink = TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
     });
 
     test("errors aren't top-leveled if only close() is listened to", () async {
-      expect(completer.sink.close(), throwsA("oh no"));
+      expect(completer.sink.close(), throwsA('oh no'));
       await flushMicrotasks();
 
-      var sink = TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
 
       // Give the event loop a chance to top-level errors if it's going to.
@@ -212,10 +212,10 @@
 
     test("errors aren't top-leveled if only done is listened to", () async {
       completer.sink.close();
-      expect(completer.sink.done, throwsA("oh no"));
+      expect(completer.sink.done, throwsA('oh no'));
       await flushMicrotasks();
 
-      var sink = TestSink(onDone: () => throw "oh no");
+      var sink = TestSink(onDone: () => throw 'oh no');
       completer.setDestinationSink(sink);
 
       // Give the event loop a chance to top-level errors if it's going to.
@@ -223,7 +223,7 @@
     });
   });
 
-  test("the sink is closed, the destination is set, then done is read",
+  test('the sink is closed, the destination is set, then done is read',
       () async {
     expect(completer.sink.close(), completes);
     await flushMicrotasks();
@@ -234,7 +234,7 @@
     expect(completer.sink.done, completes);
   });
 
-  test("done is read, the destination is set, then the sink is closed",
+  test('done is read, the destination is set, then the sink is closed',
       () async {
     expect(completer.sink.done, completes);
     await flushMicrotasks();
@@ -245,8 +245,8 @@
     expect(completer.sink.close(), completes);
   });
 
-  group("fromFuture()", () {
-    test("with a successful completion", () async {
+  group('fromFuture()', () {
+    test('with a successful completion', () async {
       var futureCompleter = Completer<StreamSink>();
       var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
       sink.add(1);
@@ -263,27 +263,27 @@
       expect(testSink.results[2].asValue.value, equals(3));
     });
 
-    test("with an error", () async {
+    test('with an error', () async {
       var futureCompleter = Completer<StreamSink>();
       var sink = StreamSinkCompleter.fromFuture(futureCompleter.future);
-      expect(sink.done, throwsA("oh no"));
-      futureCompleter.completeError("oh no");
+      expect(sink.done, throwsA('oh no'));
+      futureCompleter.completeError('oh no');
     });
   });
 
-  group("setError()", () {
-    test("produces a closed sink with the error", () {
-      completer.setError("oh no");
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
+  group('setError()', () {
+    test('produces a closed sink with the error', () {
+      completer.setError('oh no');
+      expect(completer.sink.done, throwsA('oh no'));
+      expect(completer.sink.close(), throwsA('oh no'));
     });
 
-    test("produces an error even if done was accessed earlier", () async {
-      expect(completer.sink.done, throwsA("oh no"));
-      expect(completer.sink.close(), throwsA("oh no"));
+    test('produces an error even if done was accessed earlier', () async {
+      expect(completer.sink.done, throwsA('oh no'));
+      expect(completer.sink.close(), throwsA('oh no'));
       await flushMicrotasks();
 
-      completer.setError("oh no");
+      completer.setError('oh no');
     });
   });
 
diff --git a/test/stream_sink_transformer_test.dart b/test/stream_sink_transformer_test.dart
index 5e981a6..8493971 100644
--- a/test/stream_sink_transformer_test.dart
+++ b/test/stream_sink_transformer_test.dart
@@ -2,12 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE filevents.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
 void main() {
   StreamController controller;
@@ -15,8 +15,8 @@
     controller = StreamController();
   });
 
-  group("fromStreamTransformer", () {
-    test("transforms data events", () {
+  group('fromStreamTransformer', () {
+    test('transforms data events', () {
       var transformer = StreamSinkTransformer.fromStreamTransformer(
           StreamTransformer.fromHandlers(handleData: (i, sink) {
         sink.add(i * 2);
@@ -34,7 +34,7 @@
       sink.close();
     });
 
-    test("transforms error events", () {
+    test('transforms error events', () {
       var transformer = StreamSinkTransformer.fromStreamTransformer(
           StreamTransformer.fromHandlers(handleError: (i, stackTrace, sink) {
         sink.addError((i as num) * 2, stackTrace);
@@ -55,7 +55,7 @@
       sink.close();
     });
 
-    test("transforms done events", () {
+    test('transforms done events', () {
       var transformer = StreamSinkTransformer.fromStreamTransformer(
           StreamTransformer.fromHandlers(handleDone: (sink) {
         sink.add(1);
@@ -71,7 +71,7 @@
       sink.close();
     });
 
-    test("forwards the future from inner.close", () async {
+    test('forwards the future from inner.close', () async {
       var transformer = StreamSinkTransformer.fromStreamTransformer(
           StreamTransformer.fromHandlers());
       var innerSink = CompleterStreamSink();
@@ -104,18 +104,18 @@
 
       // This will close the inner sink, but it shouldn't top-level the error.
       sink.add(1);
-      innerSink.completer.completeError("oh no");
+      innerSink.completer.completeError('oh no');
       await flushMicrotasks();
 
       // The error should be piped through done and close even if they're called
       // after the underlying sink is closed.
-      expect(sink.done, throwsA("oh no"));
-      expect(sink.close(), throwsA("oh no"));
+      expect(sink.done, throwsA('oh no'));
+      expect(sink.close(), throwsA('oh no'));
     });
   });
 
-  group("fromHandlers", () {
-    test("transforms data events", () {
+  group('fromHandlers', () {
+    test('transforms data events', () {
       var transformer =
           StreamSinkTransformer.fromHandlers(handleData: (i, sink) {
         sink.add(i * 2);
@@ -133,7 +133,7 @@
       sink.close();
     });
 
-    test("transforms error events", () {
+    test('transforms error events', () {
       var transformer = StreamSinkTransformer.fromHandlers(
           handleError: (i, stackTrace, sink) {
         sink.addError((i as num) * 2, stackTrace);
@@ -154,7 +154,7 @@
       sink.close();
     });
 
-    test("transforms done events", () {
+    test('transforms done events', () {
       var transformer = StreamSinkTransformer.fromHandlers(handleDone: (sink) {
         sink.add(1);
         sink.close();
@@ -169,7 +169,7 @@
       sink.close();
     });
 
-    test("forwards the future from inner.close", () async {
+    test('forwards the future from inner.close', () async {
       var transformer = StreamSinkTransformer.fromHandlers();
       var innerSink = CompleterStreamSink();
       var sink = transformer.bind(innerSink);
@@ -201,13 +201,13 @@
 
       // This will close the inner sink, but it shouldn't top-level the error.
       sink.add(1);
-      innerSink.completer.completeError("oh no");
+      innerSink.completer.completeError('oh no');
       await flushMicrotasks();
 
       // The error should be piped through done and close even if they're called
       // after the underlying sink is closed.
-      expect(sink.done, throwsA("oh no"));
-      expect(sink.close(), throwsA("oh no"));
+      expect(sink.done, throwsA('oh no'));
+      expect(sink.close(), throwsA('oh no'));
     });
   });
 }
diff --git a/test/stream_splitter_test.dart b/test/stream_splitter_test.dart
index 497f125..fd37f87 100644
--- a/test/stream_splitter_test.dart
+++ b/test/stream_splitter_test.dart
@@ -7,7 +7,7 @@
 import 'package:async/async.dart';
 import 'package:test/test.dart';
 
-main() {
+void main() {
   StreamController<int> controller;
   StreamSplitter splitter;
   setUp(() {
@@ -37,12 +37,12 @@
     controller.close();
   });
 
-  test("a branch replays error events as well as data events", () {
+  test('a branch replays error events as well as data events', () {
     var branch = splitter.split();
     splitter.close();
 
     controller.add(1);
-    controller.addError("error");
+    controller.addError('error');
     controller.add(3);
     controller.close();
 
@@ -54,7 +54,7 @@
           count++;
         }, count: 2), onError: expectAsync1((error) {
       expect(count, equals(1));
-      expect(error, equals("error"));
+      expect(error, equals('error'));
       count++;
     }), onDone: expectAsync0(() {
       expect(count, equals(3));
@@ -89,7 +89,7 @@
     splitter.close();
   });
 
-  test("creates single-subscription branches", () async {
+  test('creates single-subscription branches', () async {
     var branch = splitter.split();
     expect(branch.isBroadcast, isFalse);
     branch.listen(null);
@@ -101,7 +101,7 @@
   // 1.11 is released. In 1.10, the stream exposed by a StreamController didn't
   // have a reified type.
 
-  test("multiple branches each replay the stream", () async {
+  test('multiple branches each replay the stream', () async {
     var branch1 = splitter.split();
     controller.add(1);
     controller.add(2);
@@ -151,7 +151,7 @@
     expect(controller.hasListener, isTrue);
   });
 
-  test("the source stream is paused when all branches are paused", () async {
+  test('the source stream is paused when all branches are paused', () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
     var branch3 = splitter.split();
@@ -178,7 +178,7 @@
     expect(controller.isPaused, isFalse);
   });
 
-  test("the source stream is paused when all branches are canceled", () async {
+  test('the source stream is paused when all branches are canceled', () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
     var branch3 = splitter.split();
@@ -211,7 +211,7 @@
 
   test(
       "the source stream is canceled when it's closed after all branches have "
-      "been canceled", () async {
+      'been canceled', () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
     var branch3 = splitter.split();
@@ -237,8 +237,8 @@
   });
 
   test(
-      "the source stream is canceled when all branches are canceled after it "
-      "has been closed", () async {
+      'the source stream is canceled when all branches are canceled after it '
+      'has been closed', () async {
     var branch1 = splitter.split();
     var branch2 = splitter.split();
     var branch3 = splitter.split();
@@ -263,7 +263,7 @@
 
   test(
       "a splitter that's closed before any branches are added never listens "
-      "to the source stream", () {
+      'to the source stream', () {
     splitter.close();
 
     // This would throw an error if the stream had already been listened to.
@@ -271,8 +271,8 @@
   });
 
   test(
-      "splitFrom splits a source stream into the designated number of "
-      "branches", () {
+      'splitFrom splits a source stream into the designated number of '
+      'branches', () {
     var branches = StreamSplitter.splitFrom(controller.stream, 5);
 
     controller.add(1);
diff --git a/test/stream_zip_test.dart b/test/stream_zip_test.dart
index 1e5f524..f462996 100644
--- a/test/stream_zip_test.dart
+++ b/test/stream_zip_test.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
 /// Create an error with the same values as [base], except that it throwsA
 /// when seeing the value [errorValue].
@@ -16,10 +16,10 @@
 /// Make a [Stream] from an [Iterable] by adding events to a stream controller
 /// at periodic intervals.
 Stream mks(Iterable iterable) {
-  Iterator iterator = iterable.iterator;
-  StreamController controller = StreamController();
+  var iterator = iterable.iterator;
+  var controller = StreamController();
   // Some varying time between 3 and 10 ms.
-  int ms = ((++ctr) * 5) % 7 + 3;
+  var ms = ((++ctr) * 5) % 7 + 3;
   Timer.periodic(Duration(milliseconds: ms), (Timer timer) {
     if (iterator.moveNext()) {
       controller.add(iterator.current);
@@ -34,17 +34,17 @@
 /// Counter used to give varying delays for streams.
 int ctr = 0;
 
-main() {
+void main() {
   // Test that zipping [streams] gives the results iterated by [expectedData].
-  testZip(Iterable<Stream> streams, Iterable expectedData) {
-    List data = [];
+  void testZip(Iterable<Stream> streams, Iterable expectedData) {
+    var data = [];
     Stream zip = StreamZip(streams);
     zip.listen(data.add, onDone: expectAsync0(() {
       expect(data, equals(expectedData));
     }));
   }
 
-  test("Basic", () {
+  test('Basic', () {
     testZip([
       mks([1, 2, 3]),
       mks([4, 5, 6]),
@@ -56,7 +56,7 @@
     ]);
   });
 
-  test("Uneven length 1", () {
+  test('Uneven length 1', () {
     testZip([
       mks([1, 2, 3, 99, 100]),
       mks([4, 5, 6]),
@@ -68,7 +68,7 @@
     ]);
   });
 
-  test("Uneven length 2", () {
+  test('Uneven length 2', () {
     testZip([
       mks([1, 2, 3]),
       mks([4, 5, 6, 99, 100]),
@@ -80,7 +80,7 @@
     ]);
   });
 
-  test("Uneven length 3", () {
+  test('Uneven length 3', () {
     testZip([
       mks([1, 2, 3]),
       mks([4, 5, 6]),
@@ -92,7 +92,7 @@
     ]);
   });
 
-  test("Uneven length 4", () {
+  test('Uneven length 4', () {
     testZip([
       mks([1, 2, 3, 98]),
       mks([4, 5, 6]),
@@ -104,7 +104,7 @@
     ]);
   });
 
-  test("Empty 1", () {
+  test('Empty 1', () {
     testZip([
       mks([]),
       mks([4, 5, 6]),
@@ -112,7 +112,7 @@
     ], []);
   });
 
-  test("Empty 2", () {
+  test('Empty 2', () {
     testZip([
       mks([1, 2, 3]),
       mks([]),
@@ -120,7 +120,7 @@
     ], []);
   });
 
-  test("Empty 3", () {
+  test('Empty 3', () {
     testZip([
       mks([1, 2, 3]),
       mks([4, 5, 6]),
@@ -128,11 +128,11 @@
     ], []);
   });
 
-  test("Empty source", () {
+  test('Empty source', () {
     testZip([], []);
   });
 
-  test("Single Source", () {
+  test('Single Source', () {
     testZip([
       mks([1, 2, 3])
     ], [
@@ -142,12 +142,12 @@
     ]);
   });
 
-  test("Other-streams", () {
-    Stream st1 = mks([1, 2, 3, 4, 5, 6]).where((x) => x < 4);
+  test('Other-streams', () {
+    var st1 = mks([1, 2, 3, 4, 5, 6]).where((x) => x < 4);
     Stream st2 =
         Stream.periodic(const Duration(milliseconds: 5), (x) => x + 4).take(3);
-    StreamController c = StreamController.broadcast();
-    Stream st3 = c.stream;
+    var c = StreamController.broadcast();
+    var st3 = c.stream;
     testZip([
       st1,
       st2,
@@ -164,67 +164,66 @@
       ..close();
   });
 
-  test("Error 1", () {
+  test('Error 1', () {
     expect(
         StreamZip([
-          streamError(mks([1, 2, 3]), 2, "BAD-1"),
+          streamError(mks([1, 2, 3]), 2, 'BAD-1'),
           mks([4, 5, 6]),
           mks([7, 8, 9])
         ]).toList(),
-        throwsA(equals("BAD-1")));
+        throwsA(equals('BAD-1')));
   });
 
-  test("Error 2", () {
+  test('Error 2', () {
     expect(
         StreamZip([
           mks([1, 2, 3]),
-          streamError(mks([4, 5, 6]), 5, "BAD-2"),
+          streamError(mks([4, 5, 6]), 5, 'BAD-2'),
           mks([7, 8, 9])
         ]).toList(),
-        throwsA(equals("BAD-2")));
+        throwsA(equals('BAD-2')));
   });
 
-  test("Error 3", () {
+  test('Error 3', () {
     expect(
         StreamZip([
           mks([1, 2, 3]),
           mks([4, 5, 6]),
-          streamError(mks([7, 8, 9]), 8, "BAD-3")
+          streamError(mks([7, 8, 9]), 8, 'BAD-3')
         ]).toList(),
-        throwsA(equals("BAD-3")));
+        throwsA(equals('BAD-3')));
   });
 
-  test("Error at end", () {
+  test('Error at end', () {
     expect(
         StreamZip([
           mks([1, 2, 3]),
-          streamError(mks([4, 5, 6]), 6, "BAD-4"),
+          streamError(mks([4, 5, 6]), 6, 'BAD-4'),
           mks([7, 8, 9])
         ]).toList(),
-        throwsA(equals("BAD-4")));
+        throwsA(equals('BAD-4')));
   });
 
-  test("Error before first end", () {
+  test('Error before first end', () {
     // StreamControllers' streams with no "close" called will never be done,
     // so the fourth event of the first stream is guaranteed to come first.
     expect(
         StreamZip([
-          streamError(mks([1, 2, 3, 4]), 4, "BAD-5"),
+          streamError(mks([1, 2, 3, 4]), 4, 'BAD-5'),
           (StreamController()..add(4)..add(5)..add(6)).stream,
           (StreamController()..add(7)..add(8)..add(9)).stream
         ]).toList(),
-        throwsA(equals("BAD-5")));
+        throwsA(equals('BAD-5')));
   });
 
-  test("Error after first end", () {
-    StreamController controller = StreamController();
+  test('Error after first end', () {
+    var controller = StreamController();
     controller..add(7)..add(8)..add(9);
     // Transformer that puts error into controller when one of the first two
     // streams have sent a done event.
-    StreamTransformer trans =
-        StreamTransformer.fromHandlers(handleDone: (EventSink s) {
+    var trans = StreamTransformer.fromHandlers(handleDone: (EventSink s) {
       Timer.run(() {
-        controller.addError("BAD-6");
+        controller.addError('BAD-6');
       });
       s.close();
     });
@@ -239,16 +238,16 @@
     ]);
   });
 
-  test("Pause/Resume", () {
-    int sc1p = 0;
-    StreamController c1 = StreamController(onPause: () {
+  test('Pause/Resume', () {
+    var sc1p = 0;
+    var c1 = StreamController(onPause: () {
       sc1p++;
     }, onResume: () {
       sc1p--;
     });
 
-    int sc2p = 0;
-    StreamController c2 = StreamController(onPause: () {
+    var sc2p = 0;
+    var c2 = StreamController(onPause: () {
       sc2p++;
     }, onResume: () {
       sc2p--;
@@ -264,7 +263,7 @@
     const ms25 = Duration(milliseconds: 25);
 
     // StreamIterator uses pause and resume to control flow.
-    StreamIterator it = StreamIterator(zip);
+    var it = StreamIterator(zip);
 
     it.moveNext().then((hasMore) {
       expect(hasMore, isTrue);
@@ -301,11 +300,11 @@
     c2..add(2)..add(4);
   });
 
-  test("pause-resume2", () {
+  test('pause-resume2', () {
     var s1 = Stream.fromIterable([0, 2, 4, 6, 8]);
     var s2 = Stream.fromIterable([1, 3, 5, 7]);
     var sz = StreamZip([s1, s2]);
-    int ctr = 0;
+    var ctr = 0;
     StreamSubscription sub;
     sub = sz.listen(expectAsync1((v) {
       expect(v, equals([ctr * 2, ctr * 2 + 1]));
diff --git a/test/stream_zip_zone_test.dart b/test/stream_zip_zone_test.dart
index c7756e6..68cd723 100644
--- a/test/stream_zip_zone_test.dart
+++ b/test/stream_zip_zone_test.dart
@@ -2,36 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
-import "package:test/test.dart";
+import 'dart:async';
+
+import 'package:test/test.dart';
 
 // Test that stream listener callbacks all happen in the zone where the
 // listen occurred.
 
-main() {
+void main() {
   StreamController controller;
   controller = StreamController();
-  testStream("singlesub-async", controller, controller.stream);
+  testStream('singlesub-async', controller, controller.stream);
   controller = StreamController.broadcast();
-  testStream("broadcast-async", controller, controller.stream);
+  testStream('broadcast-async', controller, controller.stream);
   controller = StreamController();
   testStream(
-      "asbroadcast-async", controller, controller.stream.asBroadcastStream());
+      'asbroadcast-async', controller, controller.stream.asBroadcastStream());
 
   controller = StreamController(sync: true);
-  testStream("singlesub-sync", controller, controller.stream);
+  testStream('singlesub-sync', controller, controller.stream);
   controller = StreamController.broadcast(sync: true);
-  testStream("broadcast-sync", controller, controller.stream);
+  testStream('broadcast-sync', controller, controller.stream);
   controller = StreamController(sync: true);
   testStream(
-      "asbroadcast-sync", controller, controller.stream.asBroadcastStream());
+      'asbroadcast-sync', controller, controller.stream.asBroadcastStream());
 }
 
 void testStream(String name, StreamController controller, Stream stream) {
   test(name, () {
-    Zone outer = Zone.current;
+    var outer = Zone.current;
     runZoned(() {
-      Zone newZone1 = Zone.current;
+      var newZone1 = Zone.current;
       StreamSubscription sub;
       sub = stream.listen(expectAsync1((v) {
         expect(v, 42);
diff --git a/test/subscription_stream_test.dart b/test/subscription_stream_test.dart
index 9460dec..0b24a02 100644
--- a/test/subscription_stream_test.dart
+++ b/test/subscription_stream_test.dart
@@ -2,15 +2,15 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart" show SubscriptionStream;
-import "package:test/test.dart";
+import 'package:async/async.dart' show SubscriptionStream;
+import 'package:test/test.dart';
 
-import "utils.dart";
+import 'utils.dart';
 
-main() {
-  test("subscription stream of an entire subscription", () async {
+void main() {
+  test('subscription stream of an entire subscription', () async {
     var stream = createStream();
     var subscription = stream.listen(null);
     var subscriptionStream = SubscriptionStream<int>(subscription);
@@ -18,7 +18,7 @@
     expect(subscriptionStream.toList(), completion([1, 2, 3, 4]));
   });
 
-  test("subscription stream after two events", () async {
+  test('subscription stream after two events', () async {
     var stream = createStream();
     var skips = 0;
     var completer = Completer();
@@ -35,7 +35,7 @@
     expect(subscriptionStream.toList(), completion([3, 4]));
   });
 
-  test("listening twice fails", () async {
+  test('listening twice fails', () async {
     var stream = createStream();
     var sourceSubscription = stream.listen(null);
     var subscriptionStream = SubscriptionStream<int>(sourceSubscription);
@@ -44,7 +44,7 @@
     await subscription.cancel();
   });
 
-  test("pause and cancel passed through to original stream", () async {
+  test('pause and cancel passed through to original stream', () async {
     var controller = StreamController(onCancel: () async => 42);
     var sourceSubscription = controller.stream.listen(null);
     var subscriptionStream = SubscriptionStream(sourceSubscription);
@@ -69,9 +69,9 @@
     expect(controller.hasListener, isFalse);
   });
 
-  group("cancelOnError source:", () {
+  group('cancelOnError source:', () {
     for (var sourceCancels in [false, true]) {
-      group("${sourceCancels ? "yes" : "no"}:", () {
+      group('${sourceCancels ? "yes" : "no"}:', () {
         SubscriptionStream subscriptionStream;
         Future onCancel; // Completes if source stream is canceled before done.
         setUp(() {
@@ -83,16 +83,16 @@
           subscriptionStream = SubscriptionStream<int>(sourceSubscription);
         });
 
-        test("- subscriptionStream: no", () async {
+        test('- subscriptionStream: no', () async {
           var done = Completer();
           var events = [];
           subscriptionStream.listen(events.add,
               onError: events.add, onDone: done.complete, cancelOnError: false);
-          var expected = [1, 2, "To err is divine!"];
+          var expected = [1, 2, 'To err is divine!'];
           if (sourceCancels) {
             await onCancel;
             // And [done] won't complete at all.
-            bool isDone = false;
+            var isDone = false;
             done.future.then((_) {
               isDone = true;
             });
@@ -105,7 +105,7 @@
           expect(events, expected);
         });
 
-        test("- subscriptionStream: yes", () async {
+        test('- subscriptionStream: yes', () async {
           var completer = Completer();
           var events = [];
           subscriptionStream.listen(events.add,
@@ -113,18 +113,18 @@
                 events.add(value);
                 completer.complete();
               },
-              onDone: () => throw "should not happen",
+              onDone: () => throw 'should not happen',
               cancelOnError: true);
           await completer.future;
           await flushMicrotasks();
-          expect(events, [1, 2, "To err is divine!"]);
+          expect(events, [1, 2, 'To err is divine!']);
         });
       });
     }
 
     for (var cancelOnError in [false, true]) {
-      group(cancelOnError ? "yes" : "no", () {
-        test("- no error, value goes to asFuture", () async {
+      group(cancelOnError ? 'yes' : 'no', () {
+        test('- no error, value goes to asFuture', () async {
           var stream = createStream();
           var sourceSubscription =
               stream.listen(null, cancelOnError: cancelOnError);
@@ -134,7 +134,7 @@
           expect(subscription.asFuture(42), completion(42));
         });
 
-        test("- error goes to asFuture", () async {
+        test('- error goes to asFuture', () async {
           var stream = createErrorStream();
           var sourceSubscription =
               stream.listen(null, cancelOnError: cancelOnError);
@@ -160,13 +160,13 @@
 }
 
 Stream<int> createErrorStream([Completer onCancel]) async* {
-  bool canceled = true;
+  var canceled = true;
   try {
     yield 1;
     await flushMicrotasks();
     yield 2;
     await flushMicrotasks();
-    yield* Future<int>.error("To err is divine!").asStream();
+    yield* Future<int>.error('To err is divine!').asStream();
     await flushMicrotasks();
     yield 4;
     await flushMicrotasks();
@@ -181,5 +181,7 @@
 }
 
 Stream<int> createLongStream() async* {
-  for (int i = 0; i < 200; i++) yield i;
+  for (var i = 0; i < 200; i++) {
+    yield i;
+  }
 }
diff --git a/test/subscription_transformer_test.dart b/test/subscription_transformer_test.dart
index 64f45ec..f0e3a70 100644
--- a/test/subscription_transformer_test.dart
+++ b/test/subscription_transformer_test.dart
@@ -10,8 +10,8 @@
 import 'utils.dart';
 
 void main() {
-  group("with no callbacks", () {
-    test("forwards cancellation", () async {
+  group('with no callbacks', () {
+    test('forwards cancellation', () async {
       var isCanceled = false;
       var cancelCompleter = Completer();
       var controller = StreamController(onCancel: expectAsync0(() {
@@ -39,7 +39,7 @@
       expect(subscription.cancel(), completes);
     });
 
-    test("forwards pausing and resuming", () async {
+    test('forwards pausing and resuming', () async {
       var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer())
@@ -62,7 +62,7 @@
       expect(controller.isPaused, isFalse);
     });
 
-    test("forwards pausing with a resume future", () async {
+    test('forwards pausing with a resume future', () async {
       var controller = StreamController();
       var subscription = controller.stream
           .transform(subscriptionTransformer())
@@ -79,8 +79,8 @@
     });
   });
 
-  group("with a cancel callback", () {
-    test("invokes the callback when the subscription is canceled", () async {
+  group('with a cancel callback', () {
+    test('invokes the callback when the subscription is canceled', () async {
       var isCanceled = false;
       var callbackInvoked = false;
       var controller = StreamController(onCancel: expectAsync0(() {
@@ -103,7 +103,7 @@
       expect(isCanceled, isTrue);
     });
 
-    test("invokes the callback once and caches its result", () async {
+    test('invokes the callback once and caches its result', () async {
       var completer = Completer();
       var controller = StreamController();
       var subscription = controller.stream
@@ -132,8 +132,8 @@
     });
   });
 
-  group("with a pause callback", () {
-    test("invokes the callback when pause is called", () async {
+  group('with a pause callback', () {
+    test('invokes the callback when pause is called', () async {
       var pauseCount = 0;
       var controller = StreamController();
       var subscription = controller.stream
@@ -180,8 +180,8 @@
     });
   });
 
-  group("with a resume callback", () {
-    test("invokes the callback when resume is called", () async {
+  group('with a resume callback', () {
+    test('invokes the callback when resume is called', () async {
       var resumeCount = 0;
       var controller = StreamController();
       var subscription = controller.stream
@@ -213,7 +213,7 @@
       expect(resumeCount, equals(3));
     });
 
-    test("invokes the callback when a resume future completes", () async {
+    test('invokes the callback when a resume future completes', () async {
       var resumed = false;
       var controller = StreamController();
       var subscription = controller.stream.transform(
@@ -247,7 +247,7 @@
     });
   });
 
-  group("when the outer subscription is canceled but the inner is not", () {
+  group('when the outer subscription is canceled but the inner is not', () {
     StreamSubscription subscription;
     setUp(() {
       var controller = StreamController();
@@ -258,7 +258,7 @@
               onDone: expectAsync0(() {}, count: 0));
       subscription.cancel();
       controller.add(1);
-      controller.addError("oh no!");
+      controller.addError('oh no!');
       controller.close();
     });
 
@@ -277,11 +277,11 @@
       await flushMicrotasks();
     });
 
-    test("isPaused returns false", () {
+    test('isPaused returns false', () {
       expect(subscription.isPaused, isFalse);
     });
 
-    test("asFuture never completes", () async {
+    test('asFuture never completes', () async {
       subscription.asFuture().then(expectAsync1((_) {}, count: 0));
       await flushMicrotasks();
     });
diff --git a/test/typed_wrapper/stream_subscription_test.dart b/test/typed_wrapper/stream_subscription_test.dart
index bbec8f7..2a11546 100644
--- a/test/typed_wrapper/stream_subscription_test.dart
+++ b/test/typed_wrapper/stream_subscription_test.dart
@@ -4,13 +4,13 @@
 
 import 'dart:async';
 
-import "package:async/src/typed/stream_subscription.dart";
-import "package:test/test.dart";
+import 'package:async/src/typed/stream_subscription.dart';
+import 'package:test/test.dart';
 
 import '../utils.dart';
 
 void main() {
-  group("with valid types, forwards", () {
+  group('with valid types, forwards', () {
     StreamController controller;
     StreamSubscription wrapper;
     bool isCanceled;
@@ -21,26 +21,26 @@
       wrapper = TypeSafeStreamSubscription<int>(controller.stream.listen(null));
     });
 
-    test("onData()", () {
+    test('onData()', () {
       wrapper.onData(expectAsync1((data) {
         expect(data, equals(1));
       }));
       controller.add(1);
     });
 
-    test("onError()", () {
+    test('onError()', () {
       wrapper.onError(expectAsync1((error) {
-        expect(error, equals("oh no"));
+        expect(error, equals('oh no'));
       }));
-      controller.addError("oh no");
+      controller.addError('oh no');
     });
 
-    test("onDone()", () {
+    test('onDone()', () {
       wrapper.onDone(expectAsync0(() {}));
       controller.close();
     });
 
-    test("pause(), resume(), and isPaused", () async {
+    test('pause(), resume(), and isPaused', () async {
       expect(wrapper.isPaused, isFalse);
 
       wrapper.pause();
@@ -54,19 +54,19 @@
       expect(wrapper.isPaused, isFalse);
     });
 
-    test("cancel()", () async {
+    test('cancel()', () async {
       wrapper.cancel();
       await flushMicrotasks();
       expect(isCanceled, isTrue);
     });
 
-    test("asFuture()", () {
+    test('asFuture()', () {
       expect(wrapper.asFuture(12), completion(equals(12)));
       controller.close();
     });
   });
 
-  group("with invalid types,", () {
+  group('with invalid types,', () {
     StreamController controller;
     StreamSubscription wrapper;
     bool isCanceled;
@@ -77,8 +77,8 @@
       wrapper = TypeSafeStreamSubscription<int>(controller.stream.listen(null));
     });
 
-    group("throws a CastError for", () {
-      test("onData()", () {
+    group('throws a CastError for', () {
+      test('onData()', () {
         expect(() {
           // TODO(nweiz): Use the wrapper declared in setUp when sdk#26226 is
           // fixed.
@@ -87,28 +87,28 @@
               TypeSafeStreamSubscription<int>(controller.stream.listen(null));
 
           wrapper.onData(expectAsync1((_) {}, count: 0));
-          controller.add("foo");
+          controller.add('foo');
         }, throwsZonedCastError);
       });
     });
 
     group("doesn't throw a CastError for", () {
-      test("onError()", () {
+      test('onError()', () {
         wrapper.onError(expectAsync1((error) {
-          expect(error, equals("oh no"));
+          expect(error, equals('oh no'));
         }));
-        controller.add("foo");
-        controller.addError("oh no");
+        controller.add('foo');
+        controller.addError('oh no');
       });
 
-      test("onDone()", () {
+      test('onDone()', () {
         wrapper.onDone(expectAsync0(() {}));
-        controller.add("foo");
+        controller.add('foo');
         controller.close();
       });
 
-      test("pause(), resume(), and isPaused", () async {
-        controller.add("foo");
+      test('pause(), resume(), and isPaused', () async {
+        controller.add('foo');
 
         expect(wrapper.isPaused, isFalse);
 
@@ -123,17 +123,17 @@
         expect(wrapper.isPaused, isFalse);
       });
 
-      test("cancel()", () async {
-        controller.add("foo");
+      test('cancel()', () async {
+        controller.add('foo');
 
         wrapper.cancel();
         await flushMicrotasks();
         expect(isCanceled, isTrue);
       });
 
-      test("asFuture()", () {
+      test('asFuture()', () {
         expect(wrapper.asFuture(12), completion(equals(12)));
-        controller.add("foo");
+        controller.add('foo');
         controller.close();
       });
     });
diff --git a/test/utils.dart b/test/utils.dart
index e517c78..b09d06b 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Helper utilities for testing.
-import "dart:async";
+import 'dart:async';
 
-import "package:async/async.dart";
-import "package:test/test.dart";
+import 'package:async/async.dart';
+import 'package:test/test.dart';
 
 /// A zero-millisecond timer should wait until after all microtasks.
 Future flushMicrotasks() => Future.delayed(Duration.zero);
@@ -17,7 +17,7 @@
 ///
 /// Returns a function that fails the test if it is ever called.
 OptionalArgAction unreachable(String name) =>
-    ([a, b]) => fail("Unreachable: $name");
+    ([a, b]) => fail('Unreachable: $name');
 
 // TODO(nweiz): Use the version of this in test when test#418 is fixed.
 /// A matcher that runs a callback in its own zone and asserts that that zone
@@ -46,9 +46,10 @@
 /// A badly behaved stream which throws if it's ever listened to.
 ///
 /// Can be used to test cases where a stream should not be used.
-class UnusableStream extends Stream {
-  listen(onData, {onError, onDone, cancelOnError}) {
-    throw UnimplementedError("Gotcha!");
+class UnusableStream<T> extends Stream<T> {
+  @override
+  StreamSubscription<T> listen(onData, {onError, onDone, cancelOnError}) {
+    throw UnimplementedError('Gotcha!');
   }
 }
 
@@ -60,11 +61,16 @@
 class CompleterStreamSink<T> implements StreamSink<T> {
   final completer = Completer();
 
+  @override
   Future get done => completer.future;
 
+  @override
   void add(T event) {}
+  @override
   void addError(error, [StackTrace stackTrace]) {}
+  @override
   Future addStream(Stream<T> stream) async {}
+  @override
   Future close() => completer.future;
 }
 
@@ -79,6 +85,7 @@
   bool get isClosed => _isClosed;
   var _isClosed = false;
 
+  @override
   Future get done => _doneCompleter.future;
   final _doneCompleter = Completer();
 
@@ -88,22 +95,26 @@
   ///
   /// If [onDone] is passed, it's called when the user calls [close]. Its result
   /// is piped to the [done] future.
-  TestSink({onDone()}) : _onDone = onDone ?? (() {});
+  TestSink({void Function() onDone}) : _onDone = onDone ?? (() {});
 
+  @override
   void add(T event) {
     results.add(Result<T>.value(event));
   }
 
+  @override
   void addError(error, [StackTrace stackTrace]) {
     results.add(Result<T>.error(error, stackTrace));
   }
 
+  @override
   Future addStream(Stream<T> stream) {
     var completer = Completer.sync();
     stream.listen(add, onError: addError, onDone: completer.complete);
     return completer.future;
   }
 
+  @override
   Future close() {
     _isClosed = true;
     _doneCompleter.complete(Future.microtask(_onDone));
