diff --git a/.test_config b/.test_config
deleted file mode 100644
index 412fc5c..0000000
--- a/.test_config
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "test_package": true
-}
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index f3c200d..441b12e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,25 +1,26 @@
 language: dart
 
 dart:
-  - dev
-  - 2.0.0
+ - dev
 
-dart_task:
-  - test: -p vm
-  - test: -p chrome
-  - dartanalyzer
-
-matrix:
+jobs:
   include:
-    # Only validate formatting using the dev release
-    - dart: dev
-      dart_task: dartfmt
-    - dart: dev
-      dart_task:
-        dartanalyzer: --fatal-infos --fatal-warnings .
-    - dart: 2.0.0
-      dart_task:
-        dartanalyzer: --fatal-warnings .
+    - stage: analyze_and_format
+      name: "Analyzer"
+      os: linux
+      script: dartanalyzer --enable-experiment=non-nullable --fatal-warnings --fatal-infos .
+    - stage: analyze_and_format
+      name: "Format"
+      os: linux
+      script: dartfmt -n --set-exit-if-changed .
+    - stage: test
+      name: "Vm Tests"
+      os: linux
+      script: pub run --enable-experiment=non-nullable test -p vm
+
+stages:
+  - analyze_and_format
+  - test
 
 # Only building master means that we don't run two builds for each pull request.
 branches:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f3cbc36..b9918d5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,37 @@
+## 1.10.0-nullsafety.7-dev
+
+## 1.10.0-nullsafety.6
+
+* Fix bug parsing asynchronous suspension gap markers at the end of stack
+  traces, when parsing with `Trace.parse` and `Chain.parse`.
+* Update SDK constraints to `>=2.12.0-0 <3.0.0` based on beta release
+  guidelines.
+
+## 1.10.0-nullsafety.5
+
+* Allow prerelease versions of the 2.12 sdk.
+
+## 1.10.0-nullsafety.4
+
+* Allow the `2.10.0` stable and dev SDKs.
+
+## 1.10.0-nullsafety.3
+
+* Fix bug parsing asynchronous suspension gap markers at the end of stack
+  traces.
+
+## 1.10.0-nullsafety.2
+
+* Forward fix for a change in SDK type promotion behavior.
+
+## 1.10.0-nullsafety.1
+
+* Allow 2.10 stable and 2.11.0 dev SDK versions.
+
+## 1.10.0-nullsafety
+
+* Opt in to null safety.
+
 ## 1.9.6 (backpublish)
 
 * Fix bug parsing asynchronous suspension gap markers at the end of stack
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 70216af..2163f52 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,9 +1,9 @@
 include: package:pedantic/analysis_options.yaml
 analyzer:
+  enable-experiment:
+    - non-nullable
   strong-mode:
     implicit-casts: false
-  errors:
-    prefer_spread_collections: ignore
 
 linter:
   rules:
diff --git a/lib/src/chain.dart b/lib/src/chain.dart
index ecab35a..b685be9 100644
--- a/lib/src/chain.dart
+++ b/lib/src/chain.dart
@@ -47,8 +47,8 @@
   final List<Trace> traces;
 
   /// The [StackZoneSpecification] for the current zone.
-  static StackZoneSpecification get _currentSpec =>
-      Zone.current[_specKey] as StackZoneSpecification;
+  static StackZoneSpecification? get _currentSpec =>
+      Zone.current[_specKey] as StackZoneSpecification?;
 
   /// If [when] is `true`, runs [callback] in a [Zone] in which the current
   /// stack chain is tracked and automatically associated with (most) errors.
@@ -66,14 +66,14 @@
   /// parent Zone's `unhandledErrorHandler` will be called with the error and
   /// its chain.
   ///
-  /// If [errorZone] is `true`, the zone this creates will be an error zone,
-  /// even if [onError] isn't passed. This means that any errors that would
-  /// cross the zone boundary are considered unhandled. If [errorZone] is
-  /// `false`, [onError] must be `null`.
+  /// The zone this creates will be an error zone if either [onError] is
+  /// not `null` and [when] is false,
+  /// or if both [when] and [errorZone] are `true`.
+  ///  If [errorZone] is `false`, [onError] must be `null`.
   ///
   /// If [callback] returns a value, it will be returned by [capture] as well.
   static T capture<T>(T Function() callback,
-      {void Function(Object error, Chain) onError,
+      {void Function(Object error, Chain)? onError,
       bool when = true,
       bool errorZone = true}) {
     if (!errorZone && onError != null) {
@@ -82,28 +82,25 @@
     }
 
     if (!when) {
-      void Function(Object, StackTrace) newOnError;
-      if (onError != null) {
-        newOnError = (error, stackTrace) {
-          onError(
-              error,
-              stackTrace == null
-                  ? Chain.current()
-                  : Chain.forTrace(stackTrace));
-        };
-      }
-
-      return runZoned(callback, onError: newOnError);
+      if (onError == null) return runZoned(callback);
+      return runZonedGuarded(callback, (error, stackTrace) {
+        onError(error, Chain.forTrace(stackTrace));
+      }) as T;
     }
 
     var spec = StackZoneSpecification(onError, errorZone: errorZone);
     return runZoned(() {
       try {
         return callback();
-      } catch (error, stackTrace) {
+      } on Object catch (error, stackTrace) {
         // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
         Zone.current.handleUncaughtError(error, stackTrace);
-        return null;
+
+        // If the expected return type of capture() is not nullable, this will
+        // throw a cast exception. But the only other alternative is to throw
+        // some other exception. Casting null to T at least lets existing uses
+        // where T is a nullable type continue to work.
+        return null as T;
       }
     },
         zoneSpecification: spec.toSpec(),
@@ -138,7 +135,7 @@
   /// If this is called outside of a [capture] zone, it just returns a
   /// single-trace chain.
   factory Chain.current([int level = 0]) {
-    if (_currentSpec != null) return _currentSpec.currentChain(level + 1);
+    if (_currentSpec != null) return _currentSpec!.currentChain(level + 1);
 
     var chain = Chain.forTrace(StackTrace.current);
     return LazyChain(() {
@@ -146,7 +143,7 @@
       // doesn't, so we skip an extra frame in a JS context.
       var first = Trace(chain.traces.first.frames.skip(level + (inJS ? 2 : 1)),
           original: chain.traces.first.original.toString());
-      return Chain([first]..addAll(chain.traces.skip(1)));
+      return Chain([first, ...chain.traces.skip(1)]);
     });
   }
 
@@ -160,7 +157,7 @@
   /// If [trace] is already a [Chain], it will be returned as-is.
   factory Chain.forTrace(StackTrace trace) {
     if (trace is Chain) return trace;
-    if (_currentSpec != null) return _currentSpec.chainFor(trace);
+    if (_currentSpec != null) return _currentSpec!.chainFor(trace);
     if (trace is Trace) return Chain([trace]);
     return LazyChain(() => Chain.parse(trace.toString()));
   }
diff --git a/lib/src/frame.dart b/lib/src/frame.dart
index 7ffc05f..c5b20e1 100644
--- a/lib/src/frame.dart
+++ b/lib/src/frame.dart
@@ -79,18 +79,18 @@
   ///
   /// This can be null, indicating that the line number is unknown or
   /// unimportant.
-  final int line;
+  final int? line;
 
   /// The column number of the code location.
   ///
   /// This can be null, indicating that the column number is unknown or
   /// unimportant.
-  final int column;
+  final int? column;
 
   /// The name of the member in which the code location occurs.
   ///
   /// Anonymous closures are represented as `<fn>` in this member string.
-  final String member;
+  final String? member;
 
   /// Whether this stack frame comes from the Dart core libraries.
   bool get isCore => uri.scheme == 'dart';
@@ -107,7 +107,7 @@
 
   /// Returns the name of the package this stack frame comes from, or `null` if
   /// this stack frame doesn't come from a `package:` URL.
-  String get package {
+  String? get package {
     if (uri.scheme != 'package') return null;
     return uri.path.split('/').first;
   }
@@ -146,14 +146,14 @@
 
         // Get the pieces out of the regexp match. Function, URI and line should
         // always be found. The column is optional.
-        var member = match[1]
+        var member = match[1]!
             .replaceAll(_asyncBody, '<async>')
             .replaceAll('<anonymous closure>', '<fn>');
-        var uri = match[2].startsWith('<data:')
+        var uri = match[2]!.startsWith('<data:')
             ? Uri.dataFromString('')
-            : Uri.parse(match[2]);
+            : Uri.parse(match[2]!);
 
-        var lineAndColumn = match[3].split(':');
+        var lineAndColumn = match[3]!.split(':');
         var line =
             lineAndColumn.length > 1 ? int.parse(lineAndColumn[1]) : null;
         var column =
@@ -171,7 +171,7 @@
         Frame parseLocation(String location, String member) {
           var evalMatch = _v8EvalLocation.firstMatch(location);
           while (evalMatch != null) {
-            location = evalMatch[1];
+            location = evalMatch[1]!;
             evalMatch = _v8EvalLocation.firstMatch(location);
           }
 
@@ -182,9 +182,10 @@
           var urlMatch = _v8UrlLocation.firstMatch(location);
           if (urlMatch == null) return UnparsedFrame(frame);
 
-          final uri = _uriOrPathToUri(urlMatch[1]);
-          final line = int.parse(urlMatch[2]);
-          final column = urlMatch[3] != null ? int.parse(urlMatch[3]) : null;
+          final uri = _uriOrPathToUri(urlMatch[1]!);
+          final line = int.parse(urlMatch[2]!);
+          final columnMatch = urlMatch[3];
+          final column = columnMatch != null ? int.parse(columnMatch) : null;
           return Frame(uri, line, column, member);
         }
 
@@ -194,15 +195,15 @@
           // lists anonymous functions within eval as "<anonymous>", while IE10
           // lists them as "Anonymous function".
           return parseLocation(
-              match[2],
-              match[1]
+              match[2]!,
+              match[1]!
                   .replaceAll('<anonymous>', '<fn>')
                   .replaceAll('Anonymous function', '<fn>')
                   .replaceAll('(anonymous function)', '<fn>'));
         } else {
           // The second form looks like " at LOCATION", and is used for
           // anonymous functions.
-          return parseLocation(match[3], '<fn>');
+          return parseLocation(match[3]!, '<fn>');
         }
       });
 
@@ -224,9 +225,9 @@
       _catchFormatException(frame, () {
         final match = _firefoxEvalLocation.firstMatch(frame);
         if (match == null) return UnparsedFrame(frame);
-        var member = match[1].replaceAll('/<', '');
-        final uri = _uriOrPathToUri(match[2]);
-        final line = int.parse(match[3]);
+        var member = match[1]!.replaceAll('/<', '');
+        final uri = _uriOrPathToUri(match[2]!);
+        final line = int.parse(match[3]!);
         if (member.isEmpty || member == 'anonymous') {
           member = '<fn>';
         }
@@ -238,18 +239,17 @@
         var match = _firefoxSafariFrame.firstMatch(frame);
         if (match == null) return UnparsedFrame(frame);
 
-        if (match[3].contains(' line ')) {
+        if (match[3]!.contains(' line ')) {
           return Frame._parseFirefoxEval(frame);
         }
 
         // Normally this is a URI, but in a jsshell trace it can be a path.
-        var uri = _uriOrPathToUri(match[3]);
+        var uri = _uriOrPathToUri(match[3]!);
 
-        String member;
-        if (match[1] != null) {
-          member = match[1];
+        var member = match[1];
+        if (member != null) {
           member +=
-              List.filled('/'.allMatches(match[2]).length, '.<fn>').join();
+              List.filled('/'.allMatches(match[2]!).length, '.<fn>').join();
           if (member == '') member = '<fn>';
 
           // Some Firefox members have initial dots. We remove them for
@@ -259,9 +259,9 @@
           member = '<fn>';
         }
 
-        var line = match[4] == '' ? null : int.parse(match[4]);
+        var line = match[4] == '' ? null : int.parse(match[4]!);
         var column =
-            match[5] == null || match[5] == '' ? null : int.parse(match[5]);
+            match[5] == null || match[5] == '' ? null : int.parse(match[5]!);
         return Frame(uri, line, column, member);
       });
 
@@ -288,15 +288,15 @@
         // them.
         var uri = match[1] == 'data:...'
             ? Uri.dataFromString('')
-            : Uri.parse(match[1]);
-        // If there's no scheme, this is a relative URI. We should interpret it
-        // as relative to the current working directory.
+            : Uri.parse(match[1]!);
+        // If there's no scheme, this is a relative URI. We should interpret it as
+        // relative to the current working directory.
         if (uri.scheme == '') {
           uri = path.toUri(path.absolute(path.fromUri(uri)));
         }
 
-        var line = match[2] == null ? null : int.parse(match[2]);
-        var column = match[3] == null ? null : int.parse(match[3]);
+        var line = match[2] == null ? null : int.parse(match[2]!);
+        var column = match[3] == null ? null : int.parse(match[3]!);
         return Frame(uri, line, column, match[4]);
       });
 
diff --git a/lib/src/lazy_chain.dart b/lib/src/lazy_chain.dart
index 12dbace..e2f64a7 100644
--- a/lib/src/lazy_chain.dart
+++ b/lib/src/lazy_chain.dart
@@ -15,12 +15,10 @@
 /// necessary.
 class LazyChain implements Chain {
   final ChainThunk _thunk;
-  Chain _inner;
+  late final Chain _chain = _thunk();
 
   LazyChain(this._thunk);
 
-  Chain get _chain => _inner ??= _thunk();
-
   @override
   List<Trace> get traces => _chain.traces;
   @override
diff --git a/lib/src/lazy_trace.dart b/lib/src/lazy_trace.dart
index 0fa2af1..3ecaa2d 100644
--- a/lib/src/lazy_trace.dart
+++ b/lib/src/lazy_trace.dart
@@ -13,12 +13,10 @@
 /// necessary.
 class LazyTrace implements Trace {
   final TraceThunk _thunk;
-  Trace _inner;
+  late final Trace _trace = _thunk();
 
   LazyTrace(this._thunk);
 
-  Trace get _trace => _inner ??= _thunk();
-
   @override
   List<Frame> get frames => _trace.frames;
   @override
diff --git a/lib/src/stack_zone_specification.dart b/lib/src/stack_zone_specification.dart
index f721e94..e13e5d4 100644
--- a/lib/src/stack_zone_specification.dart
+++ b/lib/src/stack_zone_specification.dart
@@ -53,10 +53,10 @@
   ///
   /// If this is null, that indicates that any unhandled errors should be passed
   /// to the parent zone.
-  final void Function(Object error, Chain) _onError;
+  final void Function(Object error, Chain)? _onError;
 
   /// The most recent node of the current stack chain.
-  _Node _currentNode;
+  _Node? _currentNode;
 
   /// Whether this is an error zone.
   final bool _errorZone;
@@ -86,7 +86,7 @@
   /// The first stack trace in the returned chain will always be [trace]
   /// (converted to a [Trace] if necessary). If there is no chain associated
   /// with [trace], this just returns a single-trace chain containing [trace].
-  Chain chainFor(StackTrace trace) {
+  Chain chainFor(StackTrace? trace) {
     if (trace is Chain) return trace;
     trace ??= StackTrace.current;
 
@@ -96,7 +96,7 @@
       // [Chain.capture] and we should fall back to the VM's stack chaining. We
       // can't use [Chain.from] here because it'll just call [chainFor] again.
       if (trace is Trace) return Chain([trace]);
-      return LazyChain(() => Chain.parse(trace.toString()));
+      return LazyChain(() => Chain.parse(trace!.toString()));
     } else {
       if (trace is! Trace) {
         var original = trace;
@@ -111,7 +111,7 @@
   /// [f] is run.
   ZoneCallback<R> _registerCallback<R>(
       Zone self, ZoneDelegate parent, Zone zone, R Function() f) {
-    if (f == null || _disabled) return parent.registerCallback(zone, f);
+    if (_disabled) return parent.registerCallback(zone, f);
     var node = _createNode(1);
     return parent.registerCallback(zone, () => _run(f, node));
   }
@@ -120,7 +120,7 @@
   /// [f] is run.
   ZoneUnaryCallback<R, T> _registerUnaryCallback<R, T>(
       Zone self, ZoneDelegate parent, Zone zone, R Function(T) f) {
-    if (f == null || _disabled) return parent.registerUnaryCallback(zone, f);
+    if (_disabled) return parent.registerUnaryCallback(zone, f);
     var node = _createNode(1);
     return parent.registerUnaryCallback(zone, (arg) {
       return _run(() => f(arg), node);
@@ -131,7 +131,7 @@
   /// [f] is run.
   ZoneBinaryCallback<R, T1, T2> _registerBinaryCallback<R, T1, T2>(
       Zone self, ZoneDelegate parent, Zone zone, R Function(T1, T2) f) {
-    if (f == null || _disabled) return parent.registerBinaryCallback(zone, f);
+    if (_disabled) return parent.registerBinaryCallback(zone, f);
 
     var node = _createNode(1);
     return parent.registerBinaryCallback(zone, (arg1, arg2) {
@@ -141,8 +141,8 @@
 
   /// Looks up the chain associated with [stackTrace] and passes it either to
   /// [_onError] or [parent]'s error handler.
-  void _handleUncaughtError(
-      Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
+  void _handleUncaughtError(Zone self, ZoneDelegate parent, Zone zone,
+      Object error, StackTrace stackTrace) {
     if (_disabled) {
       parent.handleUncaughtError(zone, error, stackTrace);
       return;
@@ -157,8 +157,10 @@
     // TODO(nweiz): Currently this copies a lot of logic from [runZoned]. Just
     // allow [runBinary] to throw instead once issue 18134 is fixed.
     try {
-      self.parent.runBinary(_onError, error, stackChain);
-    } catch (newError, newStackTrace) {
+      // TODO(rnystrom): Is the null-assertion correct here? It is nullable in
+      // Zone. Should we check for that here?
+      self.parent!.runBinary(_onError!, error, stackChain);
+    } on Object catch (newError, newStackTrace) {
       if (identical(newError, error)) {
         parent.handleUncaughtError(zone, error, stackChain);
       } else {
@@ -169,8 +171,8 @@
 
   /// Attaches the current stack chain to [stackTrace], replacing it if
   /// necessary.
-  AsyncError _errorCallback(Zone self, ZoneDelegate parent, Zone zone,
-      Object error, StackTrace stackTrace) {
+  AsyncError? _errorCallback(Zone self, ZoneDelegate parent, Zone zone,
+      Object error, StackTrace? stackTrace) {
     if (_disabled) return parent.errorCallback(zone, error, stackTrace);
 
     // Go up two levels to get through [_CustomZone.errorCallback].
@@ -217,15 +219,15 @@
 
   /// Like [new Trace.current], but if the current stack trace has VM chaining
   /// enabled, this only returns the innermost sub-trace.
-  Trace _currentTrace([int level]) {
-    level ??= 0;
+  Trace _currentTrace([int? level]) {
     var stackTrace = StackTrace.current;
     return LazyTrace(() {
       var text = _trimVMChain(stackTrace);
       var trace = Trace.parse(text);
       // JS includes a frame for the call to StackTrace.current, but the VM
       // doesn't, so we skip an extra frame in a JS context.
-      return Trace(trace.frames.skip(level + (inJS ? 2 : 1)), original: text);
+      return Trace(trace.frames.skip((level ?? 0) + (inJS ? 2 : 1)),
+          original: text);
     });
   }
 
@@ -244,14 +246,14 @@
   final Trace trace;
 
   /// The previous node in the chain.
-  final _Node previous;
+  final _Node? previous;
 
   _Node(StackTrace trace, [this.previous]) : trace = Trace.from(trace);
 
   /// Converts this to a [Chain].
   Chain toChain() {
     var nodes = <Trace>[];
-    var node = this;
+    _Node? node = this;
     while (node != null) {
       nodes.add(node.trace);
       node = node.previous;
diff --git a/lib/src/trace.dart b/lib/src/trace.dart
index d66c0db..42371c7 100644
--- a/lib/src/trace.dart
+++ b/lib/src/trace.dart
@@ -107,13 +107,6 @@
   /// If [trace] is a native [StackTrace], its data will be parsed out; if it's
   /// a [Trace], it will be returned as-is.
   factory Trace.from(StackTrace trace) {
-    // Normally explicitly validating null arguments is bad Dart style, but here
-    // the natural failure will only occur when the LazyTrace is materialized,
-    // and we want to provide an error that's more local to the actual problem.
-    if (trace == null) {
-      throw ArgumentError('Cannot create a Trace from null.');
-    }
-
     if (trace is Trace) return trace;
     if (trace is Chain) return trace.toTrace();
     return LazyTrace(() => Trace.parse(trace.toString()));
@@ -249,9 +242,9 @@
             original: trace);
 
   /// Returns a new [Trace] comprised of [frames].
-  Trace(Iterable<Frame> frames, {String original})
+  Trace(Iterable<Frame> frames, {String? original})
       : frames = List<Frame>.unmodifiable(frames),
-        original = StackTrace.fromString(original);
+        original = StackTrace.fromString(original ?? '');
 
   /// Returns a VM-style [StackTrace] object.
   ///
@@ -305,7 +298,7 @@
         // just get rid of them.
         // TODO(nweiz): Get rid of this logic some time after issue 22009 is
         // fixed.
-        if (!frame.member.contains('<async>')) return false;
+        if (!frame.member!.contains('<async>')) return false;
         return frame.line == null;
       };
     }
diff --git a/lib/src/unparsed_frame.dart b/lib/src/unparsed_frame.dart
index 31d0179..27e97f6 100644
--- a/lib/src/unparsed_frame.dart
+++ b/lib/src/unparsed_frame.dart
@@ -11,15 +11,15 @@
   @override
   final Uri uri = Uri(path: 'unparsed');
   @override
-  final int line = null;
+  final int? line = null;
   @override
-  final int column = null;
+  final int? column = null;
   @override
   final bool isCore = false;
   @override
   final String library = 'unparsed';
   @override
-  final String package = null;
+  final String? package = null;
   @override
   final String location = 'unparsed';
 
diff --git a/lib/src/vm_trace.dart b/lib/src/vm_trace.dart
index 3ba73b9..005b7af 100644
--- a/lib/src/vm_trace.dart
+++ b/lib/src/vm_trace.dart
@@ -20,7 +20,7 @@
     var i = 1;
     return frames.map((frame) {
       var number = '#${i++}'.padRight(8);
-      var member = frame.member
+      var member = frame.member!
           .replaceAllMapped(RegExp(r'[^.]+\.<async>'),
               (match) => '${match[1]}.<${match[1]}_async_body>')
           .replaceAll('<fn>', '<anonymous closure>');
diff --git a/pubspec.yaml b/pubspec.yaml
index e72ee38..be5bced 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,14 +1,14 @@
 name: stack_trace
-version: 1.9.6
+version: 1.10.0-nullsafety.7-dev
 description: A package for manipulating stack traces and printing them readably.
 homepage: https://github.com/dart-lang/stack_trace
 
 environment:
-  sdk: '>=2.0.0 <3.0.0'
+  sdk: ">=2.12.0-0 <3.0.0"
 
 dependencies:
-  path: ^1.2.0
+  path: ^1.8.0-nullsafety
 
 dev_dependencies:
-  pedantic: ^1.0.0
-  test: '>=0.12.17 <2.0.0'
+  pedantic: ^1.10.0-nullsafety
+  test: ^1.16.0-nullsafety
diff --git a/test/chain/chain_test.dart b/test/chain/chain_test.dart
index d71b274..bb28b79 100644
--- a/test/chain/chain_test.dart
+++ b/test/chain/chain_test.dart
@@ -59,17 +59,17 @@
         return Future.error('oh no');
       }, onError: expectAsync2((error, chain) {
         expect(error, equals('oh no'));
-        expect(chain, TypeMatcher<Chain>());
+        expect(chain, isA<Chain>());
       }));
     });
 
     test('with no onError blocks errors', () {
-      runZoned(() {
+      runZonedGuarded(() {
         var future = Chain.capture(() => Future.error('oh no'), when: false);
         future.then(expectAsync1((_) {}, count: 0));
-      }, onError: expectAsync2((error, chain) {
+      }, expectAsync2((error, chain) {
         expect(error, equals('oh no'));
-        expect(chain, TypeMatcher<Chain>());
+        expect(chain, isA<Chain>());
       }));
     });
 
@@ -94,7 +94,7 @@
           return Future.error('oh no');
         }, onError: expectAsync2((error, chain) {
           expect(error, equals('oh no'));
-          expect(chain, TypeMatcher<Chain>());
+          expect(chain, isA<Chain>());
         }), when: false);
       });
 
diff --git a/test/chain/dart2js_test.dart b/test/chain/dart2js_test.dart
index 827c459..f708637 100644
--- a/test/chain/dart2js_test.dart
+++ b/test/chain/dart2js_test.dart
@@ -90,7 +90,7 @@
             expect(chain.traces, hasLength(2));
             completer.complete();
           }
-        } catch (error, stackTrace) {
+        } on Object catch (error, stackTrace) {
           completer.completeError(error, stackTrace);
         }
       });
@@ -140,7 +140,7 @@
     test('and relays them to the parent zone', () {
       var completer = Completer();
 
-      runZoned(() {
+      runZonedGuarded(() {
         Chain.capture(() {
           inMicrotask(() => throw 'error');
         }, onError: (error, chain) {
@@ -148,13 +148,13 @@
           expect(chain.traces, hasLength(2));
           throw error;
         });
-      }, onError: (error, chain) {
+      }, (error, chain) {
         try {
           expect(error, equals('error'));
-          expect(chain, TypeMatcher<Chain>());
-          expect(chain.traces, hasLength(2));
+          expect(chain,
+              isA<Chain>().having((c) => c.traces, 'traces', hasLength(2)));
           completer.complete();
-        } catch (error, stackTrace) {
+        } on Object catch (error, stackTrace) {
           completer.completeError(error, stackTrace);
         }
       });
@@ -166,15 +166,15 @@
   test('capture() without onError passes exceptions to parent zone', () {
     var completer = Completer();
 
-    runZoned(() {
+    runZonedGuarded(() {
       Chain.capture(() => inMicrotask(() => throw 'error'));
-    }, onError: (error, chain) {
+    }, (error, chain) {
       try {
         expect(error, equals('error'));
-        expect(chain, TypeMatcher<Chain>());
-        expect(chain.traces, hasLength(2));
+        expect(chain,
+            isA<Chain>().having((c) => c.traces, 'traces', hasLength(2)));
         completer.complete();
-      } catch (error, stackTrace) {
+      } on Object catch (error, stackTrace) {
         completer.completeError(error, stackTrace);
       }
     });
@@ -305,7 +305,7 @@
     test(
         'called for an unregistered stack trace returns a chain wrapping that '
         'trace', () {
-      StackTrace trace;
+      late StackTrace trace;
       var chain = Chain.capture(() {
         try {
           throw 'error';
@@ -324,7 +324,7 @@
   test(
       'forTrace() outside of capture() returns a chain wrapping the given '
       'trace', () {
-    StackTrace trace;
+    late StackTrace trace;
     var chain = Chain.capture(() {
       try {
         throw 'error';
diff --git a/test/chain/utils.dart b/test/chain/utils.dart
index 0711108..af8e361 100644
--- a/test/chain/utils.dart
+++ b/test/chain/utils.dart
@@ -46,7 +46,7 @@
 /// Returns a Future that completes to an error using a completer.
 ///
 /// If [trace] is passed, it's used as the stack trace for the error.
-Future completerErrorFuture([StackTrace trace]) {
+Future completerErrorFuture([StackTrace? trace]) {
   var completer = Completer();
   completer.completeError('error', trace);
   return completer.future;
@@ -55,7 +55,7 @@
 /// Returns a Stream that emits an error using a controller.
 ///
 /// If [trace] is passed, it's used as the stack trace for the error.
-Stream controllerErrorStream([StackTrace trace]) {
+Stream controllerErrorStream([StackTrace? trace]) {
   var controller = StreamController();
   controller.addError('error', trace);
   return controller.stream;
diff --git a/test/chain/vm_test.dart b/test/chain/vm_test.dart
index 842f0a0..8a66b83 100644
--- a/test/chain/vm_test.dart
+++ b/test/chain/vm_test.dart
@@ -19,7 +19,7 @@
 void main() {
   group('capture() with onError catches exceptions', () {
     test('thrown synchronously', () async {
-      StackTrace vmTrace;
+      late StackTrace vmTrace;
       var chain = await captureFuture(() {
         try {
           throw 'error';
@@ -156,7 +156,7 @@
                 contains(frameMember(startsWith('inPeriodicTimer'))));
             completer.complete();
           }
-        } catch (error, stackTrace) {
+        } on Object catch (error, stackTrace) {
           completer.completeError(error, stackTrace);
         }
       });
@@ -234,7 +234,7 @@
     test('and relays them to the parent zone', () {
       var completer = Completer();
 
-      runZoned(() {
+      runZonedGuarded(() {
         Chain.capture(() {
           inMicrotask(() => throw 'error');
         }, onError: (error, chain) {
@@ -243,14 +243,15 @@
               contains(frameMember(startsWith('inMicrotask'))));
           throw error;
         });
-      }, onError: (error, chain) {
+      }, (error, chain) {
         try {
           expect(error, equals('error'));
-          expect(chain, TypeMatcher<Chain>());
-          expect(chain.traces[1].frames,
-              contains(frameMember(startsWith('inMicrotask'))));
+          expect(
+              chain,
+              isA<Chain>().having((c) => c.traces[1].frames, 'traces[1].frames',
+                  contains(frameMember(startsWith('inMicrotask')))));
           completer.complete();
-        } catch (error, stackTrace) {
+        } on Object catch (error, stackTrace) {
           completer.completeError(error, stackTrace);
         }
       });
@@ -262,16 +263,17 @@
   test('capture() without onError passes exceptions to parent zone', () {
     var completer = Completer();
 
-    runZoned(() {
+    runZonedGuarded(() {
       Chain.capture(() => inMicrotask(() => throw 'error'));
-    }, onError: (error, chain) {
+    }, (error, chain) {
       try {
         expect(error, equals('error'));
-        expect(chain, TypeMatcher<Chain>());
-        expect(chain.traces[1].frames,
-            contains(frameMember(startsWith('inMicrotask'))));
+        expect(
+            chain,
+            isA<Chain>().having((c) => c.traces[1].frames, 'traces[1].frames',
+                contains(frameMember(startsWith('inMicrotask')))));
         completer.complete();
-      } catch (error, stackTrace) {
+      } on Object catch (error, stackTrace) {
         completer.completeError(error, stackTrace);
       }
     });
@@ -481,7 +483,7 @@
       'chain', () {
     // Disable the test package's chain-tracking.
     return Chain.disable(() async {
-      StackTrace trace;
+      late StackTrace trace;
       await Chain.capture(() async {
         try {
           throw 'error';
diff --git a/test/frame_test.dart b/test/frame_test.dart
index 087b5b6..8788039 100644
--- a/test/frame_test.dart
+++ b/test/frame_test.dart
@@ -40,7 +40,7 @@
     });
 
     test('converts "<anonymous closure>" to "<fn>"', () {
-      String parsedMember(String member) =>
+      String? parsedMember(String member) =>
           Frame.parseVM('#0 $member (foo:0:0)').member;
 
       expect(parsedMember('Foo.<anonymous closure>'), equals('Foo.<fn>'));
@@ -210,7 +210,7 @@
     });
 
     test('converts "<anonymous>" to "<fn>"', () {
-      String parsedMember(String member) =>
+      String? parsedMember(String member) =>
           Frame.parseV8('    at $member (foo:0:0)').member;
 
       expect(parsedMember('Foo.<anonymous>'), equals('Foo.<fn>'));
@@ -646,6 +646,6 @@
 
 void expectIsUnparsed(Frame Function(String) constructor, String text) {
   var frame = constructor(text);
-  expect(frame, TypeMatcher<UnparsedFrame>());
+  expect(frame, isA<UnparsedFrame>());
   expect(frame.toString(), equals(text));
 }
diff --git a/test/trace_test.dart b/test/trace_test.dart
index 4df6e9a..ea48e03 100644
--- a/test/trace_test.dart
+++ b/test/trace_test.dart
@@ -6,7 +6,7 @@
 import 'package:stack_trace/stack_trace.dart';
 import 'package:test/test.dart';
 
-Trace getCurrentTrace([int level]) => Trace.current(level);
+Trace getCurrentTrace([int level = 0]) => Trace.current(level);
 
 Trace nestedGetCurrentTrace(int level) => getCurrentTrace(level);
 
@@ -407,7 +407,7 @@
 ''');
 
         var folded =
-            trace.foldFrames((frame) => frame.member.startsWith('foo'));
+            trace.foldFrames((frame) => frame.member!.startsWith('foo'));
         expect(folded.toString(), equals('''
 foo.dart 42:21                     notFoo
 foo.dart 1:100                     fooBottom
@@ -442,7 +442,7 @@
 ''');
 
           var folded = trace.foldFrames(
-              (frame) => frame.member.startsWith('foo'),
+              (frame) => frame.member!.startsWith('foo'),
               terse: true);
           expect(folded.toString(), equals('''
 foo.dart 42:21  notFoo
@@ -463,7 +463,7 @@
 ''');
 
           var folded = trace.foldFrames(
-              (frame) => frame.member.startsWith('foo'),
+              (frame) => frame.member!.startsWith('foo'),
               terse: true);
           expect(folded.toString(), equals('''
 foo.dart 42:21  notFoo
@@ -482,7 +482,7 @@
 ''');
 
           var folded = trace.foldFrames(
-              (frame) => frame.member.startsWith('foo'),
+              (frame) => frame.member!.startsWith('foo'),
               terse: true);
           expect(folded.toString(), equals('''
 package:foo     fooTop
diff --git a/test/vm_test.dart b/test/vm_test.dart
index 4ad3de2..c9f819a 100644
--- a/test/vm_test.dart
+++ b/test/vm_test.dart
@@ -18,14 +18,14 @@
 // The name of this (trivial) function is verified as part of the test
 StackTrace getStackTraceObject() => StackTrace.current;
 
-Frame getCaller([int level]) {
+Frame getCaller([int? level]) {
   if (level == null) return Frame.caller();
   return Frame.caller(level);
 }
 
 Frame nestedGetCaller(int level) => getCaller(level);
 
-Trace getCurrentTrace([int level]) => Trace.current(level);
+Trace getCurrentTrace([int level = 0]) => Trace.current(level);
 
 Trace nestedGetCurrentTrace(int level) => getCurrentTrace(level);
 
@@ -49,14 +49,14 @@
     test('.from handles a stack overflow trace correctly', () {
       void overflow() => overflow();
 
-      var trace;
+      late Trace? trace;
       try {
         overflow();
       } catch (_, stackTrace) {
         trace = Trace.from(stackTrace);
       }
 
-      expect(trace.frames.first.member, equals('main.<fn>.<fn>.overflow'));
+      expect(trace!.frames.first.member, equals('main.<fn>.<fn>.overflow'));
     });
 
     group('.current()', () {
