Fix newly enforced package:pedantic lints (#92)

- always_declare_return_types
- annotate_overrides
- curly_braces_in_flow_control_structures
- omit_local_variable_types
- prefer_collection_literals
- prefer_conditional_assignment
- prefer_single_quotes
- type_init_formals
- unnecessary_this
- use_function_type_syntax_for_parameters

Bump minimum SDK to 2.2.0 for Set literals
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));