Merge NNBD branch into master (#270)

diff --git a/.cirrus.yml b/.cirrus.yml
index 673bf9b..04f3af4 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -7,6 +7,9 @@
   upgrade_script:
     - flutter channel master
     - flutter upgrade
+    # TODO(goderbauer): Remove next two lines when https://github.com/flutter/flutter/issues/74772 is resolved.
+    - rm -rf /home/cirrus/sdks/flutter/bin/cache
+    - flutter doctor
     - git fetch origin master
   activate_script: pub global activate flutter_plugin_tools
   matrix:
diff --git a/packages/animations/CHANGELOG.md b/packages/animations/CHANGELOG.md
index 5625d1a..70ec9b4 100644
--- a/packages/animations/CHANGELOG.md
+++ b/packages/animations/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 All notable changes to this project will be documented in this file.
 
+## [2.0.0-nullsafety.0] - November 16, 2020
+
+* Migrates to null safety.
+
 ## [1.1.2] - July 28, 2020
 
 * Fixes for upcoming changes to the flutter framework.
diff --git a/packages/animations/example/lib/container_transition.dart b/packages/animations/example/lib/container_transition.dart
index 7fa0e2f..0ba05a4 100644
--- a/packages/animations/example/lib/container_transition.dart
+++ b/packages/animations/example/lib/container_transition.dart
@@ -50,7 +50,7 @@
     extends State<OpenContainerTransformDemo> {
   ContainerTransitionType _transitionType = ContainerTransitionType.fade;
 
-  void _showMarkedAsDoneSnackbar(bool isMarkedAsDone) {
+  void _showMarkedAsDoneSnackbar(bool? isMarkedAsDone) {
     if (isMarkedAsDone ?? false)
       ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
         content: Text('Marked as done!'),
@@ -271,14 +271,14 @@
 
 class _OpenContainerWrapper extends StatelessWidget {
   const _OpenContainerWrapper({
-    this.closedBuilder,
-    this.transitionType,
-    this.onClosed,
+    required this.closedBuilder,
+    required this.transitionType,
+    required this.onClosed,
   });
 
-  final OpenContainerBuilder closedBuilder;
+  final CloseContainerBuilder closedBuilder;
   final ContainerTransitionType transitionType;
-  final ClosedCallback<bool> onClosed;
+  final ClosedCallback<bool?> onClosed;
 
   @override
   Widget build(BuildContext context) {
@@ -295,7 +295,7 @@
 }
 
 class _ExampleCard extends StatelessWidget {
-  const _ExampleCard({this.openContainer});
+  const _ExampleCard({required this.openContainer});
 
   final VoidCallback openContainer;
 
@@ -333,7 +333,7 @@
               'adipiscing elit, sed do eiusmod tempor.',
               style: Theme.of(context)
                   .textTheme
-                  .bodyText2
+                  .bodyText2!
                   .copyWith(color: Colors.black54),
             ),
           ),
@@ -345,8 +345,8 @@
 
 class _SmallerCard extends StatelessWidget {
   const _SmallerCard({
-    this.openContainer,
-    this.subtitle,
+    required this.openContainer,
+    required this.subtitle,
   });
 
   final VoidCallback openContainer;
@@ -397,7 +397,7 @@
 }
 
 class _ExampleSingleTile extends StatelessWidget {
-  const _ExampleSingleTile({this.openContainer});
+  const _ExampleSingleTile({required this.openContainer});
 
   final VoidCallback openContainer;
 
@@ -454,10 +454,10 @@
     this.child,
   });
 
-  final VoidCallback openContainer;
-  final double width;
-  final double height;
-  final Widget child;
+  final VoidCallback? openContainer;
+  final double? width;
+  final double? height;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -510,7 +510,7 @@
               children: <Widget>[
                 Text(
                   'Title',
-                  style: Theme.of(context).textTheme.headline5.copyWith(
+                  style: Theme.of(context).textTheme.headline5!.copyWith(
                         color: Colors.black54,
                         fontSize: 30.0,
                       ),
@@ -518,7 +518,7 @@
                 const SizedBox(height: 10),
                 Text(
                   _loremIpsumParagraph,
-                  style: Theme.of(context).textTheme.bodyText2.copyWith(
+                  style: Theme.of(context).textTheme.bodyText2!.copyWith(
                         color: Colors.black54,
                         height: 1.5,
                         fontSize: 16.0,
diff --git a/packages/animations/example/lib/fade_scale_transition.dart b/packages/animations/example/lib/fade_scale_transition.dart
index 5a5eeb3..fb59084 100644
--- a/packages/animations/example/lib/fade_scale_transition.dart
+++ b/packages/animations/example/lib/fade_scale_transition.dart
@@ -14,7 +14,7 @@
 
 class _FadeScaleTransitionDemoState extends State<FadeScaleTransitionDemo>
     with SingleTickerProviderStateMixin {
-  AnimationController _controller;
+  late AnimationController _controller;
 
   @override
   void initState() {
@@ -48,8 +48,6 @@
       case AnimationStatus.dismissed:
         return false;
     }
-    assert(false);
-    return null;
   }
 
   @override
@@ -58,7 +56,7 @@
       appBar: AppBar(title: const Text('Fade')),
       floatingActionButton: AnimatedBuilder(
         animation: _controller,
-        builder: (BuildContext context, Widget child) {
+        builder: (BuildContext context, Widget? child) {
           return FadeScaleTransition(
             animation: _controller,
             child: child,
diff --git a/packages/animations/example/lib/main.dart b/packages/animations/example/lib/main.dart
index e29ecad..39201f6 100644
--- a/packages/animations/example/lib/main.dart
+++ b/packages/animations/example/lib/main.dart
@@ -126,11 +126,11 @@
 class _TransitionListTile extends StatelessWidget {
   const _TransitionListTile({
     this.onTap,
-    this.title,
-    this.subtitle,
+    required this.title,
+    required this.subtitle,
   });
 
-  final GestureTapCallback onTap;
+  final GestureTapCallback? onTap;
   final String title;
   final String subtitle;
 
diff --git a/packages/animations/example/lib/shared_axis_transition.dart b/packages/animations/example/lib/shared_axis_transition.dart
index d7b09d8..3c750a9 100644
--- a/packages/animations/example/lib/shared_axis_transition.dart
+++ b/packages/animations/example/lib/shared_axis_transition.dart
@@ -14,11 +14,11 @@
 }
 
 class _SharedAxisTransitionDemoState extends State<SharedAxisTransitionDemo> {
-  SharedAxisTransitionType _transitionType =
+  SharedAxisTransitionType? _transitionType =
       SharedAxisTransitionType.horizontal;
   bool _isLoggedIn = false;
 
-  void _updateTransitionType(SharedAxisTransitionType newType) {
+  void _updateTransitionType(SharedAxisTransitionType? newType) {
     setState(() {
       _transitionType = newType;
     });
@@ -51,7 +51,7 @@
                     child: child,
                     animation: animation,
                     secondaryAnimation: secondaryAnimation,
-                    transitionType: _transitionType,
+                    transitionType: _transitionType!,
                   );
                 },
                 child: _isLoggedIn ? _CoursePage() : _SignInPage(),
@@ -80,7 +80,7 @@
                 Radio<SharedAxisTransitionType>(
                   value: SharedAxisTransitionType.horizontal,
                   groupValue: _transitionType,
-                  onChanged: (SharedAxisTransitionType newValue) {
+                  onChanged: (SharedAxisTransitionType? newValue) {
                     _updateTransitionType(newValue);
                   },
                 ),
@@ -88,7 +88,7 @@
                 Radio<SharedAxisTransitionType>(
                   value: SharedAxisTransitionType.vertical,
                   groupValue: _transitionType,
-                  onChanged: (SharedAxisTransitionType newValue) {
+                  onChanged: (SharedAxisTransitionType? newValue) {
                     _updateTransitionType(newValue);
                   },
                 ),
@@ -96,7 +96,7 @@
                 Radio<SharedAxisTransitionType>(
                   value: SharedAxisTransitionType.scaled,
                   groupValue: _transitionType,
-                  onChanged: (SharedAxisTransitionType newValue) {
+                  onChanged: (SharedAxisTransitionType? newValue) {
                     _updateTransitionType(newValue);
                   },
                 ),
@@ -146,7 +146,7 @@
 
 class _CourseSwitch extends StatefulWidget {
   const _CourseSwitch({
-    this.course,
+    required this.course,
   });
 
   final String course;
diff --git a/packages/animations/example/pubspec.yaml b/packages/animations/example/pubspec.yaml
index 7b272ff..68a79d1 100644
--- a/packages/animations/example/pubspec.yaml
+++ b/packages/animations/example/pubspec.yaml
@@ -6,7 +6,7 @@
 version: 0.0.1
 
 environment:
-  sdk: ">=2.3.0 <3.0.0"
+  sdk: ">=2.12.0-0 <3.0.0"
 
 dependencies:
   animations:
diff --git a/packages/animations/lib/src/dual_transition_builder.dart b/packages/animations/lib/src/dual_transition_builder.dart
deleted file mode 100644
index 763696b..0000000
--- a/packages/animations/lib/src/dual_transition_builder.dart
+++ /dev/null
@@ -1,203 +0,0 @@
-// Copyright 2020 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable`
-// branch contains DualTransitionBuilder.
-
-import 'package:flutter/widgets.dart';
-
-/// Builder callback used by [DualTransitionBuilder].
-///
-/// The builder is expected to return a transition powered by the provided
-/// `animation` and wrapping the provided `child`.
-///
-/// The `animation` provided to the builder always runs forward from 0.0 to 1.0.
-typedef TransitionBuilder = Widget Function(
-  BuildContext context,
-  Animation<double> animation,
-  Widget child,
-);
-
-/// A transition builder that animates its [child] based on the
-/// [AnimationStatus] of the provided [animation].
-///
-/// This widget can be used to specify different enter and exit transitions for
-/// a [child].
-///
-/// While the [animation] runs forward, the [child] is animated according to
-/// [forwardBuilder] and while the [animation] is running in reverse, it is
-/// animated according to [reverseBuilder].
-///
-/// Using this builder allows the widget tree to maintain its shape by nesting
-/// the enter and exit transitions. This ensures that no state information of
-/// any descendant widget is lost when the transition starts or completes.
-class DualTransitionBuilder extends StatefulWidget {
-  /// Creates a [DualTransitionBuilder].
-  ///
-  /// The [animation], [forwardBuilder], and [reverseBuilder] arguments are
-  /// required and must not be null.
-  const DualTransitionBuilder({
-    Key key,
-    @required this.animation,
-    @required this.forwardBuilder,
-    @required this.reverseBuilder,
-    this.child,
-  })  : assert(animation != null),
-        assert(forwardBuilder != null),
-        assert(reverseBuilder != null),
-        super(key: key);
-
-  /// The animation that drives the [child]'s transition.
-  ///
-  /// When this animation runs forward, the [child] transitions as specified by
-  /// [forwardBuilder]. When it runs in reverse, the child transitions according
-  /// to [reverseBuilder].
-  final Animation<double> animation;
-
-  /// A builder for the transition that makes [child] appear on screen.
-  ///
-  /// The [child] should be fully visible when the provided `animation` reaches
-  /// 1.0.
-  ///
-  /// The `animation` provided to this builder is running forward from 0.0 to
-  /// 1.0 when [animation] runs _forward_. When [animation] runs in reverse,
-  /// the given `animation` is set to [kAlwaysCompleteAnimation].
-  ///
-  /// See also:
-  ///
-  ///  * [reverseBuilder], which builds the transition for making the [child]
-  ///   disappear from the screen.
-  final TransitionBuilder forwardBuilder;
-
-  /// A builder for a transition that makes [child] disappear from the screen.
-  ///
-  /// The [child] should be fully invisible when the provided `animation`
-  /// reaches 1.0.
-  ///
-  /// The `animation` provided to this builder is running forward from 0.0 to
-  /// 1.0 when [animation] runs in _reverse_. When [animation] runs forward,
-  /// the given `animation` is set to [kAlwaysDismissedAnimation].
-  ///
-  /// See also:
-  ///
-  ///  * [forwardBuilder], which builds the transition for making the [child]
-  ///    appear on screen.
-  final TransitionBuilder reverseBuilder;
-
-  /// The widget below this [DualTransitionBuilder] in the tree.
-  ///
-  /// This child widget will be wrapped by the transitions built by
-  /// [forwardBuilder] and [reverseBuilder].
-  final Widget child;
-
-  @override
-  State<DualTransitionBuilder> createState() => _DualTransitionBuilderState();
-}
-
-class _DualTransitionBuilderState extends State<DualTransitionBuilder> {
-  AnimationStatus _effectiveAnimationStatus;
-  final ProxyAnimation _forwardAnimation = ProxyAnimation();
-  final ProxyAnimation _reverseAnimation = ProxyAnimation();
-
-  @override
-  void initState() {
-    super.initState();
-    _effectiveAnimationStatus = widget.animation.status;
-    widget.animation.addStatusListener(_animationListener);
-    _updateAnimations();
-  }
-
-  void _animationListener(AnimationStatus animationStatus) {
-    final AnimationStatus oldEffective = _effectiveAnimationStatus;
-    _effectiveAnimationStatus = _calculateEffectiveAnimationStatus(
-      lastEffective: _effectiveAnimationStatus,
-      current: animationStatus,
-    );
-    if (oldEffective != _effectiveAnimationStatus) {
-      _updateAnimations();
-    }
-  }
-
-  @override
-  void didUpdateWidget(DualTransitionBuilder oldWidget) {
-    super.didUpdateWidget(oldWidget);
-    if (oldWidget.animation != widget.animation) {
-      oldWidget.animation.removeStatusListener(_animationListener);
-      widget.animation.addStatusListener(_animationListener);
-      _animationListener(widget.animation.status);
-    }
-  }
-
-  // When a transition is interrupted midway we just want to play the ongoing
-  // animation in reverse. Switching to the actual reverse transition would
-  // yield a disjoint experience since the forward and reverse transitions are
-  // very different.
-  AnimationStatus _calculateEffectiveAnimationStatus({
-    @required AnimationStatus lastEffective,
-    @required AnimationStatus current,
-  }) {
-    assert(current != null);
-    assert(lastEffective != null);
-    switch (current) {
-      case AnimationStatus.dismissed:
-      case AnimationStatus.completed:
-        return current;
-      case AnimationStatus.forward:
-        switch (lastEffective) {
-          case AnimationStatus.dismissed:
-          case AnimationStatus.completed:
-          case AnimationStatus.forward:
-            return current;
-          case AnimationStatus.reverse:
-            return lastEffective;
-        }
-        break;
-      case AnimationStatus.reverse:
-        switch (lastEffective) {
-          case AnimationStatus.dismissed:
-          case AnimationStatus.completed:
-          case AnimationStatus.reverse:
-            return current;
-          case AnimationStatus.forward:
-            return lastEffective;
-        }
-        break;
-    }
-    return null; // unreachable
-  }
-
-  void _updateAnimations() {
-    switch (_effectiveAnimationStatus) {
-      case AnimationStatus.dismissed:
-      case AnimationStatus.forward:
-        _forwardAnimation.parent = widget.animation;
-        _reverseAnimation.parent = kAlwaysDismissedAnimation;
-        break;
-      case AnimationStatus.reverse:
-      case AnimationStatus.completed:
-        _forwardAnimation.parent = kAlwaysCompleteAnimation;
-        _reverseAnimation.parent = ReverseAnimation(widget.animation);
-        break;
-    }
-  }
-
-  @override
-  void dispose() {
-    widget.animation.removeStatusListener(_animationListener);
-    super.dispose();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return widget.forwardBuilder(
-      context,
-      _forwardAnimation,
-      widget.reverseBuilder(
-        context,
-        _reverseAnimation,
-        widget.child,
-      ),
-    );
-  }
-}
diff --git a/packages/animations/lib/src/fade_scale_transition.dart b/packages/animations/lib/src/fade_scale_transition.dart
index c1ed131..059e5cb 100644
--- a/packages/animations/lib/src/fade_scale_transition.dart
+++ b/packages/animations/lib/src/fade_scale_transition.dart
@@ -2,14 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter/material.dart'
-    hide decelerateEasing; // ignore: undefined_hidden_name
-// TODO(goderbauer): Remove implementation import when material properly exports the file.
-import 'package:flutter/src/material/curves.dart'; // ignore: implementation_imports
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
 
-// TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable`
-// branch contains DualTransitionBuilder.
-import 'dual_transition_builder.dart' as dual_transition_builder;
 import 'modal.dart';
 
 /// The modal transition configuration for a Material fade transition.
@@ -121,11 +116,10 @@
   /// [animation] is typically an [AnimationController] that drives the transition
   /// animation. [animation] cannot be null.
   const FadeScaleTransition({
-    Key key,
-    @required this.animation,
+    Key? key,
+    required this.animation,
     this.child,
-  })  : assert(animation != null),
-        super(key: key);
+  }) : super(key: key);
 
   /// The animation that drives the [child]'s entrance and exit.
   ///
@@ -139,7 +133,7 @@
   ///
   /// This widget will transition in and out as driven by [animation] and
   /// [secondaryAnimation].
-  final Widget child;
+  final Widget? child;
 
   static final Animatable<double> _fadeInTransition = CurveTween(
     curve: const Interval(0.0, 0.3),
@@ -155,12 +149,12 @@
 
   @override
   Widget build(BuildContext context) {
-    return dual_transition_builder.DualTransitionBuilder(
+    return DualTransitionBuilder(
       animation: animation,
       forwardBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return FadeTransition(
           opacity: _fadeInTransition.animate(animation),
@@ -173,7 +167,7 @@
       reverseBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return FadeTransition(
           opacity: _fadeOutTransition.animate(animation),
diff --git a/packages/animations/lib/src/fade_through_transition.dart b/packages/animations/lib/src/fade_through_transition.dart
index 7a34190..dc962e0 100644
--- a/packages/animations/lib/src/fade_through_transition.dart
+++ b/packages/animations/lib/src/fade_through_transition.dart
@@ -3,10 +3,7 @@
 // found in the LICENSE file.
 
 import 'package:flutter/material.dart';
-
-// TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable`
-// branch contains DualTransitionBuilder.
-import 'dual_transition_builder.dart' as dual_transition_builder;
+import 'package:flutter/widgets.dart';
 
 /// Used by [PageTransitionsTheme] to define a page route transition animation
 /// in which the outgoing page fades out, then the incoming page fades in and
@@ -69,12 +66,12 @@
   /// The color to use for the background color during the transition.
   ///
   /// This defaults to the [Theme]'s [ThemeData.canvasColor].
-  final Color fillColor;
+  final Color? fillColor;
 
   @override
   Widget buildTransitions<T>(
-    PageRoute<T> route,
-    BuildContext context,
+    PageRoute<T>? route,
+    BuildContext? context,
     Animation<double> animation,
     Animation<double> secondaryAnimation,
     Widget child,
@@ -166,12 +163,11 @@
   /// The [animation] and [secondaryAnimation] argument are required and must
   /// not be null.
   const FadeThroughTransition({
-    @required this.animation,
-    @required this.secondaryAnimation,
+    required this.animation,
+    required this.secondaryAnimation,
     this.fillColor,
     this.child,
-  })  : assert(animation != null),
-        assert(secondaryAnimation != null);
+  });
 
   /// The animation that drives the [child]'s entrance and exit.
   ///
@@ -193,13 +189,13 @@
   /// The color to use for the background color during the transition.
   ///
   /// This defaults to the [Theme]'s [ThemeData.canvasColor].
-  final Color fillColor;
+  final Color? fillColor;
 
   /// The widget below this widget in the tree.
   ///
   /// This widget will transition in and out as driven by [animation] and
   /// [secondaryAnimation].
-  final Widget child;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -217,20 +213,20 @@
 }
 
 class _ZoomedFadeInFadeOut extends StatelessWidget {
-  const _ZoomedFadeInFadeOut({Key key, this.animation, this.child})
+  const _ZoomedFadeInFadeOut({Key? key, required this.animation, this.child})
       : super(key: key);
 
   final Animation<double> animation;
-  final Widget child;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
-    return dual_transition_builder.DualTransitionBuilder(
+    return DualTransitionBuilder(
       animation: animation,
       forwardBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return _ZoomedFadeIn(
           animation: animation,
@@ -240,7 +236,7 @@
       reverseBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return _FadeOut(
           child: child,
@@ -255,10 +251,10 @@
 class _ZoomedFadeIn extends StatelessWidget {
   const _ZoomedFadeIn({
     this.child,
-    this.animation,
+    required this.animation,
   });
 
-  final Widget child;
+  final Widget? child;
   final Animation<double> animation;
 
   static final CurveTween _inCurve = CurveTween(
@@ -304,10 +300,10 @@
 class _FadeOut extends StatelessWidget {
   const _FadeOut({
     this.child,
-    this.animation,
+    required this.animation,
   });
 
-  final Widget child;
+  final Widget? child;
   final Animation<double> animation;
 
   static final CurveTween _outCurve = CurveTween(
diff --git a/packages/animations/lib/src/modal.dart b/packages/animations/lib/src/modal.dart
index 30e8ea1..120d51f 100644
--- a/packages/animations/lib/src/modal.dart
+++ b/packages/animations/lib/src/modal.dart
@@ -46,15 +46,13 @@
 ///
 /// * [ModalConfiguration], which is the configuration object used to define
 /// the modal's characteristics.
-Future<T> showModal<T>({
-  @required BuildContext context,
+Future<T?> showModal<T>({
+  required BuildContext context,
   ModalConfiguration configuration = const FadeScaleTransitionConfiguration(),
   bool useRootNavigator = true,
-  WidgetBuilder builder,
+  required WidgetBuilder builder,
 }) {
-  assert(configuration != null);
-  assert(useRootNavigator != null);
-  String barrierLabel = configuration.barrierLabel;
+  String? barrierLabel = configuration.barrierLabel;
   // Avoid looking up [MaterialLocalizations.of(context).modalBarrierDismissLabel]
   // if there is no dismissible barrier.
   if (configuration.barrierDismissible && configuration.barrierLabel == null) {
@@ -89,22 +87,21 @@
     this.barrierColor,
     this.barrierDismissible = true,
     this.barrierLabel,
-    this.transitionDuration,
-    this.reverseTransitionDuration,
-    _ModalTransitionBuilder transitionBuilder,
-    @required this.builder,
-  })  : assert(barrierDismissible != null),
-        assert(!barrierDismissible || barrierLabel != null),
+    required this.transitionDuration,
+    required this.reverseTransitionDuration,
+    required _ModalTransitionBuilder transitionBuilder,
+    required this.builder,
+  })   : assert(!barrierDismissible || barrierLabel != null),
         _transitionBuilder = transitionBuilder;
 
   @override
-  final Color barrierColor;
+  final Color? barrierColor;
 
   @override
   final bool barrierDismissible;
 
   @override
-  final String barrierLabel;
+  final String? barrierLabel;
 
   @override
   final Duration transitionDuration;
@@ -129,7 +126,7 @@
         child: Builder(
           builder: (BuildContext context) {
             final Widget child = Builder(builder: builder);
-            return theme != null ? Theme(data: theme, child: child) : child;
+            return Theme(data: theme, child: child);
           },
         ),
       ),
@@ -178,16 +175,12 @@
   /// application. [transitionDuration] and [reverseTransitionDuration]
   /// cannot be null.
   const ModalConfiguration({
-    @required this.barrierColor,
-    @required this.barrierDismissible,
+    required this.barrierColor,
+    required this.barrierDismissible,
     this.barrierLabel,
-    @required this.transitionDuration,
-    @required this.reverseTransitionDuration,
-  })  : assert(barrierColor != null),
-        assert(barrierDismissible != null),
-        assert(!barrierDismissible || barrierLabel != null),
-        assert(transitionDuration != null),
-        assert(reverseTransitionDuration != null);
+    required this.transitionDuration,
+    required this.reverseTransitionDuration,
+  }) : assert(!barrierDismissible || barrierLabel != null);
 
   /// The color to use for the modal barrier. If this is null, the barrier will
   /// be transparent.
@@ -197,7 +190,7 @@
   final bool barrierDismissible;
 
   /// The semantic label used for a dismissible barrier.
-  final String barrierLabel;
+  final String? barrierLabel;
 
   /// The duration of the transition running forwards.
   final Duration transitionDuration;
diff --git a/packages/animations/lib/src/open_container.dart b/packages/animations/lib/src/open_container.dart
index f9ba91a..7510153 100644
--- a/packages/animations/lib/src/open_container.dart
+++ b/packages/animations/lib/src/open_container.dart
@@ -9,7 +9,7 @@
 ///
 /// Parameter `returnValue` is the value which will be provided to [OpenContainer.onClosed]
 /// when `action` is called.
-typedef CloseContainerActionCallback<S> = void Function({S returnValue});
+typedef CloseContainerActionCallback<S> = void Function({S? returnValue});
 
 /// Signature for a function that creates a [Widget] in open state within an
 /// [OpenContainer].
@@ -74,13 +74,13 @@
 ///  * [Transitions with animated containers](https://material.io/design/motion/choreography.html#transformation)
 ///    in the Material spec.
 @optionalTypeArgs
-class OpenContainer<T extends Object> extends StatefulWidget {
+class OpenContainer<T extends Object?> extends StatefulWidget {
   /// Creates an [OpenContainer].
   ///
   /// All arguments except for [key] must not be null. The arguments
   /// [openBuilder] and [closedBuilder] are required.
   const OpenContainer({
-    Key key,
+    Key? key,
     this.closedColor = Colors.white,
     this.openColor = Colors.white,
     this.middleColor,
@@ -91,25 +91,14 @@
     ),
     this.openShape = const RoundedRectangleBorder(),
     this.onClosed,
-    @required this.closedBuilder,
-    @required this.openBuilder,
+    required this.closedBuilder,
+    required this.openBuilder,
     this.tappable = true,
     this.transitionDuration = const Duration(milliseconds: 300),
     this.transitionType = ContainerTransitionType.fade,
     this.useRootNavigator = false,
     this.routeSettings,
-  })  : assert(closedColor != null),
-        assert(openColor != null),
-        assert(closedElevation != null),
-        assert(openElevation != null),
-        assert(closedShape != null),
-        assert(openShape != null),
-        assert(closedBuilder != null),
-        assert(openBuilder != null),
-        assert(tappable != null),
-        assert(transitionType != null),
-        assert(useRootNavigator != null),
-        super(key: key);
+  }) : super(key: key);
 
   /// Background color of the container while it is closed.
   ///
@@ -147,7 +136,7 @@
   /// See also:
   ///
   ///  * [Material.color], which is used to implement this property.
-  final Color middleColor;
+  final Color? middleColor;
 
   /// Elevation of the container while it is closed.
   ///
@@ -208,7 +197,7 @@
   ///
   /// If no value is returned via [Navigator.pop] or [OpenContainer.openBuilder.action],
   /// `null` will be returned by default.
-  final ClosedCallback<T> onClosed;
+  final ClosedCallback<T?>? onClosed;
 
   /// Called to obtain the child for the container in the closed state.
   ///
@@ -259,13 +248,13 @@
   final bool useRootNavigator;
 
   /// Provides additional data to the [openBuilder] route pushed by the Navigator.
-  final RouteSettings routeSettings;
+  final RouteSettings? routeSettings;
 
   @override
   _OpenContainerState<T> createState() => _OpenContainerState<T>();
 }
 
-class _OpenContainerState<T> extends State<OpenContainer<T>> {
+class _OpenContainerState<T> extends State<OpenContainer<T?>> {
   // Key used in [_OpenContainerRoute] to hide the widget returned by
   // [OpenContainer.openBuilder] in the source route while the container is
   // opening/open. A copy of that widget is included in the
@@ -281,7 +270,7 @@
   Future<void> openContainer() async {
     final Color middleColor =
         widget.middleColor ?? Theme.of(context).canvasColor;
-    final T data = await Navigator.of(
+    final T? data = await Navigator.of(
       context,
       rootNavigator: widget.useRootNavigator,
     ).push(_OpenContainerRoute<T>(
@@ -302,7 +291,7 @@
       routeSettings: widget.routeSettings,
     ));
     if (widget.onClosed != null) {
-      widget.onClosed(data);
+      widget.onClosed!(data);
     }
   }
 
@@ -342,11 +331,11 @@
 ///    `isVisible` is ignored).
 class _Hideable extends StatefulWidget {
   const _Hideable({
-    Key key,
+    Key? key,
     this.child,
   }) : super(key: key);
 
-  final Widget child;
+  final Widget? child;
 
   @override
   State<_Hideable> createState() => _HideableState();
@@ -354,9 +343,9 @@
 
 class _HideableState extends State<_Hideable> {
   /// When non-null the child is replaced by a [SizedBox] of the set size.
-  Size get placeholderSize => _placeholderSize;
-  Size _placeholderSize;
-  set placeholderSize(Size value) {
+  Size? get placeholderSize => _placeholderSize;
+  Size? _placeholderSize;
+  set placeholderSize(Size? value) {
     if (_placeholderSize == value) {
       return;
     }
@@ -372,7 +361,6 @@
   bool get isVisible => _visible;
   bool _visible = true;
   set isVisible(bool value) {
-    assert(value != null);
     if (_visible == value) {
       return;
     }
@@ -400,33 +388,22 @@
 
 class _OpenContainerRoute<T> extends ModalRoute<T> {
   _OpenContainerRoute({
-    @required this.closedColor,
-    @required this.openColor,
-    @required this.middleColor,
-    @required double closedElevation,
-    @required this.openElevation,
-    @required ShapeBorder closedShape,
-    @required this.openShape,
-    @required this.closedBuilder,
-    @required this.openBuilder,
-    @required this.hideableKey,
-    @required this.closedBuilderKey,
-    @required this.transitionDuration,
-    @required this.transitionType,
-    @required this.useRootNavigator,
-    @required RouteSettings routeSettings,
-  })  : assert(closedColor != null),
-        assert(openColor != null),
-        assert(closedElevation != null),
-        assert(openElevation != null),
-        assert(closedShape != null),
-        assert(openBuilder != null),
-        assert(closedBuilder != null),
-        assert(hideableKey != null),
-        assert(closedBuilderKey != null),
-        assert(transitionType != null),
-        assert(useRootNavigator != null),
-        _elevationTween = Tween<double>(
+    required this.closedColor,
+    required this.openColor,
+    required this.middleColor,
+    required double closedElevation,
+    required this.openElevation,
+    required ShapeBorder closedShape,
+    required this.openShape,
+    required this.closedBuilder,
+    required this.openBuilder,
+    required this.hideableKey,
+    required this.closedBuilderKey,
+    required this.transitionDuration,
+    required this.transitionType,
+    required this.useRootNavigator,
+    required RouteSettings? routeSettings,
+  })   : _elevationTween = Tween<double>(
           begin: closedElevation,
           end: openElevation,
         ),
@@ -444,21 +421,21 @@
         _openOpacityTween = _getOpenOpacityTween(transitionType),
         super(settings: routeSettings);
 
-  static _FlippableTweenSequence<Color> _getColorTween({
-    @required ContainerTransitionType transitionType,
-    @required Color closedColor,
-    @required Color openColor,
-    @required Color middleColor,
+  static _FlippableTweenSequence<Color?> _getColorTween({
+    required ContainerTransitionType transitionType,
+    required Color closedColor,
+    required Color openColor,
+    required Color middleColor,
   }) {
     switch (transitionType) {
       case ContainerTransitionType.fade:
-        return _FlippableTweenSequence<Color>(
-          <TweenSequenceItem<Color>>[
+        return _FlippableTweenSequence<Color?>(
+          <TweenSequenceItem<Color?>>[
             TweenSequenceItem<Color>(
               tween: ConstantTween<Color>(closedColor),
               weight: 1 / 5,
             ),
-            TweenSequenceItem<Color>(
+            TweenSequenceItem<Color?>(
               tween: ColorTween(begin: closedColor, end: openColor),
               weight: 1 / 5,
             ),
@@ -469,20 +446,19 @@
           ],
         );
       case ContainerTransitionType.fadeThrough:
-        return _FlippableTweenSequence<Color>(
-          <TweenSequenceItem<Color>>[
-            TweenSequenceItem<Color>(
+        return _FlippableTweenSequence<Color?>(
+          <TweenSequenceItem<Color?>>[
+            TweenSequenceItem<Color?>(
               tween: ColorTween(begin: closedColor, end: middleColor),
               weight: 1 / 5,
             ),
-            TweenSequenceItem<Color>(
+            TweenSequenceItem<Color?>(
               tween: ColorTween(begin: middleColor, end: openColor),
               weight: 4 / 5,
             ),
           ],
         );
     }
-    return null; // unreachable
   }
 
   static _FlippableTweenSequence<double> _getClosedOpacityTween(
@@ -497,7 +473,6 @@
             ),
           ],
         );
-        break;
       case ContainerTransitionType.fadeThrough:
         return _FlippableTweenSequence<double>(
           <TweenSequenceItem<double>>[
@@ -511,9 +486,7 @@
             ),
           ],
         );
-        break;
     }
-    return null; // unreachable
   }
 
   static _FlippableTweenSequence<double> _getOpenOpacityTween(
@@ -536,7 +509,6 @@
             ),
           ],
         );
-        break;
       case ContainerTransitionType.fadeThrough:
         return _FlippableTweenSequence<double>(
           <TweenSequenceItem<double>>[
@@ -550,9 +522,7 @@
             ),
           ],
         );
-        break;
     }
-    return null; // unreachable
   }
 
   final Color closedColor;
@@ -579,11 +549,11 @@
   final ShapeBorderTween _shapeTween;
   final _FlippableTweenSequence<double> _closedOpacityTween;
   final _FlippableTweenSequence<double> _openOpacityTween;
-  final _FlippableTweenSequence<Color> _colorTween;
+  final _FlippableTweenSequence<Color?> _colorTween;
 
-  static final TweenSequence<Color> _scrimFadeInTween = TweenSequence<Color>(
-    <TweenSequenceItem<Color>>[
-      TweenSequenceItem<Color>(
+  static final TweenSequence<Color?> _scrimFadeInTween = TweenSequence<Color?>(
+    <TweenSequenceItem<Color?>>[
+      TweenSequenceItem<Color?>(
         tween: ColorTween(begin: Colors.transparent, end: Colors.black54),
         weight: 1 / 5,
       ),
@@ -593,7 +563,7 @@
       ),
     ],
   );
-  static final Tween<Color> _scrimFadeOutTween = ColorTween(
+  static final Tween<Color?> _scrimFadeOutTween = ColorTween(
     begin: Colors.transparent,
     end: Colors.black54,
   );
@@ -608,14 +578,14 @@
   // the bounds of the enclosing [Navigator].
   final RectTween _rectTween = RectTween();
 
-  AnimationStatus _lastAnimationStatus;
-  AnimationStatus _currentAnimationStatus;
+  AnimationStatus? _lastAnimationStatus;
+  AnimationStatus? _currentAnimationStatus;
 
   @override
   TickerFuture didPush() {
-    _takeMeasurements(navigatorContext: hideableKey.currentContext);
+    _takeMeasurements(navigatorContext: hideableKey.currentContext!);
 
-    animation.addStatusListener((AnimationStatus status) {
+    animation!.addStatusListener((AnimationStatus status) {
       _lastAnimationStatus = _currentAnimationStatus;
       _currentAnimationStatus = status;
       switch (status) {
@@ -635,9 +605,9 @@
   }
 
   @override
-  bool didPop(T result) {
+  bool didPop(T? result) {
     _takeMeasurements(
-      navigatorContext: subtreeContext,
+      navigatorContext: subtreeContext!,
       delayForSourceRoute: true,
     );
     return super.didPop(result);
@@ -645,44 +615,44 @@
 
   @override
   void dispose() {
-    if (hideableKey?.currentState?.isVisible == false) {
+    if (hideableKey.currentState?.isVisible == false) {
       // This route may be disposed without dismissing its animation if it is
       // removed by the navigator.
-      SchedulerBinding.instance
+      SchedulerBinding.instance!
           .addPostFrameCallback((Duration d) => _toggleHideable(hide: false));
     }
     super.dispose();
   }
 
-  void _toggleHideable({bool hide}) {
-    if (hideableKey?.currentState != null) {
-      hideableKey.currentState
+  void _toggleHideable({required bool hide}) {
+    if (hideableKey.currentState != null) {
+      hideableKey.currentState!
         ..placeholderSize = null
         ..isVisible = !hide;
     }
   }
 
   void _takeMeasurements({
-    BuildContext navigatorContext,
+    required BuildContext navigatorContext,
     bool delayForSourceRoute = false,
   }) {
     final RenderBox navigator = Navigator.of(
       navigatorContext,
       rootNavigator: useRootNavigator,
-    ).context.findRenderObject();
+    ).context.findRenderObject() as RenderBox;
     final Size navSize = _getSize(navigator);
     _rectTween.end = Offset.zero & navSize;
 
-    void takeMeasurementsInSourceRoute([Duration _]) {
+    void takeMeasurementsInSourceRoute([Duration? _]) {
       if (!navigator.attached || hideableKey.currentContext == null) {
         return;
       }
       _rectTween.begin = _getRect(hideableKey, navigator);
-      hideableKey.currentState.placeholderSize = _rectTween.begin.size;
+      hideableKey.currentState!.placeholderSize = _rectTween.begin!.size;
     }
 
     if (delayForSourceRoute) {
-      SchedulerBinding.instance
+      SchedulerBinding.instance!
           .addPostFrameCallback(takeMeasurementsInSourceRoute);
     } else {
       takeMeasurementsInSourceRoute();
@@ -690,7 +660,7 @@
   }
 
   Size _getSize(RenderBox render) {
-    assert(render != null && render.hasSize);
+    assert(render.hasSize);
     return render.size;
   }
 
@@ -698,9 +668,10 @@
   // coordinate system of `ancestor`.
   Rect _getRect(GlobalKey key, RenderBox ancestor) {
     assert(key.currentContext != null);
-    assert(ancestor != null && ancestor.hasSize);
-    final RenderBox render = key.currentContext.findRenderObject();
-    assert(render != null && render.hasSize);
+    assert(ancestor.hasSize);
+    final RenderBox render =
+        key.currentContext!.findRenderObject() as RenderBox;
+    assert(render.hasSize);
     return MatrixUtils.transformRect(
       render.getTransformTo(ancestor),
       Offset.zero & render.size,
@@ -720,6 +691,8 @@
       case AnimationStatus.reverse:
         isInProgress = true;
         break;
+      case null:
+        break;
     }
     switch (_lastAnimationStatus) {
       case AnimationStatus.completed:
@@ -730,12 +703,14 @@
       case AnimationStatus.reverse:
         wasInProgress = true;
         break;
+      case null:
+        break;
     }
     return wasInProgress && isInProgress;
   }
 
-  void closeContainer({T returnValue}) {
-    Navigator.of(subtreeContext).pop(returnValue);
+  void closeContainer({T? returnValue}) {
+    Navigator.of(subtreeContext!).pop(returnValue);
   }
 
   @override
@@ -748,7 +723,7 @@
       alignment: Alignment.topLeft,
       child: AnimatedBuilder(
         animation: animation,
-        builder: (BuildContext context, Widget child) {
+        builder: (BuildContext context, Widget? child) {
           if (animation.isCompleted) {
             return SizedBox.expand(
               child: Material(
@@ -771,9 +746,9 @@
             reverseCurve:
                 _transitionWasInterrupted ? null : Curves.fastOutSlowIn.flipped,
           );
-          TweenSequence<Color> colorTween;
-          TweenSequence<double> closedOpacityTween, openOpacityTween;
-          Animatable<Color> scrimTween;
+          TweenSequence<Color?>? colorTween;
+          TweenSequence<double>? closedOpacityTween, openOpacityTween;
+          Animatable<Color?>? scrimTween;
           switch (animation.status) {
             case AnimationStatus.dismissed:
             case AnimationStatus.forward:
@@ -804,10 +779,10 @@
           assert(openOpacityTween != null);
           assert(scrimTween != null);
 
-          final Rect rect = _rectTween.evaluate(curvedAnimation);
+          final Rect rect = _rectTween.evaluate(curvedAnimation)!;
           return SizedBox.expand(
             child: Container(
-              color: scrimTween.evaluate(curvedAnimation),
+              color: scrimTween!.evaluate(curvedAnimation),
               child: Align(
                 alignment: Alignment.topLeft,
                 child: Transform.translate(
@@ -818,7 +793,7 @@
                     child: Material(
                       clipBehavior: Clip.antiAlias,
                       animationDuration: Duration.zero,
-                      color: colorTween.evaluate(animation),
+                      color: colorTween!.evaluate(animation),
                       shape: _shapeTween.evaluate(curvedAnimation),
                       elevation: _elevationTween.evaluate(curvedAnimation),
                       child: Stack(
@@ -829,13 +804,13 @@
                             fit: BoxFit.fitWidth,
                             alignment: Alignment.topLeft,
                             child: SizedBox(
-                              width: _rectTween.begin.width,
-                              height: _rectTween.begin.height,
+                              width: _rectTween.begin!.width,
+                              height: _rectTween.begin!.height,
                               child: (hideableKey.currentState?.isInTree ??
                                       false)
                                   ? null
                                   : Opacity(
-                                      opacity: closedOpacityTween
+                                      opacity: closedOpacityTween!
                                           .evaluate(animation),
                                       child: Builder(
                                         key: closedBuilderKey,
@@ -854,10 +829,10 @@
                             fit: BoxFit.fitWidth,
                             alignment: Alignment.topLeft,
                             child: SizedBox(
-                              width: _rectTween.end.width,
-                              height: _rectTween.end.height,
+                              width: _rectTween.end!.width,
+                              height: _rectTween.end!.height,
                               child: Opacity(
-                                opacity: openOpacityTween.evaluate(animation),
+                                opacity: openOpacityTween!.evaluate(animation),
                                 child: Builder(
                                   key: _openBuilderKey,
                                   builder: (BuildContext context) {
@@ -884,7 +859,7 @@
   bool get maintainState => true;
 
   @override
-  Color get barrierColor => null;
+  Color? get barrierColor => null;
 
   @override
   bool get opaque => true;
@@ -893,16 +868,16 @@
   bool get barrierDismissible => false;
 
   @override
-  String get barrierLabel => null;
+  String? get barrierLabel => null;
 }
 
 class _FlippableTweenSequence<T> extends TweenSequence<T> {
   _FlippableTweenSequence(this._items) : super(_items);
 
   final List<TweenSequenceItem<T>> _items;
-  _FlippableTweenSequence<T> _flipped;
+  _FlippableTweenSequence<T>? _flipped;
 
-  _FlippableTweenSequence<T> get flipped {
+  _FlippableTweenSequence<T>? get flipped {
     if (_flipped == null) {
       final List<TweenSequenceItem<T>> newItems = <TweenSequenceItem<T>>[];
       for (int i = 0; i < _items.length; i++) {
diff --git a/packages/animations/lib/src/page_transition_switcher.dart b/packages/animations/lib/src/page_transition_switcher.dart
index f1201f0..364e557 100644
--- a/packages/animations/lib/src/page_transition_switcher.dart
+++ b/packages/animations/lib/src/page_transition_switcher.dart
@@ -18,14 +18,11 @@
   /// The [primaryController], [secondaryController], [transition] and
   /// [widgetChild] parameters must not be null.
   _ChildEntry({
-    @required this.primaryController,
-    @required this.secondaryController,
-    @required this.transition,
-    @required this.widgetChild,
-  })  : assert(primaryController != null),
-        assert(secondaryController != null),
-        assert(widgetChild != null),
-        assert(transition != null);
+    required this.primaryController,
+    required this.secondaryController,
+    required this.transition,
+    required this.widgetChild,
+  });
 
   /// The animation controller for the child's transition.
   final AnimationController primaryController;
@@ -172,17 +169,13 @@
   /// The [duration], [reverse], and [transitionBuilder] parameters
   /// must not be null.
   const PageTransitionSwitcher({
-    Key key,
+    Key? key,
     this.duration = const Duration(milliseconds: 300),
     this.reverse = false,
-    @required this.transitionBuilder,
+    required this.transitionBuilder,
     this.layoutBuilder = defaultLayoutBuilder,
     this.child,
-  })  : assert(duration != null),
-        assert(reverse != null),
-        assert(transitionBuilder != null),
-        assert(layoutBuilder != null),
-        super(key: key);
+  }) : super(key: key);
 
   /// The current child widget to display.
   ///
@@ -195,7 +188,7 @@
   ///
   /// The child is considered to be "new" if it has a different type or [Key]
   /// (see [Widget.canUpdate]).
-  final Widget child;
+  final Widget? child;
 
   /// The duration of the transition from the old [child] value to the new one.
   ///
@@ -285,7 +278,7 @@
 class _PageTransitionSwitcherState extends State<PageTransitionSwitcher>
     with TickerProviderStateMixin {
   final List<_ChildEntry> _activeEntries = <_ChildEntry>[];
-  _ChildEntry _currentEntry;
+  _ChildEntry? _currentEntry;
   int _childNumber = 0;
 
   @override
@@ -308,30 +301,30 @@
     final bool hasOldChild = _currentEntry != null;
     if (hasNewChild != hasOldChild ||
         hasNewChild &&
-            !Widget.canUpdate(widget.child, _currentEntry.widgetChild)) {
+            !Widget.canUpdate(widget.child!, _currentEntry!.widgetChild)) {
       // Child has changed, fade current entry out and add new entry.
       _childNumber += 1;
       _addEntryForNewChild(shouldAnimate: true);
     } else if (_currentEntry != null) {
       assert(hasOldChild && hasNewChild);
-      assert(Widget.canUpdate(widget.child, _currentEntry.widgetChild));
+      assert(Widget.canUpdate(widget.child!, _currentEntry!.widgetChild));
       // Child has been updated. Make sure we update the child widget and
       // transition in _currentEntry even though we're not going to start a new
       // animation, but keep the key from the old transition so that we
       // update the transition instead of replacing it.
-      _currentEntry.widgetChild = widget.child;
-      _updateTransitionForEntry(_currentEntry); // uses entry.widgetChild
+      _currentEntry!.widgetChild = widget.child!;
+      _updateTransitionForEntry(_currentEntry!); // uses entry.widgetChild
     }
   }
 
-  void _addEntryForNewChild({@required bool shouldAnimate}) {
+  void _addEntryForNewChild({required bool shouldAnimate}) {
     assert(shouldAnimate || _currentEntry == null);
     if (_currentEntry != null) {
       assert(shouldAnimate);
       if (widget.reverse) {
-        _currentEntry.primaryController.reverse();
+        _currentEntry!.primaryController.reverse();
       } else {
-        _currentEntry.secondaryController.forward();
+        _currentEntry!.secondaryController.forward();
       }
       _currentEntry = null;
     }
@@ -359,35 +352,31 @@
       primaryController.value = 1.0;
     }
     _currentEntry = _newEntry(
-      child: widget.child,
+      child: widget.child!,
       primaryController: primaryController,
       secondaryController: secondaryController,
       builder: widget.transitionBuilder,
     );
     if (widget.reverse && _activeEntries.isNotEmpty) {
       // Add below old child.
-      _activeEntries.insert(_activeEntries.length - 1, _currentEntry);
+      _activeEntries.insert(_activeEntries.length - 1, _currentEntry!);
     } else {
       // Add on top of old child.
-      _activeEntries.add(_currentEntry);
+      _activeEntries.add(_currentEntry!);
     }
   }
 
   _ChildEntry _newEntry({
-    @required Widget child,
-    @required PageTransitionSwitcherTransitionBuilder builder,
-    @required AnimationController primaryController,
-    @required AnimationController secondaryController,
+    required Widget child,
+    required PageTransitionSwitcherTransitionBuilder builder,
+    required AnimationController primaryController,
+    required AnimationController secondaryController,
   }) {
     final Widget transition = builder(
       child,
       primaryController,
       secondaryController,
     );
-    assert(
-      transition != null,
-      'PageTransitionSwitcher.builder must not return null.',
-    );
     final _ChildEntry entry = _ChildEntry(
       widgetChild: child,
       transition: KeyedSubtree.wrap(
@@ -426,10 +415,6 @@
       entry.primaryController,
       entry.secondaryController,
     );
-    assert(
-      transition != null,
-      'PageTransitionSwitcher.builder must not return null.',
-    );
     entry.transition = KeyedSubtree(
       key: entry.transition.key,
       child: transition,
diff --git a/packages/animations/lib/src/shared_axis_transition.dart b/packages/animations/lib/src/shared_axis_transition.dart
index 3d351af..a8cf497 100644
--- a/packages/animations/lib/src/shared_axis_transition.dart
+++ b/packages/animations/lib/src/shared_axis_transition.dart
@@ -4,19 +4,9 @@
 
 import 'package:flutter/animation.dart';
 import 'package:flutter/foundation.dart';
-import 'package:flutter/material.dart'
-    hide
-        decelerateEasing, // ignore: undefined_hidden_name
-        standardEasing, // ignore: undefined_hidden_name
-        accelerateEasing; // ignore: undefined_hidden_name
-// TODO(goderbauer): Remove implementation import when material properly exports the file.
-import 'package:flutter/src/material/curves.dart'; // ignore: implementation_imports
+import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 
-// TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable`
-// branch contains DualTransitionBuilder.
-import 'dual_transition_builder.dart' as dual_transition_builder;
-
 /// Determines which type of shared axis transition is used.
 enum SharedAxisTransitionType {
   /// Creates a shared axis vertical (y-axis) page transition.
@@ -87,9 +77,9 @@
 class SharedAxisPageTransitionsBuilder extends PageTransitionsBuilder {
   /// Construct a [SharedAxisPageTransitionsBuilder].
   const SharedAxisPageTransitionsBuilder({
-    @required this.transitionType,
+    required this.transitionType,
     this.fillColor,
-  }) : assert(transitionType != null);
+  });
 
   /// Determines which [SharedAxisTransitionType] to build.
   final SharedAxisTransitionType transitionType;
@@ -97,12 +87,12 @@
   /// The color to use for the background color during the transition.
   ///
   /// This defaults to the [Theme]'s [ThemeData.canvasColor].
-  final Color fillColor;
+  final Color? fillColor;
 
   @override
   Widget buildTransitions<T>(
-    PageRoute<T> route,
-    BuildContext context,
+    PageRoute<T>? route,
+    BuildContext? context,
     Animation<double> animation,
     Animation<double> secondaryAnimation,
     Widget child,
@@ -197,14 +187,13 @@
   /// The [animation] and [secondaryAnimation] argument are required and must
   /// not be null.
   const SharedAxisTransition({
-    Key key,
-    @required this.animation,
-    @required this.secondaryAnimation,
-    @required this.transitionType,
+    Key? key,
+    required this.animation,
+    required this.secondaryAnimation,
+    required this.transitionType,
     this.fillColor,
     this.child,
-  })  : assert(transitionType != null),
-        super(key: key);
+  }) : super(key: key);
 
   /// The animation that drives the [child]'s entrance and exit.
   ///
@@ -234,23 +223,23 @@
   /// The color to use for the background color during the transition.
   ///
   /// This defaults to the [Theme]'s [ThemeData.canvasColor].
-  final Color fillColor;
+  final Color? fillColor;
 
   /// The widget below this widget in the tree.
   ///
   /// This widget will transition in and out as driven by [animation] and
   /// [secondaryAnimation].
-  final Widget child;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
     final Color color = fillColor ?? Theme.of(context).canvasColor;
-    return dual_transition_builder.DualTransitionBuilder(
+    return DualTransitionBuilder(
       animation: animation,
       forwardBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return _EnterTransition(
           animation: animation,
@@ -261,7 +250,7 @@
       reverseBuilder: (
         BuildContext context,
         Animation<double> animation,
-        Widget child,
+        Widget? child,
       ) {
         return _ExitTransition(
           animation: animation,
@@ -271,12 +260,12 @@
           child: child,
         );
       },
-      child: dual_transition_builder.DualTransitionBuilder(
+      child: DualTransitionBuilder(
         animation: ReverseAnimation(secondaryAnimation),
         forwardBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return _EnterTransition(
             animation: animation,
@@ -288,7 +277,7 @@
         reverseBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return _ExitTransition(
             animation: animation,
@@ -305,15 +294,15 @@
 
 class _EnterTransition extends StatelessWidget {
   const _EnterTransition({
-    this.animation,
-    this.transitionType,
+    required this.animation,
+    required this.transitionType,
     this.reverse = false,
     this.child,
   });
 
   final Animation<double> animation;
   final SharedAxisTransitionType transitionType;
-  final Widget child;
+  final Widget? child;
   final bool reverse;
 
   static final Animatable<double> _fadeInTransition = CurveTween(
@@ -343,7 +332,7 @@
           opacity: _fadeInTransition.animate(animation),
           child: AnimatedBuilder(
             animation: animation,
-            builder: (BuildContext context, Widget child) {
+            builder: (BuildContext context, Widget? child) {
               return Transform.translate(
                 offset: slideInTransition.evaluate(animation),
                 child: child,
@@ -352,7 +341,6 @@
             child: child,
           ),
         );
-        break;
       case SharedAxisTransitionType.vertical:
         final Animatable<Offset> slideInTransition = Tween<Offset>(
           begin: Offset(0.0, !reverse ? 30.0 : -30.0),
@@ -363,7 +351,7 @@
           opacity: _fadeInTransition.animate(animation),
           child: AnimatedBuilder(
             animation: animation,
-            builder: (BuildContext context, Widget child) {
+            builder: (BuildContext context, Widget? child) {
               return Transform.translate(
                 offset: slideInTransition.evaluate(animation),
                 child: child,
@@ -372,7 +360,6 @@
             child: child,
           ),
         );
-        break;
       case SharedAxisTransitionType.scaled:
         return FadeTransition(
           opacity: _fadeInTransition.animate(animation),
@@ -382,18 +369,16 @@
             child: child,
           ),
         );
-        break;
     }
-    return null; // unreachable
   }
 }
 
 class _ExitTransition extends StatelessWidget {
   const _ExitTransition({
-    this.animation,
-    this.transitionType,
+    required this.animation,
+    required this.transitionType,
     this.reverse = false,
-    @required this.fillColor,
+    required this.fillColor,
     this.child,
   });
 
@@ -401,7 +386,7 @@
   final SharedAxisTransitionType transitionType;
   final bool reverse;
   final Color fillColor;
-  final Widget child;
+  final Widget? child;
 
   static final Animatable<double> _fadeOutTransition = _FlippedCurveTween(
     curve: accelerateEasing,
@@ -432,7 +417,7 @@
             color: fillColor,
             child: AnimatedBuilder(
               animation: animation,
-              builder: (BuildContext context, Widget child) {
+              builder: (BuildContext context, Widget? child) {
                 return Transform.translate(
                   offset: slideOutTransition.evaluate(animation),
                   child: child,
@@ -442,7 +427,6 @@
             ),
           ),
         );
-        break;
       case SharedAxisTransitionType.vertical:
         final Animatable<Offset> slideOutTransition = Tween<Offset>(
           begin: Offset.zero,
@@ -455,7 +439,7 @@
             color: fillColor,
             child: AnimatedBuilder(
               animation: animation,
-              builder: (BuildContext context, Widget child) {
+              builder: (BuildContext context, Widget? child) {
                 return Transform.translate(
                   offset: slideOutTransition.evaluate(animation),
                   child: child,
@@ -465,7 +449,6 @@
             ),
           ),
         );
-        break;
       case SharedAxisTransitionType.scaled:
         return FadeTransition(
           opacity: _fadeOutTransition.animate(animation),
@@ -478,9 +461,7 @@
             ),
           ),
         );
-        break;
     }
-    return null; // unreachable
   }
 }
 
@@ -494,9 +475,8 @@
 class _FlippedCurveTween extends CurveTween {
   /// Creates a vertically flipped [CurveTween].
   _FlippedCurveTween({
-    @required Curve curve,
-  })  : assert(curve != null),
-        super(curve: curve);
+    required Curve curve,
+  }) : super(curve: curve);
 
   @override
   double transform(double t) => 1.0 - super.transform(t);
diff --git a/packages/animations/pubspec.yaml b/packages/animations/pubspec.yaml
index f14256b..8417e19 100644
--- a/packages/animations/pubspec.yaml
+++ b/packages/animations/pubspec.yaml
@@ -1,10 +1,10 @@
 name: animations
 description: Fancy pre-built animations that can easily be integrated into any Flutter application.
-version: 1.1.2
+version: 2.0.0-nullsafety.0
 homepage: https://github.com/flutter/packages/tree/master/packages/animations
 
 environment:
-  sdk: ">=2.2.2 <3.0.0"
+  sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
   flutter:
@@ -13,4 +13,4 @@
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  vector_math: ^2.0.8
+  vector_math: ">=2.1.0-nullsafety.5 <3.0.0"
diff --git a/packages/animations/test/dual_transition_builder_test.dart b/packages/animations/test/dual_transition_builder_test.dart
index 917ab76..09a80af 100644
--- a/packages/animations/test/dual_transition_builder_test.dart
+++ b/packages/animations/test/dual_transition_builder_test.dart
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// TODO(shihaohong): Remove DualTransitionBuilder once flutter/flutter's `stable`
-// branch contains DualTransitionBuilder.
-import 'package:animations/src/dual_transition_builder.dart'
-    as dual_transition_builder;
 import 'package:flutter/material.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:flutter/widgets.dart';
@@ -18,12 +14,12 @@
     );
 
     await tester.pumpWidget(Center(
-      child: dual_transition_builder.DualTransitionBuilder(
+      child: DualTransitionBuilder(
         animation: controller,
         forwardBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return ScaleTransition(
             scale: animation,
@@ -33,7 +29,7 @@
         reverseBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return FadeTransition(
             opacity: Tween<double>(begin: 1.0, end: 0.0).animate(animation),
@@ -88,12 +84,12 @@
     await tester.pumpWidget(Directionality(
       textDirection: TextDirection.ltr,
       child: Center(
-        child: dual_transition_builder.DualTransitionBuilder(
+        child: DualTransitionBuilder(
           animation: controller,
           forwardBuilder: (
             BuildContext context,
             Animation<double> animation,
-            Widget child,
+            Widget? child,
           ) {
             return ScaleTransition(
               scale: animation,
@@ -103,7 +99,7 @@
           reverseBuilder: (
             BuildContext context,
             Animation<double> animation,
-            Widget child,
+            Widget? child,
           ) {
             return FadeTransition(
               opacity: Tween<double>(begin: 1.0, end: 0.0).animate(animation),
@@ -150,12 +146,12 @@
       duration: const Duration(milliseconds: 300),
     );
     await tester.pumpWidget(Center(
-      child: dual_transition_builder.DualTransitionBuilder(
+      child: DualTransitionBuilder(
         animation: controller,
         forwardBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return ScaleTransition(
             scale: animation,
@@ -165,7 +161,7 @@
         reverseBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return FadeTransition(
             opacity: Tween<double>(begin: 1.0, end: 0.0).animate(animation),
@@ -216,12 +212,12 @@
       duration: const Duration(milliseconds: 300),
     );
     await tester.pumpWidget(Center(
-      child: dual_transition_builder.DualTransitionBuilder(
+      child: DualTransitionBuilder(
         animation: controller,
         forwardBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return ScaleTransition(
             scale: animation,
@@ -231,7 +227,7 @@
         reverseBuilder: (
           BuildContext context,
           Animation<double> animation,
-          Widget child,
+          Widget? child,
         ) {
           return FadeTransition(
             opacity: Tween<double>(begin: 1.0, end: 0.0).animate(animation),
@@ -286,7 +282,7 @@
 }
 
 class _StatefulTestWidget extends StatefulWidget {
-  const _StatefulTestWidget({Key key, this.name}) : super(key: key);
+  const _StatefulTestWidget({Key? key, required this.name}) : super(key: key);
 
   final String name;
 
diff --git a/packages/animations/test/fade_scale_transition_test.dart b/packages/animations/test/fade_scale_transition_test.dart
index d25d18e..f87d182 100644
--- a/packages/animations/test/fade_scale_transition_test.dart
+++ b/packages/animations/test/fade_scale_transition_test.dart
@@ -455,7 +455,7 @@
     matching: find.byType(FadeTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final FadeTransition transition = widget;
+    final FadeTransition transition = widget as FadeTransition;
     return a * transition.opacity.value;
   });
 }
@@ -466,18 +466,18 @@
     matching: find.byType(ScaleTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final ScaleTransition transition = widget;
+    final ScaleTransition transition = widget as ScaleTransition;
     return a * transition.scale.value;
   });
 }
 
 class _FlutterLogoModal extends StatefulWidget {
   const _FlutterLogoModal({
-    Key key,
+    Key? key,
     this.name,
   }) : super(key: key);
 
-  final String name;
+  final String? name;
 
   @override
   _FlutterLogoModalState createState() => _FlutterLogoModalState();
diff --git a/packages/animations/test/fade_through_transition_test.dart b/packages/animations/test/fade_through_transition_test.dart
index 551d403..26f8934 100644
--- a/packages/animations/test/fade_through_transition_test.dart
+++ b/packages/animations/test/fade_through_transition_test.dart
@@ -47,7 +47,7 @@
     expect(_getOpacity(bottomRoute, tester), 1.0);
     expect(find.text(topRoute), findsNothing);
 
-    navigator.currentState.pushNamed(topRoute);
+    navigator.currentState!.pushNamed(topRoute);
     await tester.pump();
     await tester.pump();
 
@@ -127,7 +127,7 @@
         navigatorKey: navigator,
       ),
     );
-    navigator.currentState.pushNamed('/a');
+    navigator.currentState!.pushNamed('/a');
     await tester.pumpAndSettle();
 
     expect(find.text(topRoute), findsOneWidget);
@@ -135,7 +135,7 @@
     expect(_getOpacity(topRoute, tester), 1.0);
     expect(find.text(bottomRoute), findsNothing);
 
-    navigator.currentState.pop();
+    navigator.currentState!.pop();
     await tester.pump();
 
     // Top route is full size and fully visible.
@@ -223,7 +223,7 @@
     expect(find.text(bottomRoute), findsOneWidget);
     expect(find.text(topRoute), findsNothing);
 
-    navigator.currentState.pushNamed(topRoute);
+    navigator.currentState!.pushNamed(topRoute);
     await tester.pump();
 
     // Jump to halfway point of transition.
@@ -242,7 +242,7 @@
     expect(topOpacity, lessThan(1.0));
 
     // Interrupt the transition with a pop.
-    navigator.currentState.pop();
+    navigator.currentState!.pop();
     await tester.pump();
     // Noting changed.
     expect(find.text(bottomRoute), findsOneWidget);
@@ -288,7 +288,7 @@
         navigatorKey: navigator,
         contentBuilder: (RouteSettings settings) {
           return _StatefulTestWidget(
-            key: ValueKey<String>(settings.name),
+            key: ValueKey<String?>(settings.name),
             name: settings.name,
           );
         },
@@ -296,73 +296,73 @@
     );
 
     final _StatefulTestWidgetState bottomState =
-        tester.state(find.byKey(const ValueKey<String>(bottomRoute)));
+        tester.state(find.byKey(const ValueKey<String?>(bottomRoute)));
     expect(bottomState.widget.name, bottomRoute);
 
-    navigator.currentState.pushNamed(topRoute);
+    navigator.currentState!.pushNamed(topRoute);
     await tester.pump();
     await tester.pump();
 
     expect(
-      tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
       bottomState,
     );
     final _StatefulTestWidgetState topState = tester.state(
-      find.byKey(const ValueKey<String>(topRoute)),
+      find.byKey(const ValueKey<String?>(topRoute)),
     );
     expect(topState.widget.name, topRoute);
 
     await tester.pump(const Duration(milliseconds: 150));
     expect(
-      tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
       bottomState,
     );
     expect(
-      tester.state(find.byKey(const ValueKey<String>(topRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(topRoute))),
       topState,
     );
 
     await tester.pumpAndSettle();
     expect(
       tester.state(find.byKey(
-        const ValueKey<String>(bottomRoute),
+        const ValueKey<String?>(bottomRoute),
         skipOffstage: false,
       )),
       bottomState,
     );
     expect(
-      tester.state(find.byKey(const ValueKey<String>(topRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(topRoute))),
       topState,
     );
 
-    navigator.currentState.pop();
+    navigator.currentState!.pop();
     await tester.pump();
 
     expect(
-      tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
       bottomState,
     );
     expect(
-      tester.state(find.byKey(const ValueKey<String>(topRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(topRoute))),
       topState,
     );
 
     await tester.pump(const Duration(milliseconds: 150));
     expect(
-      tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
       bottomState,
     );
     expect(
-      tester.state(find.byKey(const ValueKey<String>(topRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(topRoute))),
       topState,
     );
 
     await tester.pumpAndSettle();
     expect(
-      tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+      tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
       bottomState,
     );
-    expect(find.byKey(const ValueKey<String>(topRoute)), findsNothing);
+    expect(find.byKey(const ValueKey<String?>(topRoute)), findsNothing);
   });
 
   testWidgets('should keep state', (WidgetTester tester) async {
@@ -433,22 +433,22 @@
 
 double _getOpacity(String key, WidgetTester tester) {
   final Finder finder = find.ancestor(
-    of: find.byKey(ValueKey<String>(key)),
+    of: find.byKey(ValueKey<String?>(key)),
     matching: find.byType(FadeTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final FadeTransition transition = widget;
+    final FadeTransition transition = widget as FadeTransition;
     return a * transition.opacity.value;
   });
 }
 
 double _getScale(String key, WidgetTester tester) {
   final Finder finder = find.ancestor(
-    of: find.byKey(ValueKey<String>(key)),
+    of: find.byKey(ValueKey<String?>(key)),
     matching: find.byType(ScaleTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final ScaleTransition transition = widget;
+    final ScaleTransition transition = widget as ScaleTransition;
     return a * transition.scale.value;
   });
 }
@@ -456,13 +456,13 @@
 class _TestWidget extends StatelessWidget {
   const _TestWidget({this.navigatorKey, this.contentBuilder});
 
-  final Key navigatorKey;
-  final _ContentBuilder contentBuilder;
+  final Key? navigatorKey;
+  final _ContentBuilder? contentBuilder;
 
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
-      navigatorKey: navigatorKey,
+      navigatorKey: navigatorKey as GlobalKey<NavigatorState>?,
       theme: ThemeData(
         platform: TargetPlatform.android,
         pageTransitionsTheme: const PageTransitionsTheme(
@@ -476,11 +476,11 @@
           settings: settings,
           builder: (BuildContext context) {
             return contentBuilder != null
-                ? contentBuilder(settings)
+                ? contentBuilder!(settings)
                 : Container(
                     child: Center(
-                      key: ValueKey<String>(settings.name),
-                      child: Text(settings.name),
+                      key: ValueKey<String?>(settings.name),
+                      child: Text(settings.name!),
                     ),
                   );
           },
@@ -491,9 +491,9 @@
 }
 
 class _StatefulTestWidget extends StatefulWidget {
-  const _StatefulTestWidget({Key key, this.name}) : super(key: key);
+  const _StatefulTestWidget({Key? key, this.name}) : super(key: key);
 
-  final String name;
+  final String? name;
 
   @override
   State<_StatefulTestWidget> createState() => _StatefulTestWidgetState();
@@ -502,7 +502,7 @@
 class _StatefulTestWidgetState extends State<_StatefulTestWidget> {
   @override
   Widget build(BuildContext context) {
-    return Text(widget.name);
+    return Text(widget.name!);
   }
 }
 
diff --git a/packages/animations/test/modal_test.dart b/packages/animations/test/modal_test.dart
index f9b644c..fdaf10c 100644
--- a/packages/animations/test/modal_test.dart
+++ b/packages/animations/test/modal_test.dart
@@ -464,7 +464,7 @@
     matching: find.byType(FadeTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final FadeTransition transition = widget;
+    final FadeTransition transition = widget as FadeTransition;
     return a * transition.opacity.value;
   });
 }
@@ -475,18 +475,18 @@
     matching: find.byType(ScaleTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final ScaleTransition transition = widget;
+    final ScaleTransition transition = widget as ScaleTransition;
     return a * transition.scale.value;
   });
 }
 
 class _FlutterLogoModal extends StatefulWidget {
   const _FlutterLogoModal({
-    Key key,
+    Key? key,
     this.name,
   }) : super(key: key);
 
-  final String name;
+  final String? name;
 
   @override
   _FlutterLogoModalState createState() => _FlutterLogoModalState();
@@ -516,8 +516,7 @@
     String barrierLabel = 'customLabel',
     Duration transitionDuration = const Duration(milliseconds: 300),
     Duration reverseTransitionDuration = const Duration(milliseconds: 200),
-  })  : assert(barrierDismissible != null),
-        super(
+  }) : super(
           barrierColor: barrierColor,
           barrierDismissible: barrierDismissible,
           barrierLabel: barrierLabel,
diff --git a/packages/animations/test/open_container_test.dart b/packages/animations/test/open_container_test.dart
index e276f45..3ab05f2 100644
--- a/packages/animations/test/open_container_test.dart
+++ b/packages/animations/test/open_container_test.dart
@@ -44,7 +44,7 @@
           matching: find.byType(Material),
         ),
       );
-      final Material srcMaterial = srcMaterialElement.widget;
+      final Material srcMaterial = srcMaterialElement.widget as Material;
       expect(srcMaterial.color, Colors.green);
       expect(srcMaterial.elevation, 4.0);
       expect(srcMaterial.shape, shape);
@@ -69,7 +69,7 @@
           matching: find.byType(Material),
         ),
       );
-      final Material closedMaterial = destMaterialElement.widget;
+      final Material closedMaterial = destMaterialElement.widget as Material;
       expect(closedMaterial.color, Colors.green);
       expect(closedMaterial.elevation, 4.0);
       expect(closedMaterial.shape, shape);
@@ -90,7 +90,7 @@
       // Jump to the start of the fade in.
       await tester.pump(const Duration(milliseconds: 60)); // 300ms * 1/5 = 60ms
       final _TrackedData dataPreFade = _TrackedData(
-        destMaterialElement.widget,
+        destMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == destMaterialElement),
         ),
@@ -107,7 +107,7 @@
       await tester
           .pump(const Duration(milliseconds: 30)); // 300ms * 3/10 = 90ms
       final _TrackedData dataMidFadeIn = _TrackedData(
-        destMaterialElement.widget,
+        destMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == destMaterialElement),
         ),
@@ -128,7 +128,7 @@
       ); // 300ms * 2/5 = 120ms
 
       final _TrackedData dataPostFadeIn = _TrackedData(
-        destMaterialElement.widget,
+        destMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == destMaterialElement),
         ),
@@ -144,7 +144,7 @@
       // Jump almost to the end of the transition.
       await tester.pump(const Duration(milliseconds: 180));
       final _TrackedData dataTransitionDone = _TrackedData(
-        destMaterialElement.widget,
+        destMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == destMaterialElement),
         ),
@@ -170,7 +170,7 @@
         ),
       );
       final _TrackedData dataOpen = _TrackedData(
-        finalMaterialElement.widget,
+        finalMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == finalMaterialElement),
         ),
@@ -221,7 +221,7 @@
         ),
       );
       final _TrackedData dataOpen = _TrackedData(
-        initialMaterialElement.widget,
+        initialMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == initialMaterialElement),
         ),
@@ -245,7 +245,7 @@
         ),
       );
       final _TrackedData dataTransitionStart = _TrackedData(
-        materialElement.widget,
+        materialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == materialElement),
         ),
@@ -261,7 +261,7 @@
       // Jump to start of fade out: 1/5 of 300.
       await tester.pump(const Duration(milliseconds: 60)); // 300 * 1/5 = 60
       final _TrackedData dataPreFadeOut = _TrackedData(
-        materialElement.widget,
+        materialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == materialElement),
         ),
@@ -277,7 +277,7 @@
       // Jump to the middle of the fade out.
       await tester.pump(const Duration(milliseconds: 30)); // 300 * 3/10 = 90
       final _TrackedData dataMidpoint = _TrackedData(
-        materialElement.widget,
+        materialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == materialElement),
         ),
@@ -295,7 +295,7 @@
       // Jump to the end of the fade out.
       await tester.pump(const Duration(milliseconds: 30)); // 300 * 2/5 = 120
       final _TrackedData dataPostFadeOut = _TrackedData(
-        materialElement.widget,
+        materialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == materialElement),
         ),
@@ -311,7 +311,7 @@
       // Jump almost to the end of the transition.
       await tester.pump(const Duration(milliseconds: 180));
       final _TrackedData dataTransitionDone = _TrackedData(
-        materialElement.widget,
+        materialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == materialElement),
         ),
@@ -337,7 +337,7 @@
         ),
       );
       final _TrackedData dataClosed = _TrackedData(
-        finalMaterialElement.widget,
+        finalMaterialElement.widget as Material,
         tester.getRect(
           find.byElementPredicate((Element e) => e == finalMaterialElement),
         ),
@@ -388,7 +388,7 @@
         matching: find.byType(Material),
       ),
     );
-    final Material srcMaterial = srcMaterialElement.widget;
+    final Material srcMaterial = srcMaterialElement.widget as Material;
     expect(srcMaterial.color, Colors.green);
     expect(srcMaterial.elevation, 4.0);
     expect(srcMaterial.shape, shape);
@@ -413,7 +413,7 @@
         matching: find.byType(Material),
       ),
     );
-    final Material closedMaterial = destMaterialElement.widget;
+    final Material closedMaterial = destMaterialElement.widget as Material;
     expect(closedMaterial.color, Colors.green);
     expect(closedMaterial.elevation, 4.0);
     expect(closedMaterial.shape, shape);
@@ -434,7 +434,7 @@
     // The fade-out takes 1/5 of 300ms. Let's jump to the midpoint of that.
     await tester.pump(const Duration(milliseconds: 30)); // 300ms * 1/10 = 30ms
     final _TrackedData dataMidFadeOut = _TrackedData(
-      destMaterialElement.widget,
+      destMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == destMaterialElement),
       ),
@@ -452,7 +452,7 @@
     // Let's jump to the crossover point at 1/5 of 300ms.
     await tester.pump(const Duration(milliseconds: 30)); // 300ms * 1/5 = 60ms
     final _TrackedData dataMidpoint = _TrackedData(
-      destMaterialElement.widget,
+      destMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == destMaterialElement),
       ),
@@ -469,7 +469,7 @@
     // Let's jump to the middle of the fade-in at 3/5 of 300ms
     await tester.pump(const Duration(milliseconds: 120)); // 300ms * 3/5 = 180ms
     final _TrackedData dataMidFadeIn = _TrackedData(
-      destMaterialElement.widget,
+      destMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == destMaterialElement),
       ),
@@ -487,7 +487,7 @@
     // Let's jump almost to the end of the transition.
     await tester.pump(const Duration(milliseconds: 120));
     final _TrackedData dataTransitionDone = _TrackedData(
-      destMaterialElement.widget,
+      destMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == destMaterialElement),
       ),
@@ -518,7 +518,7 @@
       ),
     );
     final _TrackedData dataOpen = _TrackedData(
-      finalMaterialElement.widget,
+      finalMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == finalMaterialElement),
       ),
@@ -567,7 +567,7 @@
       ),
     );
     final _TrackedData dataOpen = _TrackedData(
-      initialMaterialElement.widget,
+      initialMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == initialMaterialElement),
       ),
@@ -591,7 +591,7 @@
       ),
     );
     final _TrackedData dataTransitionStart = _TrackedData(
-      materialElement.widget,
+      materialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == materialElement),
       ),
@@ -606,7 +606,7 @@
     // Jump to mid-point of fade-out: 1/10 of 300ms.
     await tester.pump(const Duration(milliseconds: 30)); // 300ms * 1/10 = 30ms
     final _TrackedData dataMidFadeOut = _TrackedData(
-      materialElement.widget,
+      materialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == materialElement),
       ),
@@ -627,7 +627,7 @@
     // Let's jump to the crossover point at 1/5 of 300ms.
     await tester.pump(const Duration(milliseconds: 30)); // 300ms * 1/5 = 60ms
     final _TrackedData dataMidpoint = _TrackedData(
-      materialElement.widget,
+      materialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == materialElement),
       ),
@@ -644,7 +644,7 @@
     // Let's jump to the middle of the fade-in at 3/5 of 300ms
     await tester.pump(const Duration(milliseconds: 120)); // 300ms * 3/5 = 180ms
     final _TrackedData dataMidFadeIn = _TrackedData(
-      materialElement.widget,
+      materialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == materialElement),
       ),
@@ -662,7 +662,7 @@
     // Let's jump almost to the end of the transition.
     await tester.pump(const Duration(milliseconds: 120));
     final _TrackedData dataTransitionDone = _TrackedData(
-      materialElement.widget,
+      materialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == materialElement),
       ),
@@ -692,7 +692,7 @@
       ),
     );
     final _TrackedData dataClosed = _TrackedData(
-      finalMaterialElement.widget,
+      finalMaterialElement.widget as Material,
       tester.getRect(
         find.byElementPredicate((Element e) => e == finalMaterialElement),
       ),
@@ -731,7 +731,7 @@
   });
 
   testWidgets('Action callbacks work', (WidgetTester tester) async {
-    VoidCallback open, close;
+    late VoidCallback open, close;
     await tester.pumpWidget(_boilerplate(
       child: Center(
         child: OpenContainer(
@@ -805,7 +805,7 @@
   });
 
   testWidgets('closed widget keeps state', (WidgetTester tester) async {
-    VoidCallback open;
+    late VoidCallback open;
     await tester.pumpWidget(_boilerplate(
       child: Center(
         child: OpenContainer(
@@ -1530,9 +1530,9 @@
   testWidgets(
       'onClosed callback receives popped value when container has closed',
       (WidgetTester tester) async {
-    bool value = false;
+    bool? value = false;
     final Widget openContainer = OpenContainer<bool>(
-      onClosed: (bool poppedValue) {
+      onClosed: (bool? poppedValue) {
         value = poppedValue;
       },
       closedBuilder: (BuildContext context, VoidCallback action) {
@@ -1573,9 +1573,9 @@
   });
 
   Widget _createRootNavigatorTest({
-    @required Key appKey,
-    @required Key nestedNavigatorKey,
-    @required bool useRootNavigator,
+    required Key appKey,
+    required Key nestedNavigatorKey,
+    required bool useRootNavigator,
   }) {
     return Center(
       child: SizedBox(
@@ -1729,7 +1729,7 @@
       // equal to the RouteSettings passed to the OpenContainer
       final ModalRoute<dynamic> modalRoute = ModalRoute.of(
         tester.element(find.text('Open')),
-      );
+      )!;
       expect(modalRoute.settings, routeSettings);
     },
   );
@@ -1781,9 +1781,9 @@
 }
 
 void _expectMaterialPropertiesHaveAdvanced({
-  @required _TrackedData biggerMaterial,
-  @required _TrackedData smallerMaterial,
-  @required WidgetTester tester,
+  required _TrackedData biggerMaterial,
+  required _TrackedData smallerMaterial,
+  required WidgetTester tester,
 }) {
   expect(
     biggerMaterial.material.elevation,
@@ -1814,15 +1814,16 @@
 }
 
 double _getRadius(Material material) {
-  final RoundedRectangleBorder shape = material.shape;
+  final RoundedRectangleBorder? shape =
+      material.shape as RoundedRectangleBorder?;
   if (shape == null) {
     return 0.0;
   }
-  final BorderRadius radius = shape.borderRadius;
+  final BorderRadius radius = shape.borderRadius as BorderRadius;
   return radius.topRight.x;
 }
 
-Widget _boilerplate({@required Widget child}) {
+Widget _boilerplate({required Widget child}) {
   return MaterialApp(
     home: Scaffold(
       body: child,
@@ -1831,7 +1832,7 @@
 }
 
 class _SizableContainer extends StatefulWidget {
-  const _SizableContainer({this.initialSize, this.child});
+  const _SizableContainer({required this.initialSize, required this.child});
 
   final double initialSize;
   final Widget child;
@@ -1842,7 +1843,7 @@
 }
 
 class _SizableContainerState extends State<_SizableContainer> {
-  _SizableContainerState({double size}) : _size = size;
+  _SizableContainerState({required double size}) : _size = size;
 
   double get size => _size;
   double _size;
diff --git a/packages/animations/test/page_transition_switcher_test.dart b/packages/animations/test/page_transition_switcher_test.dart
index f515443..62c610c 100644
--- a/packages/animations/test/page_transition_switcher_test.dart
+++ b/packages/animations/test/page_transition_switcher_test.dart
@@ -585,7 +585,7 @@
 }
 
 class StatefulTestWidget extends StatefulWidget {
-  const StatefulTestWidget({Key key}) : super(key: key);
+  const StatefulTestWidget({Key? key}) : super(key: key);
 
   @override
   StatefulTestWidgetState createState() => StatefulTestWidgetState();
diff --git a/packages/animations/test/shared_axis_transition_test.dart b/packages/animations/test/shared_axis_transition_test.dart
index 687d942..71272d6 100644
--- a/packages/animations/test/shared_axis_transition_test.dart
+++ b/packages/animations/test/shared_axis_transition_test.dart
@@ -63,7 +63,7 @@
         expect(_getOpacity(bottomRoute, tester), 1.0);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
@@ -103,7 +103,7 @@
         // Top route is still invisible, but moving towards the left.
         expect(find.text(topRoute), findsOneWidget);
         expect(_getOpacity(topRoute, tester), 0.0);
-        double topOffset = _getTranslationOffset(
+        double? topOffset = _getTranslationOffset(
           topRoute,
           tester,
           SharedAxisTransitionType.horizontal,
@@ -174,7 +174,7 @@
           ),
         );
 
-        navigator.currentState.pushNamed('/a');
+        navigator.currentState!.pushNamed('/a');
         await tester.pumpAndSettle();
 
         expect(find.text(topRoute), findsOneWidget);
@@ -189,7 +189,7 @@
         expect(_getOpacity(topRoute, tester), 1.0);
         expect(find.text(bottomRoute), findsNothing);
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Top route is is not offset and fully visible.
@@ -228,7 +228,7 @@
         expect(find.text(bottomRoute), findsOneWidget);
         expect(_getOpacity(bottomRoute, tester),
             moreOrLessEquals(0, epsilon: 0.005));
-        double bottomOffset = _getTranslationOffset(
+        double? bottomOffset = _getTranslationOffset(
           bottomRoute,
           tester,
           SharedAxisTransitionType.horizontal,
@@ -300,7 +300,7 @@
         expect(find.text(bottomRoute), findsOneWidget);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
 
         // Jump to halfway point of transition.
@@ -308,7 +308,7 @@
         // Bottom route is fully faded out.
         expect(find.text(bottomRoute), findsOneWidget);
         expect(_getOpacity(bottomRoute, tester), 0.0);
-        final double halfwayBottomOffset = _getTranslationOffset(
+        final double? halfwayBottomOffset = _getTranslationOffset(
           bottomRoute,
           tester,
           SharedAxisTransitionType.horizontal,
@@ -318,7 +318,7 @@
 
         // Top route is fading/coming in.
         expect(find.text(topRoute), findsOneWidget);
-        final double halfwayTopOffset = _getTranslationOffset(
+        final double? halfwayTopOffset = _getTranslationOffset(
           topRoute,
           tester,
           SharedAxisTransitionType.horizontal,
@@ -330,7 +330,7 @@
         expect(halfwayTopOpacity, lessThan(1.0));
 
         // Interrupt the transition with a pop.
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Nothing should change.
@@ -426,8 +426,8 @@
             navigatorKey: navigator,
             contentBuilder: (RouteSettings settings) {
               return _StatefulTestWidget(
-                key: ValueKey<String>(settings.name),
-                name: settings.name,
+                key: ValueKey<String?>(settings.name),
+                name: settings.name!,
               );
             },
             transitionType: SharedAxisTransitionType.horizontal,
@@ -435,74 +435,74 @@
         );
 
         final _StatefulTestWidgetState bottomState = tester.state(
-          find.byKey(const ValueKey<String>(bottomRoute)),
+          find.byKey(const ValueKey<String?>(bottomRoute)),
         );
         expect(bottomState.widget.name, bottomRoute);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         final _StatefulTestWidgetState topState = tester.state(
-          find.byKey(const ValueKey<String>(topRoute)),
+          find.byKey(const ValueKey<String?>(topRoute)),
         );
         expect(topState.widget.name, topRoute);
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
           tester.state(find.byKey(
-            const ValueKey<String>(bottomRoute),
+            const ValueKey<String?>(bottomRoute),
             skipOffstage: false,
           )),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
-        expect(find.byKey(const ValueKey<String>(topRoute)), findsNothing);
+        expect(find.byKey(const ValueKey<String?>(topRoute)), findsNothing);
       },
     );
 
@@ -525,21 +525,21 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color,
           defaultFillColor);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -564,20 +564,20 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color, Colors.green);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -704,7 +704,7 @@
         expect(_getOpacity(bottomRoute, tester), 1.0);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
@@ -744,7 +744,7 @@
         // Top route is still invisible, but moving up.
         expect(find.text(topRoute), findsOneWidget);
         expect(_getOpacity(topRoute, tester), 0.0);
-        double topOffset = _getTranslationOffset(
+        double? topOffset = _getTranslationOffset(
           topRoute,
           tester,
           SharedAxisTransitionType.vertical,
@@ -815,7 +815,7 @@
           ),
         );
 
-        navigator.currentState.pushNamed('/a');
+        navigator.currentState!.pushNamed('/a');
         await tester.pumpAndSettle();
 
         expect(find.text(topRoute), findsOneWidget);
@@ -830,7 +830,7 @@
         expect(_getOpacity(topRoute, tester), 1.0);
         expect(find.text(bottomRoute), findsNothing);
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Top route is is not offset and fully visible.
@@ -871,7 +871,7 @@
           _getOpacity(bottomRoute, tester),
           moreOrLessEquals(0, epsilon: 0.005),
         );
-        double bottomOffset = _getTranslationOffset(
+        double? bottomOffset = _getTranslationOffset(
           bottomRoute,
           tester,
           SharedAxisTransitionType.vertical,
@@ -943,7 +943,7 @@
         expect(find.text(bottomRoute), findsOneWidget);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
 
         // Jump to halfway point of transition.
@@ -951,7 +951,7 @@
         // Bottom route is fully faded out.
         expect(find.text(bottomRoute), findsOneWidget);
         expect(_getOpacity(bottomRoute, tester), 0.0);
-        final double halfwayBottomOffset = _getTranslationOffset(
+        final double? halfwayBottomOffset = _getTranslationOffset(
           bottomRoute,
           tester,
           SharedAxisTransitionType.vertical,
@@ -961,7 +961,7 @@
 
         // Top route is fading/coming in.
         expect(find.text(topRoute), findsOneWidget);
-        final double halfwayTopOffset = _getTranslationOffset(
+        final double? halfwayTopOffset = _getTranslationOffset(
           topRoute,
           tester,
           SharedAxisTransitionType.vertical,
@@ -973,7 +973,7 @@
         expect(halfwayTopOpacity, lessThan(1.0));
 
         // Interrupt the transition with a pop.
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Nothing should change.
@@ -1069,8 +1069,8 @@
             navigatorKey: navigator,
             contentBuilder: (RouteSettings settings) {
               return _StatefulTestWidget(
-                key: ValueKey<String>(settings.name),
-                name: settings.name,
+                key: ValueKey<String?>(settings.name),
+                name: settings.name!,
               );
             },
             transitionType: SharedAxisTransitionType.vertical,
@@ -1078,74 +1078,74 @@
         );
 
         final _StatefulTestWidgetState bottomState = tester.state(
-          find.byKey(const ValueKey<String>(bottomRoute)),
+          find.byKey(const ValueKey<String?>(bottomRoute)),
         );
         expect(bottomState.widget.name, bottomRoute);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         final _StatefulTestWidgetState topState = tester.state(
-          find.byKey(const ValueKey<String>(topRoute)),
+          find.byKey(const ValueKey<String?>(topRoute)),
         );
         expect(topState.widget.name, topRoute);
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
           tester.state(find.byKey(
-            const ValueKey<String>(bottomRoute),
+            const ValueKey<String?>(bottomRoute),
             skipOffstage: false,
           )),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
-        expect(find.byKey(const ValueKey<String>(topRoute)), findsNothing);
+        expect(find.byKey(const ValueKey<String?>(topRoute)), findsNothing);
       },
     );
 
@@ -1168,21 +1168,21 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color,
           defaultFillColor);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -1207,20 +1207,20 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color, Colors.green);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -1340,7 +1340,7 @@
         expect(_getOpacity(bottomRoute, tester), 1.0);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
@@ -1413,7 +1413,7 @@
           ),
         );
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pumpAndSettle();
 
         expect(find.text(topRoute), findsOneWidget);
@@ -1421,7 +1421,7 @@
         expect(_getOpacity(topRoute, tester), 1.0);
         expect(find.text(bottomRoute), findsNothing);
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Top route is full size and fully visible.
@@ -1498,7 +1498,7 @@
         expect(find.text(bottomRoute), findsOneWidget);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
 
         // Jump to halfway point of transition.
@@ -1520,7 +1520,7 @@
         expect(halfwayTopOpacity, lessThan(1.0));
 
         // Interrupt the transition with a pop.
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         // Nothing should change.
@@ -1571,7 +1571,7 @@
         expect(find.text(bottomRoute), findsOneWidget);
         expect(find.text(topRoute), findsNothing);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
 
         // Jump to halfway point of transition.
@@ -1606,82 +1606,82 @@
             transitionType: SharedAxisTransitionType.scaled,
             contentBuilder: (RouteSettings settings) {
               return _StatefulTestWidget(
-                key: ValueKey<String>(settings.name),
-                name: settings.name,
+                key: ValueKey<String?>(settings.name),
+                name: settings.name!,
               );
             },
           ),
         );
 
         final _StatefulTestWidgetState bottomState = tester.state(
-          find.byKey(const ValueKey<String>(bottomRoute)),
+          find.byKey(const ValueKey<String?>(bottomRoute)),
         );
         expect(bottomState.widget.name, bottomRoute);
 
-        navigator.currentState.pushNamed(topRoute);
+        navigator.currentState!.pushNamed(topRoute);
         await tester.pump();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         final _StatefulTestWidgetState topState = tester.state(
-          find.byKey(const ValueKey<String>(topRoute)),
+          find.byKey(const ValueKey<String?>(topRoute)),
         );
         expect(topState.widget.name, topRoute);
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
           tester.state(find.byKey(
-            const ValueKey<String>(bottomRoute),
+            const ValueKey<String?>(bottomRoute),
             skipOffstage: false,
           )),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
-        navigator.currentState.pop();
+        navigator.currentState!.pop();
         await tester.pump();
 
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pump(const Duration(milliseconds: 150));
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
         expect(
-          tester.state(find.byKey(const ValueKey<String>(topRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(topRoute))),
           topState,
         );
 
         await tester.pumpAndSettle();
         expect(
-          tester.state(find.byKey(const ValueKey<String>(bottomRoute))),
+          tester.state(find.byKey(const ValueKey<String?>(bottomRoute))),
           bottomState,
         );
-        expect(find.byKey(const ValueKey<String>(topRoute)), findsNothing);
+        expect(find.byKey(const ValueKey<String?>(topRoute)), findsNothing);
       },
     );
 
@@ -1704,21 +1704,21 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color,
           defaultFillColor);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -1743,20 +1743,20 @@
       Finder fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/')),
+            of: find.byKey(const ValueKey<String?>('/')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
       expect(tester.widget<Container>(fillContainerFinder).color, Colors.green);
 
-      navigator.currentState.pushNamed(topRoute);
+      navigator.currentState!.pushNamed(topRoute);
       await tester.pump();
       await tester.pumpAndSettle();
 
       fillContainerFinder = find
           .ancestor(
             matching: find.byType(Container),
-            of: find.byKey(const ValueKey<String>('/a')),
+            of: find.byKey(const ValueKey<String?>('/a')),
           )
           .last;
       expect(fillContainerFinder, findsOneWidget);
@@ -1833,22 +1833,22 @@
 
 double _getOpacity(String key, WidgetTester tester) {
   final Finder finder = find.ancestor(
-    of: find.byKey(ValueKey<String>(key)),
+    of: find.byKey(ValueKey<String?>(key)),
     matching: find.byType(FadeTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final FadeTransition transition = widget;
+    final FadeTransition transition = widget as FadeTransition;
     return a * transition.opacity.value;
   });
 }
 
-double _getTranslationOffset(
+double? _getTranslationOffset(
   String key,
   WidgetTester tester,
   SharedAxisTransitionType transitionType,
 ) {
   final Finder finder = find.ancestor(
-    of: find.byKey(ValueKey<String>(key)),
+    of: find.byKey(ValueKey<String?>(key)),
     matching: find.byType(Transform),
   );
 
@@ -1856,56 +1856,52 @@
     case SharedAxisTransitionType.horizontal:
       return tester.widgetList<Transform>(finder).fold<double>(0.0,
           (double a, Widget widget) {
-        final Transform transition = widget;
+        final Transform transition = widget as Transform;
         final Vector3 translation = transition.transform.getTranslation();
         return a + translation.x;
       });
-      break;
     case SharedAxisTransitionType.vertical:
       return tester.widgetList<Transform>(finder).fold<double>(0.0,
           (double a, Widget widget) {
-        final Transform transition = widget;
+        final Transform transition = widget as Transform;
         final Vector3 translation = transition.transform.getTranslation();
         return a + translation.y;
       });
-      break;
     case SharedAxisTransitionType.scaled:
       // SharedAxisTransitionType.scaled should not return a translation
       // offset.
       return null;
-      break;
   }
-  return null; // unreachable
 }
 
 double _getScale(String key, WidgetTester tester) {
   final Finder finder = find.ancestor(
-    of: find.byKey(ValueKey<String>(key)),
+    of: find.byKey(ValueKey<String?>(key)),
     matching: find.byType(ScaleTransition),
   );
   return tester.widgetList(finder).fold<double>(1.0, (double a, Widget widget) {
-    final ScaleTransition transition = widget;
+    final ScaleTransition transition = widget as ScaleTransition;
     return a * transition.scale.value;
   });
 }
 
 class _TestWidget extends StatelessWidget {
   const _TestWidget({
-    this.navigatorKey,
+    required this.navigatorKey,
     this.contentBuilder,
-    this.transitionType,
+    required this.transitionType,
     this.fillColor,
   });
 
   final Key navigatorKey;
-  final _ContentBuilder contentBuilder;
+  final _ContentBuilder? contentBuilder;
   final SharedAxisTransitionType transitionType;
-  final Color fillColor;
+  final Color? fillColor;
 
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
-      navigatorKey: navigatorKey,
+      navigatorKey: navigatorKey as GlobalKey<NavigatorState>?,
       theme: ThemeData(
         platform: TargetPlatform.android,
         pageTransitionsTheme: PageTransitionsTheme(
@@ -1922,11 +1918,11 @@
           settings: settings,
           builder: (BuildContext context) {
             return contentBuilder != null
-                ? contentBuilder(settings)
+                ? contentBuilder!(settings)
                 : Container(
                     child: Center(
-                      key: ValueKey<String>(settings.name),
-                      child: Text(settings.name),
+                      key: ValueKey<String?>(settings.name),
+                      child: Text(settings.name!),
                     ),
                   );
           },
@@ -1937,7 +1933,7 @@
 }
 
 class _StatefulTestWidget extends StatefulWidget {
-  const _StatefulTestWidget({Key key, this.name}) : super(key: key);
+  const _StatefulTestWidget({Key? key, required this.name}) : super(key: key);
 
   final String name;
 
diff --git a/script/check_publish.sh b/script/check_publish.sh
index c12b776..321d591 100755
--- a/script/check_publish.sh
+++ b/script/check_publish.sh
@@ -15,7 +15,7 @@
   for package_name in "$@"; do
     local dir="$REPO_DIR/packages/$package_name"
     echo "Checking that $package_name can be published."
-    if (cd "$dir" && pub publish --dry-run > /dev/null); then
+    if (cd "$dir" && flutter pub publish --dry-run > /dev/null); then
       echo "Package $package_name is able to be published."
     else
       error "Unable to publish $package_name"
@@ -36,4 +36,4 @@
 
 if [[ "${#CHANGED_PACKAGE_LIST[@]}" != 0 ]]; then
   check_publish "${CHANGED_PACKAGE_LIST[@]}"
-fi
\ No newline at end of file
+fi