Merge the null_safety branch into master (dart-lang/stream_channel#60)

diff --git a/pkgs/stream_channel/.travis.yml b/pkgs/stream_channel/.travis.yml
index d6a5454..b4907d5 100644
--- a/pkgs/stream_channel/.travis.yml
+++ b/pkgs/stream_channel/.travis.yml
@@ -1,27 +1,16 @@
 language: dart
 
 dart:
-- 2.2.0
 - dev
 
 dart_task:
 - test: --platform vm,chrome
-
-matrix:
-  include:
-  # Only validate formatting using the dev release
-  - dart: dev
-    dart_task: dartfmt
-  - dart: dev
-    dart_task:
-      dartanalyzer: --fatal-infos --fatal-warnings .
-  - dart: 2.2.0
-    dart_task:
-      dartanalyzer: --fatal-warnings .
+- dartfmt
+- dartanalyzer: --fatal-infos --fatal-warnings .
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
-  only: [master]
+  only: [master, null_safety]
 
 cache:
   directories:
diff --git a/pkgs/stream_channel/CHANGELOG.md b/pkgs/stream_channel/CHANGELOG.md
index 8421292..2c4a13c 100644
--- a/pkgs/stream_channel/CHANGELOG.md
+++ b/pkgs/stream_channel/CHANGELOG.md
@@ -1,6 +1,6 @@
-## 2.1.0-dev
+## 2.1.0-nullsafety
 
-* Require Dart `2.2.0` or later.
+* Migrate to null safety.
 
 ## 2.0.0
 
diff --git a/pkgs/stream_channel/analysis_options.yaml b/pkgs/stream_channel/analysis_options.yaml
index b36c874..8a712df 100644
--- a/pkgs/stream_channel/analysis_options.yaml
+++ b/pkgs/stream_channel/analysis_options.yaml
@@ -8,6 +8,8 @@
     unused_element: error
     unused_local_variable: error
     dead_code: error
+  enable-experiment:
+    - non-nullable
 
 linter:
   rules:
diff --git a/pkgs/stream_channel/lib/src/close_guarantee_channel.dart b/pkgs/stream_channel/lib/src/close_guarantee_channel.dart
index 60916d0..25f5022 100644
--- a/pkgs/stream_channel/lib/src/close_guarantee_channel.dart
+++ b/pkgs/stream_channel/lib/src/close_guarantee_channel.dart
@@ -16,14 +16,14 @@
 class CloseGuaranteeChannel<T> extends StreamChannelMixin<T> {
   @override
   Stream<T> get stream => _stream;
-  _CloseGuaranteeStream<T> _stream;
+  late final _CloseGuaranteeStream<T> _stream;
 
   @override
   StreamSink<T> get sink => _sink;
-  _CloseGuaranteeSink<T> _sink;
+  late final _CloseGuaranteeSink<T> _sink;
 
   /// The subscription to the inner stream.
-  StreamSubscription<T> _subscription;
+  StreamSubscription<T>? _subscription;
 
   /// Whether the sink has closed, causing the underlying channel to disconnect.
   bool _disconnected = false;
@@ -48,8 +48,8 @@
   _CloseGuaranteeStream(this._inner, this._channel);
 
   @override
-  StreamSubscription<T> listen(void Function(T) onData,
-      {Function onError, void Function() onDone, bool cancelOnError}) {
+  StreamSubscription<T> listen(void Function(T)? onData,
+      {Function? onError, void Function()? onDone, bool? cancelOnError}) {
     // If the channel is already disconnected, we shouldn't dispatch anything
     // but a done event.
     if (_channel._disconnected) {
@@ -80,10 +80,11 @@
   Future<void> close() {
     var done = super.close();
     _channel._disconnected = true;
-    if (_channel._subscription != null) {
+    var subscription = _channel._subscription;
+    if (subscription != null) {
       // Don't dispatch anything but a done event.
-      _channel._subscription.onData(null);
-      _channel._subscription.onError(null);
+      subscription.onData(null);
+      subscription.onError(null);
     }
     return done;
   }
diff --git a/pkgs/stream_channel/lib/src/disconnector.dart b/pkgs/stream_channel/lib/src/disconnector.dart
index e883537..a424146 100644
--- a/pkgs/stream_channel/lib/src/disconnector.dart
+++ b/pkgs/stream_channel/lib/src/disconnector.dart
@@ -74,11 +74,11 @@
 
   /// The subscription to the stream passed to [addStream], if a stream is
   /// currently being added.
-  StreamSubscription<T> _addStreamSubscription;
+  StreamSubscription<T>? _addStreamSubscription;
 
   /// The completer for the future returned by [addStream], if a stream is
   /// currently being added.
-  Completer _addStreamCompleter;
+  Completer? _addStreamCompleter;
 
   /// Whether we're currently adding a stream with [addStream].
   bool get _inAddStream => _addStreamSubscription != null;
@@ -97,7 +97,7 @@
   }
 
   @override
-  void addError(error, [StackTrace stackTrace]) {
+  void addError(error, [StackTrace? stackTrace]) {
     if (_closed) throw StateError('Cannot add event after closing.');
     if (_inAddStream) {
       throw StateError('Cannot add event while adding stream.');
@@ -117,8 +117,8 @@
 
     _addStreamCompleter = Completer.sync();
     _addStreamSubscription = stream.listen(_inner.add,
-        onError: _inner.addError, onDone: _addStreamCompleter.complete);
-    return _addStreamCompleter.future.then((_) {
+        onError: _inner.addError, onDone: _addStreamCompleter!.complete);
+    return _addStreamCompleter!.future.then((_) {
       _addStreamCompleter = null;
       _addStreamSubscription = null;
     });
@@ -143,7 +143,7 @@
     var future = _inner.close();
 
     if (_inAddStream) {
-      _addStreamCompleter.complete(_addStreamSubscription.cancel());
+      _addStreamCompleter!.complete(_addStreamSubscription!.cancel());
       _addStreamCompleter = null;
       _addStreamSubscription = null;
     }
diff --git a/pkgs/stream_channel/lib/src/guarantee_channel.dart b/pkgs/stream_channel/lib/src/guarantee_channel.dart
index cfee99e..4780b04 100644
--- a/pkgs/stream_channel/lib/src/guarantee_channel.dart
+++ b/pkgs/stream_channel/lib/src/guarantee_channel.dart
@@ -17,17 +17,17 @@
 
   @override
   StreamSink<T> get sink => _sink;
-  _GuaranteeSink<T> _sink;
+  late final _GuaranteeSink<T> _sink;
 
   /// The controller for [stream].
   ///
   /// This intermediate controller allows us to continue listening for a done
   /// event even after the user has canceled their subscription, and to send our
   /// own done event when the sink is closed.
-  StreamController<T> _streamController;
+  late final StreamController<T> _streamController;
 
   /// The subscription to the inner stream.
-  StreamSubscription<T> _subscription;
+  StreamSubscription<T>? _subscription;
 
   /// Whether the sink has closed, causing the underlying channel to disconnect.
   bool _disconnected = false;
@@ -64,7 +64,8 @@
   /// should stop emitting events.
   void _onSinkDisconnected() {
     _disconnected = true;
-    if (_subscription != null) _subscription.cancel();
+    var subscription = _subscription;
+    if (subscription != null) subscription.cancel();
     _streamController.close();
   }
 }
@@ -95,11 +96,11 @@
 
   /// The subscription to the stream passed to [addStream], if a stream is
   /// currently being added.
-  StreamSubscription<T> _addStreamSubscription;
+  StreamSubscription<T>? _addStreamSubscription;
 
   /// The completer for the future returned by [addStream], if a stream is
   /// currently being added.
-  Completer _addStreamCompleter;
+  Completer? _addStreamCompleter;
 
   /// Whether we're currently adding a stream with [addStream].
   bool get _inAddStream => _addStreamSubscription != null;
@@ -125,7 +126,7 @@
   }
 
   @override
-  void addError(error, [StackTrace stackTrace]) {
+  void addError(error, [StackTrace? stackTrace]) {
     if (_closed) throw StateError('Cannot add event after closing.');
     if (_inAddStream) {
       throw StateError('Cannot add event while adding stream.');
@@ -139,7 +140,7 @@
   ///
   /// This is called from [addStream], so it shouldn't fail if a stream is being
   /// added.
-  void _addError(error, [StackTrace stackTrace]) {
+  void _addError(Object error, [StackTrace? stackTrace]) {
     if (_allowErrors) {
       _inner.addError(error, stackTrace);
       return;
@@ -166,8 +167,8 @@
 
     _addStreamCompleter = Completer.sync();
     _addStreamSubscription = stream.listen(_inner.add,
-        onError: _addError, onDone: _addStreamCompleter.complete);
-    return _addStreamCompleter.future.then((_) {
+        onError: _addError, onDone: _addStreamCompleter!.complete);
+    return _addStreamCompleter!.future.then((_) {
       _addStreamCompleter = null;
       _addStreamSubscription = null;
     });
@@ -199,7 +200,7 @@
     if (!_doneCompleter.isCompleted) _doneCompleter.complete();
 
     if (!_inAddStream) return;
-    _addStreamCompleter.complete(_addStreamSubscription.cancel());
+    _addStreamCompleter!.complete(_addStreamSubscription!.cancel());
     _addStreamCompleter = null;
     _addStreamSubscription = null;
   }
diff --git a/pkgs/stream_channel/lib/src/isolate_channel.dart b/pkgs/stream_channel/lib/src/isolate_channel.dart
index 8c1b568..55c9814 100644
--- a/pkgs/stream_channel/lib/src/isolate_channel.dart
+++ b/pkgs/stream_channel/lib/src/isolate_channel.dart
@@ -51,7 +51,7 @@
     // The first message across the ReceivePort should be a SendPort pointing to
     // the remote end. If it's not, we'll make the stream emit an error
     // complaining.
-    StreamSubscription<dynamic> subscription;
+    late StreamSubscription<dynamic> subscription;
     subscription = receivePort.listen((message) {
       if (message is SendPort) {
         var controller =
diff --git a/pkgs/stream_channel/lib/src/json_document_transformer.dart b/pkgs/stream_channel/lib/src/json_document_transformer.dart
index 8bffc8a..237193b 100644
--- a/pkgs/stream_channel/lib/src/json_document_transformer.dart
+++ b/pkgs/stream_channel/lib/src/json_document_transformer.dart
@@ -18,14 +18,14 @@
 /// If the transformed channel emits invalid JSON, this emits a
 /// [FormatException]. If an unencodable object is added to the sink, it
 /// synchronously throws a [JsonUnsupportedObjectError].
-final StreamChannelTransformer<Object, String> jsonDocument =
+final StreamChannelTransformer<Object?, String> jsonDocument =
     const _JsonDocument();
 
-class _JsonDocument implements StreamChannelTransformer<Object, String> {
+class _JsonDocument implements StreamChannelTransformer<Object?, String> {
   const _JsonDocument();
 
   @override
-  StreamChannel<Object> bind(StreamChannel<String> channel) {
+  StreamChannel<Object?> bind(StreamChannel<String> channel) {
     var stream = channel.stream.map(jsonDecode);
     var sink = StreamSinkTransformer<Object, String>.fromHandlers(
         handleData: (data, sink) {
diff --git a/pkgs/stream_channel/lib/src/multi_channel.dart b/pkgs/stream_channel/lib/src/multi_channel.dart
index 79f247e..e1e25ea 100644
--- a/pkgs/stream_channel/lib/src/multi_channel.dart
+++ b/pkgs/stream_channel/lib/src/multi_channel.dart
@@ -73,7 +73,7 @@
   ///
   /// Throws an [ArgumentError] if a virtual channel already exists for [id].
   /// Throws a [StateError] if the underlying channel is closed.
-  VirtualChannel<T> virtualChannel([int id]);
+  VirtualChannel<T> virtualChannel([int? id]);
 }
 
 /// The implementation of [MultiChannel].
@@ -85,10 +85,10 @@
   /// The inner channel over which all communication is conducted.
   ///
   /// This will be `null` if the underlying communication channel is closed.
-  StreamChannel<dynamic> _inner;
+  StreamChannel<dynamic>? _inner;
 
   /// The subscription to [_inner].stream.
-  StreamSubscription<dynamic> _innerStreamSubscription;
+  StreamSubscription<dynamic>? _innerStreamSubscription;
 
   @override
   Stream<T> get stream => _mainController.foreign.stream;
@@ -132,15 +132,15 @@
   /// it's coming from a channel that was originally created locally.
   var _nextId = 1;
 
-  _MultiChannel(this._inner) {
+  _MultiChannel(StreamChannel<dynamic> inner) : _inner = inner {
     // The default connection is a special case which has id 0 on both ends.
     // This allows it to begin connected without having to send over an id.
     _controllers[0] = _mainController;
     _mainController.local.stream.listen(
-        (message) => _inner.sink.add([0, message]),
+        (message) => _inner!.sink.add(<Object?>[0, message]),
         onDone: () => _closeChannel(0, 0));
 
-    _innerStreamSubscription = _inner.stream.cast<List>().listen((message) {
+    _innerStreamSubscription = _inner!.stream.cast<List>().listen((message) {
       var id = message[0] as int;
 
       // If the channel was closed before an incoming message was processed,
@@ -170,7 +170,7 @@
   }
 
   @override
-  VirtualChannel<T> virtualChannel([int id]) {
+  VirtualChannel<T> virtualChannel([int? id]) {
     int inputId;
     int outputId;
     if (id != null) {
@@ -194,11 +194,11 @@
       return VirtualChannel._(this, inputId, Stream.empty(), NullStreamSink());
     }
 
-    StreamChannelController<T> controller;
+    late StreamChannelController<T> controller;
     if (_pendingIds.remove(inputId)) {
       // If we've already received messages for this channel, use the controller
       // where those messages are buffered.
-      controller = _controllers[inputId];
+      controller = _controllers[inputId]!;
     } else if (_controllers.containsKey(inputId) ||
         _closedIds.contains(inputId)) {
       throw ArgumentError('A virtual channel with id $id already exists.');
@@ -208,7 +208,7 @@
     }
 
     controller.local.stream.listen(
-        (message) => _inner.sink.add([outputId, message]),
+        (message) => _inner!.sink.add(<Object?>[outputId, message]),
         onDone: () => _closeChannel(inputId, outputId));
     return VirtualChannel._(
         this, outputId, controller.foreign.stream, controller.foreign.sink);
@@ -218,21 +218,21 @@
   /// outgoing messages have [outputId].
   void _closeChannel(int inputId, int outputId) {
     _closedIds.add(inputId);
-    var controller = _controllers.remove(inputId);
+    var controller = _controllers.remove(inputId)!;
     controller.local.sink.close();
 
     if (_inner == null) return;
 
     // A message without data indicates that the virtual channel has been
     // closed.
-    _inner.sink.add([outputId]);
+    _inner!.sink.add([outputId]);
     if (_controllers.isEmpty) _closeInnerChannel();
   }
 
   /// Closes the underlying communication channel.
   void _closeInnerChannel() {
-    _inner.sink.close();
-    _innerStreamSubscription.cancel();
+    _inner!.sink.close();
+    _innerStreamSubscription!.cancel();
     _inner = null;
 
     // Convert this to a list because the close is dispatched synchronously, and
diff --git a/pkgs/stream_channel/lib/src/stream_channel_completer.dart b/pkgs/stream_channel/lib/src/stream_channel_completer.dart
index a14ffde..f6fef25 100644
--- a/pkgs/stream_channel/lib/src/stream_channel_completer.dart
+++ b/pkgs/stream_channel/lib/src/stream_channel_completer.dart
@@ -22,7 +22,7 @@
 
   /// The channel for this completer.
   StreamChannel<T> get channel => _channel;
-  StreamChannel<T> _channel;
+  late final StreamChannel<T> _channel;
 
   /// Whether [setChannel] has been called.
   bool _set = false;
@@ -66,7 +66,7 @@
   ///
   /// Either [setChannel] or [setError] may be called at most once. Trying to
   /// call either of them again will fail.
-  void setError(error, [StackTrace stackTrace]) {
+  void setError(Object error, [StackTrace? stackTrace]) {
     if (_set) throw StateError('The channel has already been set.');
     _set = true;
 
diff --git a/pkgs/stream_channel/lib/src/stream_channel_controller.dart b/pkgs/stream_channel/lib/src/stream_channel_controller.dart
index 136886d..5c78866 100644
--- a/pkgs/stream_channel/lib/src/stream_channel_controller.dart
+++ b/pkgs/stream_channel/lib/src/stream_channel_controller.dart
@@ -33,14 +33,14 @@
   /// This channel should be used directly by the creator of this
   /// [StreamChannelController] to send and receive events.
   StreamChannel<T> get local => _local;
-  StreamChannel<T> _local;
+  late final StreamChannel<T> _local;
 
   /// The foreign channel.
   ///
   /// This channel should be returned to external users so they can communicate
   /// with [local].
   StreamChannel<T> get foreign => _foreign;
-  StreamChannel<T> _foreign;
+  late final StreamChannel<T> _foreign;
 
   /// Creates a [StreamChannelController].
   ///
diff --git a/pkgs/stream_channel/pubspec.yaml b/pkgs/stream_channel/pubspec.yaml
index 61e78c0..e4208b9 100644
--- a/pkgs/stream_channel/pubspec.yaml
+++ b/pkgs/stream_channel/pubspec.yaml
@@ -1,5 +1,5 @@
 name: stream_channel
-version: 2.1.0-dev
+version: 2.1.0-nullsafety
 
 description: >-
   An abstraction for two-way communication channels based on the Dart Stream
@@ -8,11 +8,86 @@
 homepage: https://github.com/dart-lang/stream_channel
 
 environment:
-  sdk: '>=2.2.0 <3.0.0'
+  sdk: '>=2.9.0-18.0 <2.9.0'
 
 dependencies:
-  async: '>=1.11.0 <3.0.0'
+  async: '>=2.5.0-nullsafety <2.5.0'
 
 dev_dependencies:
   pedantic: ^1.8.0
   test: ^1.2.0
+
+dependency_overrides:
+  async:
+    git:
+      url: git://github.com/dart-lang/async.git
+      ref: null_safety
+  boolean_selector:
+    git:
+      url: git://github.com/dart-lang/boolean_selector.git
+      ref: null_safety
+  charcode:
+    git:
+      url: git://github.com/dart-lang/charcode.git
+      ref: null_safety
+  collection: 1.15.0-nullsafety
+  js:
+    git:
+      url: git://github.com/dart-lang/sdk.git
+      path: pkg/js
+  matcher:
+    git:
+      url: git://github.com/dart-lang/matcher.git
+      ref: null_safety
+  meta: 1.3.0-nullsafety
+  path:
+    git:
+      url: git://github.com/dart-lang/path.git
+      ref: null_safety
+  pedantic:
+    git:
+      url: git://github.com/dart-lang/pedantic.git
+      ref: null_safety
+  pool:
+    git:
+      url: git://github.com/dart-lang/pool.git
+      ref: null_safety
+  source_maps:
+    git:
+      url: git://github.com/dart-lang/source_maps.git
+      ref: null_safety
+  source_map_stack_trace:
+    git:
+      url: git://github.com/dart-lang/source_map_stack_trace.git
+      ref: null_safety
+  source_span:
+    git:
+      url: git://github.com/dart-lang/source_span.git
+      ref: null_safety
+  stack_trace:
+    git:
+      url: git://github.com/dart-lang/stack_trace.git
+      ref: null_safety
+  string_scanner:
+    git:
+      url: git://github.com/dart-lang/string_scanner.git
+      ref: null_safety
+  term_glyph:
+    git:
+      url: git://github.com/dart-lang/term_glyph.git
+      ref: null_safety
+  test:
+    git:
+      url: git://github.com/dart-lang/test.git
+      path: pkgs/test
+      ref: null_safety
+  test_api:
+    git:
+      url: git://github.com/dart-lang/test.git
+      ref: null_safety
+      path: pkgs/test_api
+  test_core:
+    git:
+      url: git://github.com/dart-lang/test.git
+      path: pkgs/test_core
+      ref: null_safety
diff --git a/pkgs/stream_channel/test/disconnector_test.dart b/pkgs/stream_channel/test/disconnector_test.dart
index ec0c64b..4f16012 100644
--- a/pkgs/stream_channel/test/disconnector_test.dart
+++ b/pkgs/stream_channel/test/disconnector_test.dart
@@ -10,10 +10,10 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamController streamController;
-  StreamController sinkController;
-  Disconnector disconnector;
-  StreamChannel channel;
+  late StreamController streamController;
+  late StreamController sinkController;
+  late Disconnector disconnector;
+  late StreamChannel channel;
   setUp(() {
     streamController = StreamController();
     sinkController = StreamController();
diff --git a/pkgs/stream_channel/test/isolate_channel_test.dart b/pkgs/stream_channel/test/isolate_channel_test.dart
index ec26fb6..a1ec37e 100644
--- a/pkgs/stream_channel/test/isolate_channel_test.dart
+++ b/pkgs/stream_channel/test/isolate_channel_test.dart
@@ -13,9 +13,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  ReceivePort receivePort;
-  SendPort sendPort;
-  StreamChannel channel;
+  late ReceivePort receivePort;
+  late SendPort sendPort;
+  late StreamChannel channel;
   setUp(() {
     receivePort = ReceivePort();
     var receivePortForSend = ReceivePort();
@@ -128,7 +128,7 @@
   });
 
   group('connect constructors', () {
-    ReceivePort connectPort;
+    late ReceivePort connectPort;
     setUp(() {
       connectPort = ReceivePort();
     });
diff --git a/pkgs/stream_channel/test/json_document_transformer_test.dart b/pkgs/stream_channel/test/json_document_transformer_test.dart
index 3ccce4e..48d8f72 100644
--- a/pkgs/stream_channel/test/json_document_transformer_test.dart
+++ b/pkgs/stream_channel/test/json_document_transformer_test.dart
@@ -9,9 +9,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamController<String> streamController;
-  StreamController<String> sinkController;
-  StreamChannel<String> channel;
+  late StreamController<String> streamController;
+  late StreamController<String> sinkController;
+  late StreamChannel<String> channel;
   setUp(() {
     streamController = StreamController<String>();
     sinkController = StreamController<String>();
diff --git a/pkgs/stream_channel/test/multi_channel_test.dart b/pkgs/stream_channel/test/multi_channel_test.dart
index 0fa1df9..00bcabe 100644
--- a/pkgs/stream_channel/test/multi_channel_test.dart
+++ b/pkgs/stream_channel/test/multi_channel_test.dart
@@ -7,9 +7,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamChannelController controller;
-  MultiChannel channel1;
-  MultiChannel channel2;
+  late StreamChannelController controller;
+  late MultiChannel channel1;
+  late MultiChannel channel2;
   setUp(() {
     controller = StreamChannelController();
     channel1 = MultiChannel<int>(controller.local);
@@ -85,8 +85,8 @@
   });
 
   group('a locally-created virtual channel', () {
-    VirtualChannel virtual1;
-    VirtualChannel virtual2;
+    late VirtualChannel virtual1;
+    late VirtualChannel virtual2;
     setUp(() {
       virtual1 = channel1.virtualChannel();
       virtual2 = channel2.virtualChannel(virtual1.id);
@@ -185,8 +185,8 @@
   });
 
   group('a remotely-created virtual channel', () {
-    VirtualChannel virtual1;
-    VirtualChannel virtual2;
+    late VirtualChannel virtual1;
+    late VirtualChannel virtual2;
     setUp(() {
       virtual1 = channel1.virtualChannel();
       virtual2 = channel2.virtualChannel(virtual1.id);
@@ -297,8 +297,8 @@
   });
 
   group('when the underlying stream', () {
-    VirtualChannel virtual1;
-    VirtualChannel virtual2;
+    late VirtualChannel virtual1;
+    late VirtualChannel virtual2;
     setUp(() {
       virtual1 = channel1.virtualChannel();
       virtual2 = channel2.virtualChannel(virtual1.id);
@@ -406,8 +406,8 @@
     });
 
     group('for a virtual channel:', () {
-      VirtualChannel virtual1;
-      VirtualChannel virtual2;
+      late VirtualChannel virtual1;
+      late VirtualChannel virtual2;
       setUp(() {
         virtual1 = channel1.virtualChannel();
         virtual2 = channel2.virtualChannel(virtual1.id);
diff --git a/pkgs/stream_channel/test/stream_channel_completer_test.dart b/pkgs/stream_channel/test/stream_channel_completer_test.dart
index 234f956..a874925 100644
--- a/pkgs/stream_channel/test/stream_channel_completer_test.dart
+++ b/pkgs/stream_channel/test/stream_channel_completer_test.dart
@@ -9,10 +9,10 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamChannelCompleter completer;
-  StreamController streamController;
-  StreamController sinkController;
-  StreamChannel innerChannel;
+  late StreamChannelCompleter completer;
+  late StreamController streamController;
+  late StreamController sinkController;
+  late StreamChannel innerChannel;
   setUp(() {
     completer = StreamChannelCompleter();
     streamController = StreamController();
diff --git a/pkgs/stream_channel/test/stream_channel_controller_test.dart b/pkgs/stream_channel/test/stream_channel_controller_test.dart
index 9b7a851..3d661e3 100644
--- a/pkgs/stream_channel/test/stream_channel_controller_test.dart
+++ b/pkgs/stream_channel/test/stream_channel_controller_test.dart
@@ -7,7 +7,7 @@
 
 void main() {
   group('asynchronously', () {
-    StreamChannelController controller;
+    late StreamChannelController controller;
     setUp(() {
       controller = StreamChannelController();
     });
@@ -44,7 +44,7 @@
   });
 
   group('synchronously', () {
-    StreamChannelController controller;
+    late StreamChannelController controller;
     setUp(() {
       controller = StreamChannelController(sync: true);
     });
diff --git a/pkgs/stream_channel/test/stream_channel_test.dart b/pkgs/stream_channel/test/stream_channel_test.dart
index 9bd5a86..e101d20 100644
--- a/pkgs/stream_channel/test/stream_channel_test.dart
+++ b/pkgs/stream_channel/test/stream_channel_test.dart
@@ -11,9 +11,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamController streamController;
-  StreamController sinkController;
-  StreamChannel channel;
+  late StreamController streamController;
+  late StreamController sinkController;
+  late StreamChannel channel;
   setUp(() {
     streamController = StreamController();
     sinkController = StreamController();
diff --git a/pkgs/stream_channel/test/with_close_guarantee_test.dart b/pkgs/stream_channel/test/with_close_guarantee_test.dart
index 24aef03..decc2b4 100644
--- a/pkgs/stream_channel/test/with_close_guarantee_test.dart
+++ b/pkgs/stream_channel/test/with_close_guarantee_test.dart
@@ -17,8 +17,8 @@
     StreamSinkTransformer.fromStreamTransformer(_delayTransformer);
 
 void main() {
-  StreamChannelController controller;
-  StreamChannel channel;
+  late StreamChannelController controller;
+  late StreamChannel channel;
   setUp(() {
     controller = StreamChannelController();
 
diff --git a/pkgs/stream_channel/test/with_guarantees_test.dart b/pkgs/stream_channel/test/with_guarantees_test.dart
index fa49689..a19dc58 100644
--- a/pkgs/stream_channel/test/with_guarantees_test.dart
+++ b/pkgs/stream_channel/test/with_guarantees_test.dart
@@ -9,9 +9,9 @@
 import 'package:test/test.dart';
 
 void main() {
-  StreamController streamController;
-  StreamController sinkController;
-  StreamChannel channel;
+  late StreamController streamController;
+  late StreamController sinkController;
+  late StreamChannel channel;
   setUp(() {
     streamController = StreamController();
     sinkController = StreamController();
@@ -152,7 +152,7 @@
       channel.sink.addError('oh no');
       expect(channel.sink.done, throwsA('oh no'));
       sinkController.stream
-          .listen(null, onError: expectAsync1((_) {}, count: 0));
+          .listen(null, onError: expectAsync1((dynamic _) {}, count: 0));
     });
 
     test('adding an error causes the stream to emit a done event', () {