Migrate Flutter Gallery test to null safety (#70116)

diff --git a/dev/benchmarks/microbenchmarks/pubspec.yaml b/dev/benchmarks/microbenchmarks/pubspec.yaml
index 8399399..df46d24 100644
--- a/dev/benchmarks/microbenchmarks/pubspec.yaml
+++ b/dev/benchmarks/microbenchmarks/pubspec.yaml
@@ -29,15 +29,13 @@
   coverage: 0.14.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  dart_style: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   fake_async: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   html: 0.14.0+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http: 0.12.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http_multi_server: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http_parser: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  intl: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  intl_translation: 0.17.10+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  intl: 0.17.0-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   io: 0.3.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   isolate: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   js: 0.6.3-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -50,7 +48,6 @@
   package_config: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   path: 1.8.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   pedantic: 1.10.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  petitparser: 3.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   pool: 1.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   pub_semver: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -77,4 +74,4 @@
 flutter:
   uses-material-design: true
 
-# PUBSPEC CHECKSUM: 77af
+# PUBSPEC CHECKSUM: 2c1c
diff --git a/dev/benchmarks/test_apps/stocks/pubspec.yaml b/dev/benchmarks/test_apps/stocks/pubspec.yaml
index bc7782a..0d1bbc1 100644
--- a/dev/benchmarks/test_apps/stocks/pubspec.yaml
+++ b/dev/benchmarks/test_apps/stocks/pubspec.yaml
@@ -9,42 +9,23 @@
     sdk: flutter
   flutter_localizations:
     sdk: flutter
-  intl: 0.16.1
-  intl_translation: 0.17.10+1
+  intl: 0.17.0-nullsafety.2
   http: 0.12.2
   isolate: 2.0.3
 
-  _fe_analyzer_shared: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  analyzer: 0.39.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  args: 1.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   characters: 1.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  cli_util: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   collection: 1.15.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  dart_style: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  html: 0.14.0+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http_parser: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  js: 0.6.3-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   meta: 1.3.0-nullsafety.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  node_interop: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  node_io: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  package_config: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   path: 1.8.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   pedantic: 1.10.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  petitparser: 3.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  pub_semver: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   source_span: 1.8.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   string_scanner: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   term_glyph: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   typed_data: 1.3.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   vector_math: 2.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  watcher: 0.9.7+15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  yaml: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
 
 dev_dependencies:
   flutter_test:
@@ -53,19 +34,33 @@
     sdk: flutter
   test: 1.16.0-nullsafety.9
 
+  _fe_analyzer_shared: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  analyzer: 0.39.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   archive: 2.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  args: 1.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  cli_util: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   coverage: 0.14.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   fake_async: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   file: 6.0.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  html: 0.14.0+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http_multi_server: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   io: 0.3.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  js: 0.6.3-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   logging: 0.11.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   matcher: 0.12.10-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   mime: 0.9.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  node_interop: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  node_io: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   node_preamble: 1.4.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  package_config: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   pool: 1.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  pub_semver: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   shelf_packages_handler: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -78,11 +73,13 @@
   test_api: 0.2.19-nullsafety.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   test_core: 0.3.12-nullsafety.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   vm_service: 5.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  watcher: 0.9.7+15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   web_socket_channel: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   webdriver: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   webkit_inspection_protocol: 0.7.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  yaml: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
 
 flutter:
   uses-material-design: true
 
-# PUBSPEC CHECKSUM: b21f
+# PUBSPEC CHECKSUM: 4b8b
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/animation/home.dart b/dev/integration_tests/flutter_gallery/lib/demo/animation/home.dart
index c2bd940..e8eb5e0 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/animation/home.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/animation/home.dart
@@ -32,10 +32,10 @@
 // TODO(hansmuller): it would be worth adding something like this to the framework.
 class _RenderStatusBarPaddingSliver extends RenderSliver {
   _RenderStatusBarPaddingSliver({
-    @required double maxHeight,
-    @required double scrollFactor,
-  }) : assert(maxHeight != null && maxHeight >= 0.0),
-       assert(scrollFactor != null && scrollFactor >= 1.0),
+    required double maxHeight,
+    required double scrollFactor,
+  }) : assert(maxHeight >= 0.0),
+       assert(scrollFactor >= 1.0),
        _maxHeight = maxHeight,
        _scrollFactor = scrollFactor;
 
@@ -43,7 +43,7 @@
   double get maxHeight => _maxHeight;
   double _maxHeight;
   set maxHeight(double value) {
-    assert(maxHeight != null && maxHeight >= 0.0);
+    assert(maxHeight >= 0.0);
     if (_maxHeight == value)
       return;
     _maxHeight = value;
@@ -55,7 +55,7 @@
   double get scrollFactor => _scrollFactor;
   double _scrollFactor;
   set scrollFactor(double value) {
-    assert(scrollFactor != null && scrollFactor >= 1.0);
+    assert(scrollFactor >= 1.0);
     if (_scrollFactor == value)
       return;
     _scrollFactor = value;
@@ -64,7 +64,7 @@
 
   @override
   void performLayout() {
-    final double height = (maxHeight - constraints.scrollOffset / scrollFactor).clamp(0.0, maxHeight) as double;
+    final double height = (maxHeight - constraints.scrollOffset / scrollFactor).clamp(0.0, maxHeight);
     geometry = SliverGeometry(
       paintExtent: math.min(height, constraints.remainingPaintExtent),
       scrollExtent: maxHeight,
@@ -75,11 +75,11 @@
 
 class _StatusBarPaddingSliver extends SingleChildRenderObjectWidget {
   const _StatusBarPaddingSliver({
-    Key key,
-    @required this.maxHeight,
+    Key? key,
+    required this.maxHeight,
     this.scrollFactor = 5.0,
-  }) : assert(maxHeight != null && maxHeight >= 0.0),
-       assert(scrollFactor != null && scrollFactor >= 1.0),
+  }) : assert(maxHeight >= 0.0),
+       assert(scrollFactor >= 1.0),
        super(key: key);
 
   final double maxHeight;
@@ -110,9 +110,9 @@
 
 class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
   _SliverAppBarDelegate({
-    @required this.minHeight,
-    @required this.maxHeight,
-    @required this.child,
+    required this.minHeight,
+    required this.maxHeight,
+    required this.child,
   });
 
   final double minHeight;
@@ -170,51 +170,51 @@
     this.selectedIndex,
   });
 
-  final Alignment translation;
-  final double tColumnToRow;
-  final double tCollapsed;
-  final int cardCount;
-  final double selectedIndex;
+  final Alignment? translation;
+  final double? tColumnToRow;
+  final double? tCollapsed;
+  final int? cardCount;
+  final double? selectedIndex;
 
-  Rect _interpolateRect(Rect begin, Rect end) {
-    return Rect.lerp(begin, end, tColumnToRow);
+  Rect? _interpolateRect(Rect begin, Rect end) {
+    return Rect.lerp(begin, end, tColumnToRow!);
   }
 
-  Offset _interpolatePoint(Offset begin, Offset end) {
-    return Offset.lerp(begin, end, tColumnToRow);
+  Offset? _interpolatePoint(Offset begin, Offset end) {
+    return Offset.lerp(begin, end, tColumnToRow!);
   }
 
   @override
   void performLayout(Size size) {
     final double columnCardX = size.width / 5.0;
     final double columnCardWidth = size.width - columnCardX;
-    final double columnCardHeight = size.height / cardCount;
+    final double columnCardHeight = size.height / cardCount!;
     final double rowCardWidth = size.width;
-    final Offset offset = translation.alongSize(size);
+    final Offset offset = translation!.alongSize(size);
     double columnCardY = 0.0;
-    double rowCardX = -(selectedIndex * rowCardWidth);
+    double rowCardX = -(selectedIndex! * rowCardWidth);
 
     // When tCollapsed > 0 the titles spread apart
     final double columnTitleX = size.width / 10.0;
-    final double rowTitleWidth = size.width * ((1 + tCollapsed) / 2.25);
-    double rowTitleX = (size.width - rowTitleWidth) / 2.0 - selectedIndex * rowTitleWidth;
+    final double rowTitleWidth = size.width * ((1 + tCollapsed!) / 2.25);
+    double rowTitleX = (size.width - rowTitleWidth) / 2.0 - selectedIndex! * rowTitleWidth;
 
     // When tCollapsed > 0, the indicators move closer together
     //final double rowIndicatorWidth = 48.0 + (1.0 - tCollapsed) * (rowTitleWidth - 48.0);
     const double paddedSectionIndicatorWidth = kSectionIndicatorWidth + 8.0;
     final double rowIndicatorWidth = paddedSectionIndicatorWidth +
-      (1.0 - tCollapsed) * (rowTitleWidth - paddedSectionIndicatorWidth);
-    double rowIndicatorX = (size.width - rowIndicatorWidth) / 2.0 - selectedIndex * rowIndicatorWidth;
+      (1.0 - tCollapsed!) * (rowTitleWidth - paddedSectionIndicatorWidth);
+    double rowIndicatorX = (size.width - rowIndicatorWidth) / 2.0 - selectedIndex! * rowIndicatorWidth;
 
     // Compute the size and origin of each card, title, and indicator for the maxHeight
     // "column" layout, and the midHeight "row" layout. The actual layout is just the
     // interpolated value between the column and row layouts for t.
-    for (int index = 0; index < cardCount; index++) {
+    for (int index = 0; index < cardCount!; index++) {
 
       // Layout the card for index.
       final Rect columnCardRect = Rect.fromLTWH(columnCardX, columnCardY, columnCardWidth, columnCardHeight);
       final Rect rowCardRect = Rect.fromLTWH(rowCardX, 0.0, rowCardWidth, size.height);
-      final Rect cardRect = _interpolateRect(columnCardRect, rowCardRect).shift(offset);
+      final Rect cardRect = _interpolateRect(columnCardRect, rowCardRect)!.shift(offset);
       final String cardId = 'card$index';
       if (hasChild(cardId)) {
         layoutChild(cardId, BoxConstraints.tight(cardRect.size));
@@ -228,7 +228,7 @@
       final double centeredRowTitleX = rowTitleX + (rowTitleWidth - titleSize.width) / 2.0;
       final Offset columnTitleOrigin = Offset(columnTitleX, columnTitleY);
       final Offset rowTitleOrigin = Offset(centeredRowTitleX, rowTitleY);
-      final Offset titleOrigin = _interpolatePoint(columnTitleOrigin, rowTitleOrigin);
+      final Offset titleOrigin = _interpolatePoint(columnTitleOrigin, rowTitleOrigin)!;
       positionChild('title$index', titleOrigin + offset);
 
       // Layout the selection indicator for index.
@@ -240,7 +240,7 @@
       final double centeredRowIndicatorX = rowIndicatorX + (rowIndicatorWidth - indicatorSize.width) / 2.0;
       final double rowIndicatorY = titleRect.bottomCenter.dy + 16.0;
       final Offset rowIndicatorOrigin = Offset(centeredRowIndicatorX, rowIndicatorY);
-      final Offset indicatorOrigin = _interpolatePoint(columnIndicatorOrigin, rowIndicatorOrigin);
+      final Offset indicatorOrigin = _interpolatePoint(columnIndicatorOrigin, rowIndicatorOrigin)!;
       positionChild('indicator$index', indicatorOrigin + offset);
 
       columnCardY += columnCardHeight;
@@ -260,32 +260,29 @@
 
 class _AllSectionsView extends AnimatedWidget {
   _AllSectionsView({
-    Key key,
-    this.sectionIndex,
-    @required this.sections,
-    @required this.selectedIndex,
+    Key? key,
+    required this.sectionIndex,
+    required this.sections,
+    required this.selectedIndex,
     this.minHeight,
     this.midHeight,
     this.maxHeight,
     this.sectionCards = const <Widget>[],
-  }) : assert(sections != null),
-       assert(sectionCards != null),
-       assert(sectionCards.length == sections.length),
+  }) : assert(sectionCards.length == sections.length),
        assert(sectionIndex >= 0 && sectionIndex < sections.length),
-       assert(selectedIndex != null),
-       assert(selectedIndex.value >= 0.0 && selectedIndex.value < sections.length.toDouble()),
+       assert(selectedIndex.value! >= 0.0 && selectedIndex.value! < sections.length.toDouble()),
        super(key: key, listenable: selectedIndex);
 
   final int sectionIndex;
   final List<Section> sections;
-  final ValueNotifier<double> selectedIndex;
-  final double minHeight;
-  final double midHeight;
-  final double maxHeight;
+  final ValueNotifier<double?> selectedIndex;
+  final double? minHeight;
+  final double? midHeight;
+  final double? maxHeight;
   final List<Widget> sectionCards;
 
   double _selectedIndexDelta(int index) {
-    return (index.toDouble() - selectedIndex.value).abs().clamp(0.0, 1.0) as double;
+    return (index.toDouble() - selectedIndex.value!).abs().clamp(0.0, 1.0);
   }
 
   Widget _build(BuildContext context, BoxConstraints constraints) {
@@ -295,16 +292,16 @@
     // 0.0 when size.height equals the maxHeight, 1.0 when the size.height
     // equals the midHeight.
     final double tColumnToRow =
-      1.0 - ((size.height - midHeight) /
-             (maxHeight - midHeight)).clamp(0.0, 1.0);
+      1.0 - ((size.height - midHeight!) /
+             (maxHeight! - midHeight!)).clamp(0.0, 1.0);
 
 
     // The layout's progress from from the midHeight row layout to
     // a minHeight row layout. Its value is 0.0 when size.height equals
     // midHeight and 1.0 when size.height equals minHeight.
     final double tCollapsed =
-      1.0 - ((size.height - minHeight) /
-             (midHeight - minHeight)).clamp(0.0, 1.0);
+      1.0 - ((size.height - minHeight!) /
+             (midHeight! - minHeight!)).clamp(0.0, 1.0);
 
     double _indicatorOpacity(int index) {
       return 1.0 - _selectedIndexDelta(index) * 0.5;
@@ -343,7 +340,7 @@
 
     return CustomMultiChildLayout(
       delegate: _AllSectionsLayout(
-        translation: Alignment((selectedIndex.value - sectionIndex) * 2.0 - 1.0, -1.0),
+        translation: Alignment((selectedIndex.value! - sectionIndex) * 2.0 - 1.0, -1.0),
         tColumnToRow: tColumnToRow,
         tCollapsed: tCollapsed,
         cardCount: sections.length,
@@ -364,15 +361,14 @@
 // visible.
 class _SnappingScrollPhysics extends ClampingScrollPhysics {
   const _SnappingScrollPhysics({
-    ScrollPhysics parent,
-    @required this.midScrollOffset,
-  }) : assert(midScrollOffset != null),
-       super(parent: parent);
+    ScrollPhysics? parent,
+    required this.midScrollOffset,
+  }) : super(parent: parent);
 
   final double midScrollOffset;
 
   @override
-  _SnappingScrollPhysics applyTo(ScrollPhysics ancestor) {
+  _SnappingScrollPhysics applyTo(ScrollPhysics? ancestor) {
     return _SnappingScrollPhysics(parent: buildParent(ancestor), midScrollOffset: midScrollOffset);
   }
 
@@ -387,8 +383,8 @@
   }
 
   @override
-  Simulation createBallisticSimulation(ScrollMetrics position, double dragVelocity) {
-    final Simulation simulation = super.createBallisticSimulation(position, dragVelocity);
+  Simulation? createBallisticSimulation(ScrollMetrics position, double dragVelocity) {
+    final Simulation? simulation = super.createBallisticSimulation(position, dragVelocity);
     final double offset = position.pixels;
 
     if (simulation != null) {
@@ -419,7 +415,7 @@
 }
 
 class AnimationDemoHome extends StatefulWidget {
-  const AnimationDemoHome({ Key key }) : super(key: key);
+  const AnimationDemoHome({ Key? key }) : super(key: key);
 
   static const String routeName = '/animation';
 
@@ -432,7 +428,7 @@
   final PageController _headingPageController = PageController();
   final PageController _detailsPageController = PageController();
   ScrollPhysics _headingScrollPhysics = const NeverScrollableScrollPhysics();
-  ValueNotifier<double> selectedIndex = ValueNotifier<double>(0.0);
+  ValueNotifier<double?> selectedIndex = ValueNotifier<double?>(0.0);
 
   @override
   Widget build(BuildContext context) {
@@ -492,7 +488,7 @@
   }
 
   Iterable<Widget> _detailItemsFor(Section section) {
-    final Iterable<Widget> detailItems = section.details.map<Widget>((SectionDetail detail) {
+    final Iterable<Widget> detailItems = section.details!.map<Widget>((SectionDetail detail) {
       return SectionDetailView(detail: detail);
     });
     return ListTile.divideTiles(context: context, tiles: detailItems);
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/animation/sections.dart b/dev/integration_tests/flutter_gallery/lib/demo/animation/sections.dart
index 9ff1f1c..9c5377c 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/animation/sections.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/animation/sections.dart
@@ -20,10 +20,10 @@
     this.imageAsset,
     this.imageAssetPackage,
   });
-  final String title;
-  final String subtitle;
-  final String imageAsset;
-  final String imageAssetPackage;
+  final String? title;
+  final String? subtitle;
+  final String? imageAsset;
+  final String? imageAssetPackage;
 }
 
 @immutable
@@ -36,12 +36,12 @@
     this.rightColor,
     this.details,
   });
-  final String title;
-  final String backgroundAsset;
-  final String backgroundAssetPackage;
-  final Color leftColor;
-  final Color rightColor;
-  final List<SectionDetail> details;
+  final String? title;
+  final String? backgroundAsset;
+  final String? backgroundAssetPackage;
+  final Color? leftColor;
+  final Color? rightColor;
+  final List<SectionDetail>? details;
 
   @override
   bool operator==(Object other) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/animation/widgets.dart b/dev/integration_tests/flutter_gallery/lib/demo/animation/widgets.dart
index c04553c..13f65ff 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/animation/widgets.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/animation/widgets.dart
@@ -10,9 +10,8 @@
 
 // The card for a single section. Displays the section's gradient and background image.
 class SectionCard extends StatelessWidget {
-  const SectionCard({ Key key, @required this.section })
-    : assert(section != null),
-      super(key: key);
+  const SectionCard({ Key? key, required this.section })
+    : super(key: key);
 
   final Section section;
 
@@ -27,13 +26,13 @@
             begin: Alignment.centerLeft,
             end: Alignment.centerRight,
             colors: <Color>[
-              section.leftColor,
-              section.rightColor,
+              section.leftColor!,
+              section.rightColor!,
             ],
           ),
         ),
         child: Image.asset(
-          section.backgroundAsset,
+          section.backgroundAsset!,
           package: section.backgroundAssetPackage,
           color: const Color.fromRGBO(255, 255, 255, 0.075),
           colorBlendMode: BlendMode.modulate,
@@ -48,13 +47,11 @@
 // offset a little. It's supposed to look sort-of 3D.
 class SectionTitle extends StatelessWidget {
   const SectionTitle({
-    Key key,
-    @required this.section,
-    @required this.scale,
-    @required this.opacity,
-  }) : assert(section != null),
-       assert(scale != null),
-       assert(opacity != null && opacity >= 0.0 && opacity <= 1.0),
+    Key? key,
+    required this.section,
+    required this.scale,
+    required this.opacity,
+  }) : assert(opacity >= 0.0 && opacity <= 1.0),
        super(key: key);
 
   final Section section;
@@ -86,9 +83,9 @@
             children: <Widget>[
               Positioned(
                 top: 4.0,
-                child: Text(section.title, style: sectionTitleShadowStyle),
+                child: Text(section.title!, style: sectionTitleShadowStyle),
               ),
-              Text(section.title, style: sectionTitleStyle),
+              Text(section.title!, style: sectionTitleStyle),
             ],
           ),
         ),
@@ -99,7 +96,7 @@
 
 // Small horizontal bar that indicates the selected section.
 class SectionIndicator extends StatelessWidget {
-  const SectionIndicator({ Key key, this.opacity = 1.0 }) : super(key: key);
+  const SectionIndicator({ Key? key, this.opacity = 1.0 }) : super(key: key);
 
   final double opacity;
 
@@ -117,8 +114,8 @@
 
 // Display a single SectionDetail.
 class SectionDetailView extends StatelessWidget {
-  SectionDetailView({ Key key, @required this.detail })
-    : assert(detail != null && detail.imageAsset != null),
+  SectionDetailView({ Key? key, required this.detail })
+    : assert(detail.imageAsset != null),
       assert((detail.imageAsset ?? detail.title) != null),
       super(key: key);
 
@@ -131,7 +128,7 @@
         borderRadius: BorderRadius.circular(6.0),
         image: DecorationImage(
           image: AssetImage(
-            detail.imageAsset,
+            detail.imageAsset!,
             package: detail.imageAssetPackage,
           ),
           fit: BoxFit.cover,
@@ -153,8 +150,8 @@
       );
     } else {
       item = ListTile(
-        title: Text(detail.title),
-        subtitle: Text(detail.subtitle),
+        title: Text(detail.title!),
+        subtitle: Text(detail.subtitle!),
         leading: SizedBox(width: 32.0, height: 32.0, child: image),
       );
     }
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/animation_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/animation_demo.dart
index 5b787f8..f690509 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/animation_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/animation_demo.dart
@@ -7,7 +7,7 @@
 import 'animation/home.dart';
 
 class AnimationDemo extends StatelessWidget {
-  const AnimationDemo({Key key}) : super(key: key);
+  const AnimationDemo({Key? key}) : super(key: key);
 
   static const String routeName = '/animation';
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/calculator/home.dart b/dev/integration_tests/flutter_gallery/lib/demo/calculator/home.dart
index a124f9f..822d259 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/calculator/home.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/calculator/home.dart
@@ -7,7 +7,7 @@
 import 'logic.dart';
 
 class Calculator extends StatefulWidget {
-  const Calculator({Key key}) : super(key: key);
+  const Calculator({Key? key}) : super(key: key);
 
   @override
   _CalculatorState createState() => _CalculatorState();
@@ -43,7 +43,7 @@
   }
 
   void handleNumberTap(int n) {
-    final CalcExpression expression = _expression.appendDigit(n);
+    final CalcExpression? expression = _expression.appendDigit(n);
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -52,7 +52,7 @@
   }
 
   void handlePointTap() {
-    final CalcExpression expression = _expression.appendPoint();
+    final CalcExpression? expression = _expression.appendPoint();
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -61,7 +61,7 @@
   }
 
   void handlePlusTap() {
-    final CalcExpression expression = _expression.appendOperation(Operation.Addition);
+    final CalcExpression? expression = _expression.appendOperation(Operation.Addition);
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -70,7 +70,7 @@
   }
 
   void handleMinusTap() {
-    final CalcExpression expression = _expression.appendMinus();
+    final CalcExpression? expression = _expression.appendMinus();
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -79,7 +79,7 @@
   }
 
   void handleMultTap() {
-    final CalcExpression expression = _expression.appendOperation(Operation.Multiplication);
+    final CalcExpression? expression = _expression.appendOperation(Operation.Multiplication);
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -88,7 +88,7 @@
   }
 
   void handleDivTap() {
-    final CalcExpression expression = _expression.appendOperation(Operation.Division);
+    final CalcExpression? expression = _expression.appendOperation(Operation.Division);
     if (expression != null) {
       setState(() {
         pushExpression(expression);
@@ -97,7 +97,7 @@
   }
 
   void handleEqualsTap() {
-    final CalcExpression resultExpression = _expression.computeResult();
+    final CalcExpression? resultExpression = _expression.computeResult();
     if (resultExpression != null) {
       setState(() {
         setResult(resultExpression);
@@ -140,13 +140,13 @@
 class CalcDisplay extends StatelessWidget {
   const CalcDisplay({ this.content });
 
-  final String content;
+  final String? content;
 
   @override
   Widget build(BuildContext context) {
     return Center(
       child: Text(
-        content,
+        content!,
         style: const TextStyle(fontSize: 24.0),
       ),
     );
@@ -156,7 +156,7 @@
 class KeyPad extends StatelessWidget {
   const KeyPad({ this.calcState });
 
-  final _CalculatorState calcState;
+  final _CalculatorState? calcState;
 
   @override
   Widget build(BuildContext context) {
@@ -193,9 +193,9 @@
                     NumberKey(3, calcState),
                   ]),
                   KeyRow(<Widget>[
-                    CalcKey('.', calcState.handlePointTap),
+                    CalcKey('.', calcState!.handlePointTap),
                     NumberKey(0, calcState),
-                    CalcKey('=', calcState.handleEqualsTap),
+                    CalcKey('=', calcState!.handleEqualsTap),
                   ]),
                 ],
               ),
@@ -205,11 +205,11 @@
                 color: themeData.backgroundColor,
                 child: Column(
                   children: <Widget>[
-                    CalcKey('\u232B', calcState.handleDelTap),
-                    CalcKey('\u00F7', calcState.handleDivTap),
-                    CalcKey('\u00D7', calcState.handleMultTap),
-                    CalcKey('-', calcState.handleMinusTap),
-                    CalcKey('+', calcState.handlePlusTap),
+                    CalcKey('\u232B', calcState!.handleDelTap),
+                    CalcKey('\u00F7', calcState!.handleDivTap),
+                    CalcKey('\u00D7', calcState!.handleMultTap),
+                    CalcKey('-', calcState!.handleMinusTap),
+                    CalcKey('+', calcState!.handlePlusTap),
                   ],
                 ),
               ),
@@ -263,8 +263,8 @@
 }
 
 class NumberKey extends CalcKey {
-  NumberKey(int value, _CalculatorState calcState)
+  NumberKey(int value, _CalculatorState? calcState)
     : super('$value', () {
-        calcState.handleNumberTap(value);
+        calcState!.handleNumberTap(value);
       });
 }
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart b/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
index 8001f8f..9f832a6 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
@@ -9,10 +9,10 @@
 class ExpressionToken {
   ExpressionToken(this.stringRep);
 
-  final String stringRep;
+  final String? stringRep;
 
   @override
-  String toString() => stringRep;
+  String toString() => stringRep!;
 }
 
 /// A token that represents a number.
@@ -71,7 +71,7 @@
 
   Operation operation;
 
-  static String opString(Operation operation) {
+  static String? opString(Operation operation) {
     switch (operation) {
       case Operation.Addition:
         return ' + ';
@@ -82,8 +82,6 @@
       case Operation.Division:
         return '  \u00F7  ';
     }
-    assert(operation != null);
-    return null;
   }
 }
 
@@ -124,13 +122,13 @@
     : this(<ExpressionToken>[], ExpressionState.Start);
 
   CalcExpression.result(FloatToken result)
-    : _list = <ExpressionToken>[],
+    : _list = <ExpressionToken?>[],
       state = ExpressionState.Result {
     _list.add(result);
   }
 
   /// The tokens comprising the expression.
-  final List<ExpressionToken> _list;
+  final List<ExpressionToken?> _list;
   /// The state of the expression.
   final ExpressionState state;
 
@@ -146,10 +144,10 @@
   /// Append a digit to the current expression and return a new expression
   /// representing the result. Returns null to indicate that it is not legal
   /// to append a digit in the current state.
-  CalcExpression appendDigit(int digit) {
+  CalcExpression? appendDigit(int digit) {
     ExpressionState newState = ExpressionState.Number;
-    ExpressionToken newToken;
-    final List<ExpressionToken> outList = _list.toList();
+    ExpressionToken? newToken;
+    final List<ExpressionToken?> outList = _list.toList();
     switch (state) {
       case ExpressionState.Start:
         // Start a new number with digit.
@@ -161,12 +159,12 @@
         newToken = IntToken('-$digit');
         break;
       case ExpressionState.Number:
-        final ExpressionToken last = outList.removeLast();
+        final ExpressionToken last = outList.removeLast()!;
         newToken = IntToken('${last.stringRep}$digit');
         break;
       case ExpressionState.Point:
       case ExpressionState.NumberWithPoint:
-        final ExpressionToken last = outList.removeLast();
+        final ExpressionToken last = outList.removeLast()!;
         newState = ExpressionState.NumberWithPoint;
         newToken = FloatToken('${last.stringRep}$digit');
         break;
@@ -181,17 +179,17 @@
   /// Append a point to the current expression and return a new expression
   /// representing the result. Returns null to indicate that it is not legal
   /// to append a point in the current state.
-  CalcExpression appendPoint() {
-    ExpressionToken newToken;
-    final List<ExpressionToken> outList = _list.toList();
+  CalcExpression? appendPoint() {
+    ExpressionToken? newToken;
+    final List<ExpressionToken?> outList = _list.toList();
     switch (state) {
       case ExpressionState.Start:
         newToken = FloatToken('.');
         break;
       case ExpressionState.LeadingNeg:
       case ExpressionState.Number:
-        final ExpressionToken last = outList.removeLast();
-        newToken = FloatToken(last.stringRep + '.');
+        final ExpressionToken last = outList.removeLast()!;
+        newToken = FloatToken(last.stringRep! + '.');
         break;
       case ExpressionState.Point:
       case ExpressionState.NumberWithPoint:
@@ -206,7 +204,7 @@
   /// Append an operation symbol to the current expression and return a new
   /// expression representing the result. Returns null to indicate that it is not
   /// legal to append an operation symbol in the current state.
-  CalcExpression appendOperation(Operation op) {
+  CalcExpression? appendOperation(Operation op) {
     switch (state) {
       case ExpressionState.Start:
       case ExpressionState.LeadingNeg:
@@ -218,7 +216,7 @@
       case ExpressionState.Result:
         break;
     }
-    final List<ExpressionToken> outList = _list.toList();
+    final List<ExpressionToken?> outList = _list.toList();
     outList.add(OperationToken(op));
     return CalcExpression(outList, ExpressionState.Start);
   }
@@ -226,7 +224,7 @@
   /// Append a leading minus sign to the current expression and return a new
   /// expression representing the result. Returns null to indicate that it is not
   /// legal to append a leading minus sign in the current state.
-  CalcExpression appendLeadingNeg() {
+  CalcExpression? appendLeadingNeg() {
     switch (state) {
       case ExpressionState.Start:
         break;
@@ -238,7 +236,7 @@
         // Cannot enter leading neg now.
         return null;
     }
-    final List<ExpressionToken> outList = _list.toList();
+    final List<ExpressionToken?> outList = _list.toList();
     outList.add(LeadingNegToken());
     return CalcExpression(outList, ExpressionState.LeadingNeg);
   }
@@ -248,7 +246,7 @@
   /// to append a minus sign in the current state. Depending on the current
   /// state the minus sign will be interpreted as either a leading negative
   /// sign or a subtraction operation.
-  CalcExpression appendMinus() {
+  CalcExpression? appendMinus() {
     switch (state) {
       case ExpressionState.Start:
         return appendLeadingNeg();
@@ -266,7 +264,7 @@
   /// Computes the result of the current expression and returns a new
   /// ResultExpression containing the result. Returns null to indicate that
   /// it is not legal to compute a result in the current state.
-  CalcExpression computeResult() {
+  CalcExpression? computeResult() {
     switch (state) {
       case ExpressionState.Start:
       case ExpressionState.LeadingNeg:
@@ -281,13 +279,13 @@
 
     // We make a copy of _list because CalcExpressions are supposed to
     // be immutable.
-    final List<ExpressionToken> list = _list.toList();
+    final List<ExpressionToken?> list = _list.toList();
     // We obey order-of-operations by computing the sum of the 'terms',
     // where a "term" is defined to be a sequence of numbers separated by
     // multiplication or division symbols.
     num currentTermValue = removeNextTerm(list);
     while (list.isNotEmpty) {
-      final OperationToken opToken = list.removeAt(0) as OperationToken;
+      final OperationToken opToken = list.removeAt(0)! as OperationToken;
       final num nextTermValue = removeNextTerm(list);
       switch (opToken.operation) {
         case Operation.Addition:
@@ -311,13 +309,13 @@
   /// Removes the next "term" from `list` and returns its numeric value.
   /// A "term" is a sequence of number tokens separated by multiplication
   /// and division symbols.
-  static num removeNextTerm(List<ExpressionToken> list) {
-    assert(list != null && list.isNotEmpty);
-    final NumberToken firstNumToken = list.removeAt(0) as NumberToken;
+  static num removeNextTerm(List<ExpressionToken?> list) {
+    assert(list.isNotEmpty);
+    final NumberToken firstNumToken = list.removeAt(0)! as NumberToken;
     num currentValue = firstNumToken.number;
     while (list.isNotEmpty) {
       bool isDivision = false;
-      final OperationToken nextOpToken = list.first as OperationToken;
+      final OperationToken nextOpToken = list.first! as OperationToken;
       switch (nextOpToken.operation) {
         case Operation.Addition:
         case Operation.Subtraction:
@@ -331,7 +329,7 @@
       // Remove the operation token.
       list.removeAt(0);
       // Remove the next number token.
-      final NumberToken nextNumToken = list.removeAt(0) as NumberToken;
+      final NumberToken nextNumToken = list.removeAt(0)! as NumberToken;
       final num nextNumber = nextNumToken.number;
       if (isDivision)
         currentValue /= nextNumber;
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/calculator_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/calculator_demo.dart
index aaa9953..b8842ff 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/calculator_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/calculator_demo.dart
@@ -7,7 +7,7 @@
 import 'calculator/home.dart';
 
 class CalculatorDemo extends StatelessWidget {
-  const CalculatorDemo({Key key}) : super(key: key);
+  const CalculatorDemo({Key? key}) : super(key: key);
 
   static const String routeName = '/calculator';
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/colors_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/colors_demo.dart
index 26a966c..73f20b2 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/colors_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/colors_demo.dart
@@ -9,12 +9,12 @@
 class Palette {
   Palette({ this.name, this.primary, this.accent, this.threshold = 900});
 
-  final String name;
-  final MaterialColor primary;
-  final MaterialAccentColor accent;
+  final String? name;
+  final MaterialColor? primary;
+  final MaterialAccentColor? accent;
   final int threshold; // titles for indices > threshold are white, otherwise black
 
-  bool get isValid => name != null && primary != null && threshold != null;
+  bool get isValid => name != null && primary != null;
 }
 
 final List<Palette> allPalettes = <Palette>[
@@ -42,14 +42,11 @@
 
 class ColorItem extends StatelessWidget {
   const ColorItem({
-    Key key,
-    @required this.index,
-    @required this.color,
+    Key? key,
+    required this.index,
+    required this.color,
     this.prefix = '',
-  }) : assert(index != null),
-       assert(color != null),
-       assert(prefix != null),
-       super(key: key);
+  }) : super(key: key);
 
   final int index;
   final Color color;
@@ -84,9 +81,9 @@
 
 class PaletteTabView extends StatelessWidget {
   PaletteTabView({
-    Key key,
-    @required this.colors,
-  }) : assert(colors != null && colors.isValid),
+    Key? key,
+    required this.colors,
+  }) : assert(colors.isValid),
        super(key: key);
 
   final Palette colors;
@@ -97,8 +94,8 @@
   @override
   Widget build(BuildContext context) {
     final TextTheme textTheme = Theme.of(context).textTheme;
-    final TextStyle whiteTextStyle = textTheme.bodyText2.copyWith(color: Colors.white);
-    final TextStyle blackTextStyle = textTheme.bodyText2.copyWith(color: Colors.black);
+    final TextStyle whiteTextStyle = textTheme.bodyText2!.copyWith(color: Colors.white);
+    final TextStyle blackTextStyle = textTheme.bodyText2!.copyWith(color: Colors.black);
     return Scrollbar(
       child: ListView(
         itemExtent: kColorItemHeight,
@@ -106,14 +103,14 @@
           ...primaryKeys.map<Widget>((int index) {
             return DefaultTextStyle(
               style: index > colors.threshold ? whiteTextStyle : blackTextStyle,
-              child: ColorItem(index: index, color: colors.primary[index]),
+              child: ColorItem(index: index, color: colors.primary![index]!),
             );
           }),
           if (colors.accent != null)
             ...accentKeys.map<Widget>((int index) {
               return DefaultTextStyle(
                 style: index > colors.threshold ? whiteTextStyle : blackTextStyle,
-                child: ColorItem(index: index, color: colors.accent[index], prefix: 'A'),
+                child: ColorItem(index: index, color: colors.accent![index]!, prefix: 'A'),
               );
             }),
         ],
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/contacts_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/contacts_demo.dart
index 76dbf1c..00a8d15 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/contacts_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/contacts_demo.dart
@@ -6,10 +6,10 @@
 import 'package:flutter/services.dart';
 
 class _ContactCategory extends StatelessWidget {
-  const _ContactCategory({ Key key, this.icon, this.children }) : super(key: key);
+  const _ContactCategory({ Key? key, this.icon, this.children }) : super(key: key);
 
-  final IconData icon;
-  final List<Widget> children;
+  final IconData? icon;
+  final List<Widget>? children;
 
   @override
   Widget build(BuildContext context) {
@@ -20,7 +20,7 @@
         border: Border(bottom: BorderSide(color: themeData.dividerColor))
       ),
       child: DefaultTextStyle(
-        style: Theme.of(context).textTheme.subtitle1,
+        style: Theme.of(context).textTheme.subtitle1!,
         child: SafeArea(
           top: false,
           bottom: false,
@@ -32,7 +32,7 @@
                 width: 72.0,
                 child: Icon(icon, color: themeData.primaryColor),
               ),
-              Expanded(child: Column(children: children)),
+              Expanded(child: Column(children: children!)),
             ],
           ),
         ),
@@ -42,14 +42,14 @@
 }
 
 class _ContactItem extends StatelessWidget {
-  const _ContactItem({ Key key, this.icon, this.lines, this.tooltip, this.onPressed })
+  const _ContactItem({ Key? key, this.icon, required this.lines, this.tooltip, this.onPressed })
     : assert(lines.length > 1),
       super(key: key);
 
-  final IconData icon;
+  final IconData? icon;
   final List<String> lines;
-  final String tooltip;
-  final VoidCallback onPressed;
+  final String? tooltip;
+  final VoidCallback? onPressed;
 
   @override
   Widget build(BuildContext context) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart
index 9c608a8..30c348b 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_alert_demo.dart
@@ -14,24 +14,24 @@
 }
 
 class _CupertinoAlertDemoState extends State<CupertinoAlertDemo> {
-  String lastSelectedValue;
+  String? lastSelectedValue;
 
-  void showDemoDialog({BuildContext context, Widget child}) {
+  void showDemoDialog({required BuildContext context, Widget? child}) {
     showCupertinoDialog<String>(
       context: context,
-      builder: (BuildContext context) => child,
-    ).then((String value) {
+      builder: (BuildContext context) => child!,
+    ).then((String? value) {
       if (value != null) {
         setState(() { lastSelectedValue = value; });
       }
     });
   }
 
-  void showDemoActionSheet({BuildContext context, Widget child}) {
+  void showDemoActionSheet({required BuildContext context, Widget? child}) {
     showCupertinoModalPopup<String>(
       context: context,
-      builder: (BuildContext context) => child,
-    ).then((String value) {
+      builder: (BuildContext context) => child!,
+    ).then((String? value) {
       if (value != null) {
         setState(() { lastSelectedValue = value; });
       }
@@ -196,10 +196,10 @@
 }
 
 class CupertinoDessertDialog extends StatelessWidget {
-  const CupertinoDessertDialog({Key key, this.title, this.content}) : super(key: key);
+  const CupertinoDessertDialog({Key? key, this.title, this.content}) : super(key: key);
 
-  final Widget title;
-  final Widget content;
+  final Widget? title;
+  final Widget? content;
 
   @override
   Widget build(BuildContext context) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart
index 36fbb4d..191e99b 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_navigation_demo.dart
@@ -44,7 +44,7 @@
 
   final List<Color> colorItems;
   final List<String> colorNameItems;
-  final int randomSeed;
+  final int? randomSeed;
 
   @override
   Widget build(BuildContext context) {
@@ -71,7 +71,6 @@
             ],
           ),
           tabBuilder: (BuildContext context, int index) {
-            assert(index >= 0 && index <= 2);
             switch (index) {
               case 0:
                 return CupertinoTabView(
@@ -84,21 +83,19 @@
                   },
                   defaultTitle: 'Colors',
                 );
-                break;
               case 1:
                 return CupertinoTabView(
                   builder: (BuildContext context) => CupertinoDemoTab2(),
                   defaultTitle: 'Support Chat',
                 );
-                break;
               case 2:
                 return CupertinoTabView(
                   builder: (BuildContext context) => CupertinoDemoTab3(),
                   defaultTitle: 'Account',
                 );
-                break;
             }
-            return null;
+            assert(false);
+            return const CupertinoTabView();
           },
         ),
       ),
@@ -120,7 +117,7 @@
       ),
       onPressed: () {
         // The demo is on the root navigator.
-        Navigator.of(context, rootNavigator: true).pop();
+        Navigator.of(context, rootNavigator: true)!.pop();
       },
     );
   }
@@ -142,9 +139,9 @@
     this.randomSeed,
   });
 
-  final List<Color> colorItems;
-  final List<String> colorNameItems;
-  final int randomSeed;
+  final List<Color>? colorItems;
+  final List<String>? colorNameItems;
+  final int? randomSeed;
 
   @override
   Widget build(BuildContext context) {
@@ -170,8 +167,8 @@
                   return Tab1RowItem(
                     index: index,
                     lastItem: index == _kChildCount - 1,
-                    color: colorItems[index],
-                    colorName: colorNameItems[index],
+                    color: colorItems![index],
+                    colorName: colorNameItems![index],
                     randomSeed: randomSeed,
                   );
                 },
@@ -194,18 +191,18 @@
     this.randomSeed,
   });
 
-  final int index;
-  final bool lastItem;
-  final Color color;
-  final String colorName;
-  final int randomSeed;
+  final int? index;
+  final bool? lastItem;
+  final Color? color;
+  final String? colorName;
+  final int? randomSeed;
 
   @override
   Widget build(BuildContext context) {
     final Widget row = GestureDetector(
       behavior: HitTestBehavior.opaque,
       onTap: () {
-        Navigator.of(context).push(CupertinoPageRoute<void>(
+        Navigator.of(context)!.push(CupertinoPageRoute<void>(
           title: colorName,
           builder: (BuildContext context) => Tab1ItemPage(
             color: color,
@@ -238,7 +235,7 @@
                     child: Column(
                       crossAxisAlignment: CrossAxisAlignment.start,
                       children: <Widget>[
-                        Text(colorName),
+                        Text(colorName!),
                         const Padding(padding: EdgeInsets.only(top: 8.0)),
                         Text(
                           'Buy this cool color',
@@ -273,7 +270,7 @@
       ),
     );
 
-    if (lastItem) {
+    if (lastItem!) {
       return row;
     }
 
@@ -292,10 +289,10 @@
 class Tab1ItemPage extends StatefulWidget {
   const Tab1ItemPage({this.color, this.colorName, this.index, this.randomSeed});
 
-  final Color color;
-  final String colorName;
-  final int index;
-  final int randomSeed;
+  final Color? color;
+  final String? colorName;
+  final int? index;
+  final int? randomSeed;
 
   @override
   State<StatefulWidget> createState() => Tab1ItemPageState();
@@ -309,14 +306,14 @@
       final math.Random random = math.Random(widget.randomSeed);
       return Color.fromARGB(
         255,
-        (widget.color.red + random.nextInt(100) - 50).clamp(0, 255) as int,
-        (widget.color.green + random.nextInt(100) - 50).clamp(0, 255) as int,
-        (widget.color.blue + random.nextInt(100) - 50).clamp(0, 255) as int,
+        (widget.color!.red + random.nextInt(100) - 50).clamp(0, 255),
+        (widget.color!.green + random.nextInt(100) - 50).clamp(0, 255),
+        (widget.color!.blue + random.nextInt(100) - 50).clamp(0, 255),
       );
     });
   }
 
-  List<Color> relatedColors;
+  late List<Color> relatedColors;
 
   @override
   Widget build(BuildContext context) {
@@ -350,7 +347,7 @@
                       mainAxisSize: MainAxisSize.min,
                       children: <Widget>[
                         Text(
-                          widget.colorName,
+                          widget.colorName!,
                           style: const TextStyle(fontSize: 24.0, fontWeight: FontWeight.bold),
                         ),
                         const Padding(padding: EdgeInsets.only(top: 6.0)),
@@ -594,13 +591,13 @@
 class Tab2ConversationBubble extends StatelessWidget {
   const Tab2ConversationBubble({this.text, this.color});
 
-  final String text;
-  final Tab2ConversationBubbleColor color;
+  final String? text;
+  final Tab2ConversationBubbleColor? color;
 
   @override
   Widget build(BuildContext context) {
-    Color backgroundColor;
-    Color foregroundColor;
+    Color? backgroundColor;
+    Color? foregroundColor;
 
     switch (color) {
       case Tab2ConversationBubbleColor.gray:
@@ -611,6 +608,8 @@
         backgroundColor = CupertinoTheme.of(context).primaryColor;
         foregroundColor = CupertinoColors.white;
         break;
+      default:
+        break;
     }
 
     return Container(
@@ -621,7 +620,7 @@
       margin: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0),
       padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 10.0),
       child: Text(
-        text,
+        text!,
         style: TextStyle(
           color: foregroundColor,
           letterSpacing: -0.4,
@@ -636,8 +635,8 @@
 class Tab2ConversationAvatar extends StatelessWidget {
   const Tab2ConversationAvatar({this.text, this.color});
 
-  final String text;
-  final Color color;
+  final String? text;
+  final Color? color;
 
   @override
   Widget build(BuildContext context) {
@@ -648,20 +647,20 @@
           begin: FractionalOffset.topCenter,
           end: FractionalOffset.bottomCenter,
           colors: <Color>[
-            color,
+            color!,
             Color.fromARGB(
-              color.alpha,
-              (color.red - 60).clamp(0, 255) as int,
-              (color.green - 60).clamp(0, 255) as int,
-              (color.blue - 60).clamp(0, 255) as int,
+              color!.alpha,
+              (color!.red - 60).clamp(0, 255),
+              (color!.green - 60).clamp(0, 255),
+              (color!.blue - 60).clamp(0, 255),
             ),
-          ],
+          ]
         ),
       ),
       margin: const EdgeInsets.only(left: 8.0, bottom: 8.0),
       padding: const EdgeInsets.all(12.0),
       child: Text(
-        text,
+        text!,
         style: const TextStyle(
           color: CupertinoColors.white,
           fontSize: 13.0,
@@ -675,8 +674,8 @@
 class Tab2ConversationRow extends StatelessWidget {
   const Tab2ConversationRow({this.avatar, this.text});
 
-  final Tab2ConversationAvatar avatar;
-  final String text;
+  final Tab2ConversationAvatar? avatar;
+  final String? text;
 
   @override
   Widget build(BuildContext context) {
@@ -687,7 +686,8 @@
         mainAxisSize: MainAxisSize.min,
         crossAxisAlignment: isSelf ? CrossAxisAlignment.center : CrossAxisAlignment.end,
         children: <Widget>[
-          if (avatar != null) avatar,
+          if (avatar != null)
+            avatar!,
           CupertinoUserInterfaceLevel(
             data: CupertinoUserInterfaceLevelData.elevated,
             child: Tab2ConversationBubble(
@@ -752,7 +752,7 @@
           const Padding(padding: EdgeInsets.only(top: 32.0)),
           GestureDetector(
             onTap: () {
-              Navigator.of(context, rootNavigator: true).push(
+              Navigator.of(context, rootNavigator: true)!.push(
                 CupertinoPageRoute<bool>(
                   fullscreenDialog: true,
                   builder: (BuildContext context) => Tab3Dialog(),
@@ -800,7 +800,7 @@
           child: const Text('Cancel'),
           padding: EdgeInsets.zero,
           onPressed: () {
-            Navigator.of(context).pop(false);
+            Navigator.of(context)!.pop(false);
           },
         ),
       ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart
index f45819e..b7c7ead 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_picker_demo.dart
@@ -20,10 +20,9 @@
 
 class _BottomPicker extends StatelessWidget {
   const _BottomPicker({
-    Key key,
-    @required this.child,
-  }) : assert(child != null),
-       super(key: key);
+    Key? key,
+    required this.child,
+  }) : super(key: key);
 
   final Widget child;
 
@@ -53,10 +52,9 @@
 
 class _Menu extends StatelessWidget {
   const _Menu({
-    Key key,
-    @required this.children,
-  }) : assert(children != null),
-       super(key: key);
+    Key? key,
+    required this.children,
+  }) : super(key: key);
 
   final List<Widget> children;
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart
index 31a50bc..4547ef2 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_refresh_demo.dart
@@ -16,7 +16,7 @@
 }
 
 class _CupertinoRefreshControlDemoState extends State<CupertinoRefreshControlDemo> {
-  List<List<String>> randomizedContacts;
+  late List<List<String>> randomizedContacts;
 
   @override
   void initState() {
@@ -64,7 +64,7 @@
             CupertinoSliverRefreshControl(
               onRefresh: () {
                 return Future<void>.delayed(const Duration(seconds: 2))
-                ..then<void>((_) {
+                ..then((_) {
                     if (mounted) {
                       setState(() => repopulateList());
                     }
@@ -149,10 +149,10 @@
     this.called,
   });
 
-  final String name;
-  final String place;
-  final String date;
-  final bool called;
+  final String? name;
+  final String? place;
+  final String? date;
+  final bool? called;
 
   @override
   Widget build(BuildContext context) {
@@ -164,7 +164,7 @@
         children: <Widget>[
           Container(
             width: 38.0,
-            child: called
+            child: called!
                 ? Align(
                     alignment: Alignment.topCenter,
                     child: Icon(
@@ -191,7 +191,7 @@
                       mainAxisAlignment: MainAxisAlignment.spaceBetween,
                       children: <Widget>[
                         Text(
-                          name,
+                          name!,
                           maxLines: 1,
                           overflow: TextOverflow.ellipsis,
                           style: const TextStyle(
@@ -200,7 +200,7 @@
                           ),
                         ),
                         Text(
-                          place,
+                          place!,
                           maxLines: 1,
                           overflow: TextOverflow.ellipsis,
                           style: TextStyle(
@@ -213,7 +213,7 @@
                     ),
                   ),
                   Text(
-                    date,
+                    date!,
                     style: TextStyle(
                       color: CupertinoColors.inactiveGray.resolveFrom(context),
                       fontSize: 15.0,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart
index e68b21c..529ff4a 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_segmented_control_demo.dart
@@ -43,9 +43,9 @@
     ),
   };
 
-  int currentSegment = 0;
+  int? currentSegment = 0;
 
-  void onValueChanged(int newValue) {
+  void onValueChanged(int? newValue) {
     setState(() {
       currentSegment = newValue;
     });
@@ -126,7 +126,7 @@
                               ),
                             ],
                           ),
-                          child: icons[currentSegment],
+                          child: icons[currentSegment!],
                         );
                       },
                     ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_text_field_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_text_field_demo.dart
index 77956dd..9a69b18 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_text_field_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/cupertino/cupertino_text_field_demo.dart
@@ -14,8 +14,8 @@
 }
 
 class _CupertinoTextFieldDemoState extends State<CupertinoTextFieldDemo> {
-  TextEditingController _chatTextController;
-  TextEditingController _locationTextController;
+  TextEditingController? _chatTextController;
+  TextEditingController? _locationTextController;
 
   @override
   void initState() {
@@ -49,12 +49,12 @@
             color: CupertinoColors.activeGreen,
           ),
           padding: const EdgeInsets.only(bottom: 4),
-          onPressed: ()=> setState(()=> _chatTextController.clear()),
+          onPressed: ()=> setState(()=> _chatTextController!.clear()),
         ),
       ),
       autofocus: true,
       suffixMode: OverlayVisibilityMode.editing,
-      onSubmitted: (String text)=> setState(()=> _chatTextController.clear()),
+      onSubmitted: (String text)=> setState(()=> _chatTextController!.clear()),
     );
   }
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/fortnightly/fortnightly.dart b/dev/integration_tests/flutter_gallery/lib/demo/fortnightly/fortnightly.dart
index e68dac3..7f8dc30 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/fortnightly/fortnightly.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/fortnightly/fortnightly.dart
@@ -33,7 +33,7 @@
 class ShortAppBar extends StatelessWidget {
   const ShortAppBar({ this.onBackPressed });
 
-  final VoidCallback onBackPressed;
+  final VoidCallback? onBackPressed;
 
   @override
   Widget build(BuildContext context) {
@@ -118,7 +118,7 @@
                         Text(
                           ' ¬ ',
                           // TODO(larche): Replace textTheme.headline2.color with a ColorScheme value when known.
-                          style: textTheme.overline.apply(color: textTheme.headline2.color),
+                          style: textTheme.overline!.apply(color: textTheme.headline2!.color),
                         ),
                         Text(
                           'CULTURE',
@@ -196,7 +196,7 @@
   theme = theme.apply(displayColor: Colors.black);
 
   theme = theme.copyWith(
-    headline4: base.headline4.copyWith(
+    headline4: base.headline4!.copyWith(
       fontFamily: 'Merriweather',
       fontStyle: FontStyle.italic,
       fontSize: 28,
@@ -204,21 +204,21 @@
       color: Colors.black,
       height: .88,
     ),
-    headline2: base.headline2.copyWith(
+    headline2: base.headline2!.copyWith(
       fontFamily: 'LibreFranklin',
       fontSize: 18,
       fontWeight: FontWeight.w500,
       color: Colors.black.withAlpha(153),
     ),
-    headline5: base.headline5.copyWith(fontWeight: FontWeight.w500),
-    bodyText2: base.bodyText2.copyWith(
+    headline5: base.headline5!.copyWith(fontWeight: FontWeight.w500),
+    bodyText2: base.bodyText2!.copyWith(
       fontFamily: 'Merriweather',
       fontSize: 14,
       fontWeight: FontWeight.w300,
       color: const Color(0xFF666666),
       height: 1.11,
     ),
-    bodyText1: base.bodyText1.copyWith(
+    bodyText1: base.bodyText1!.copyWith(
       fontFamily: 'Merriweather',
       fontSize: 16,
       fontWeight: FontWeight.w300,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/backdrop_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/backdrop_demo.dart
index dd8c5c8..0ea7a17 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/backdrop_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/backdrop_demo.dart
@@ -12,8 +12,8 @@
 
 class Category {
   const Category({ this.title, this.assets });
-  final String title;
-  final List<String> assets;
+  final String? title;
+  final List<String>? assets;
   @override
   String toString() => '$runtimeType("$title")';
 }
@@ -95,21 +95,21 @@
 ];
 
 class CategoryView extends StatelessWidget {
-  const CategoryView({ Key key, this.category }) : super(key: key);
+  const CategoryView({ Key? key, this.category }) : super(key: key);
 
-  final Category category;
+  final Category? category;
 
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
     return Scrollbar(
       child: ListView(
-        key: PageStorageKey<Category>(category),
+        key: PageStorageKey<Category?>(category),
         padding: const EdgeInsets.symmetric(
           vertical: 16.0,
           horizontal: 64.0,
         ),
-        children: category.assets.map<Widget>((String asset) {
+        children: category!.assets!.map<Widget>((String asset) {
           return Column(
             crossAxisAlignment: CrossAxisAlignment.stretch,
             children: <Widget>[
@@ -149,7 +149,7 @@
 // BackdropDemo.
 class BackdropPanel extends StatelessWidget {
   const BackdropPanel({
-    Key key,
+    Key? key,
     this.onTap,
     this.onVerticalDragUpdate,
     this.onVerticalDragEnd,
@@ -157,11 +157,11 @@
     this.child,
   }) : super(key: key);
 
-  final VoidCallback onTap;
-  final GestureDragUpdateCallback onVerticalDragUpdate;
-  final GestureDragEndCallback onVerticalDragEnd;
-  final Widget title;
-  final Widget child;
+  final VoidCallback? onTap;
+  final GestureDragUpdateCallback? onVerticalDragUpdate;
+  final GestureDragEndCallback? onVerticalDragEnd;
+  final Widget? title;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -185,7 +185,7 @@
               padding: const EdgeInsetsDirectional.only(start: 16.0),
               alignment: AlignmentDirectional.centerStart,
               child: DefaultTextStyle(
-                style: theme.textTheme.subtitle1,
+                style: theme.textTheme.subtitle1!,
                 child: Tooltip(
                   message: 'Tap to dismiss',
                   child: title,
@@ -194,7 +194,7 @@
             ),
           ),
           const Divider(height: 1.0),
-          Expanded(child: child),
+          Expanded(child: child!),
         ],
       ),
     );
@@ -204,15 +204,15 @@
 // Cross fades between 'Select a Category' and 'Asset Viewer'.
 class BackdropTitle extends AnimatedWidget {
   const BackdropTitle({
-    Key key,
-    Animation<double> listenable,
+    Key? key,
+    required Animation<double> listenable,
   }) : super(key: key, listenable: listenable);
 
   @override
   Widget build(BuildContext context) {
     final Animation<double> animation = listenable as Animation<double>;
     return DefaultTextStyle(
-      style: Theme.of(context).primaryTextTheme.headline6,
+      style: Theme.of(context).primaryTextTheme.headline6!,
       softWrap: false,
       overflow: TextOverflow.ellipsis,
       child: Stack(
@@ -247,7 +247,7 @@
 
 class _BackdropDemoState extends State<BackdropDemo> with SingleTickerProviderStateMixin {
   final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop');
-  AnimationController _controller;
+  late AnimationController _controller;
   Category _category = allCategories[0];
 
   @override
@@ -283,7 +283,7 @@
   }
 
   double get _backdropHeight {
-    final RenderBox renderBox = _backdropKey.currentContext.findRenderObject() as RenderBox;
+    final RenderBox renderBox = _backdropKey.currentContext!.findRenderObject()! as RenderBox;
     return renderBox.size.height;
   }
 
@@ -294,7 +294,7 @@
     if (_controller.isAnimating || _controller.status == AnimationStatus.completed)
       return;
 
-    _controller.value -= details.primaryDelta / (_backdropHeight ?? details.primaryDelta);
+    _controller.value -= details.primaryDelta! / _backdropHeight;
   }
 
   void _handleDragEnd(DragEndDetails details) {
@@ -343,7 +343,7 @@
           ? Colors.white.withOpacity(0.25)
           : Colors.transparent,
         child: ListTile(
-          title: Text(category.title),
+          title: Text(category.title!),
           selected: selected,
           onTap: () {
             _changeCategory(category);
@@ -359,8 +359,8 @@
         children: <Widget>[
           ListTileTheme(
             iconColor: theme.primaryIconTheme.color,
-            textColor: theme.primaryTextTheme.headline6.color.withOpacity(0.6),
-            selectedColor: theme.primaryTextTheme.headline6.color,
+            textColor: theme.primaryTextTheme.headline6!.color!.withOpacity(0.6),
+            selectedColor: theme.primaryTextTheme.headline6!.color,
             child: Padding(
               padding: const EdgeInsets.symmetric(horizontal: 16.0),
               child: Column(
@@ -375,7 +375,7 @@
               onTap: _toggleBackdropPanelVisibility,
               onVerticalDragUpdate: _handleDragUpdate,
               onVerticalDragEnd: _handleDragEnd,
-              title: Text(_category.title),
+              title: Text(_category.title!),
               child: CategoryView(category: _category),
             ),
           ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/banner_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/banner_demo.dart
index 49d23ac..666174b 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/banner_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/banner_demo.dart
@@ -13,7 +13,7 @@
 }
 
 class BannerDemo extends StatefulWidget {
-  const BannerDemo({ Key key }) : super(key: key);
+  const BannerDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/banner';
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
index 9449c64..aeca49c 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
@@ -92,7 +92,7 @@
       "When the Scaffold's floating action button location changes, "
       'the floating action button animates to its new position. '
       'The BottomAppBar adapts its shape appropriately.';
-    _scaffoldMessengerKey.currentState.showSnackBar(
+    _scaffoldMessengerKey.currentState!.showSnackBar(
       const SnackBar(content: Text(text)),
     );
   }
@@ -111,27 +111,27 @@
   _ChoiceValue<Widget> _fabShape = kCircularFab;
   _ChoiceValue<bool> _showNotch = kShowNotchTrue;
   _ChoiceValue<FloatingActionButtonLocation> _fabLocation = kFabEndDocked;
-  Color _babColor = kBabColors.first.color;
+  Color? _babColor = kBabColors.first.color;
 
-  void _onShowNotchChanged(_ChoiceValue<bool> value) {
+  void _onShowNotchChanged(_ChoiceValue<bool>? value) {
     setState(() {
-      _showNotch = value;
+      _showNotch = value!;
     });
   }
 
-  void _onFabShapeChanged(_ChoiceValue<Widget> value) {
+  void _onFabShapeChanged(_ChoiceValue<Widget>? value) {
     setState(() {
-      _fabShape = value;
+      _fabShape = value!;
     });
   }
 
-  void _onFabLocationChanged(_ChoiceValue<FloatingActionButtonLocation> value) {
+  void _onFabLocationChanged(_ChoiceValue<FloatingActionButtonLocation>? value) {
     setState(() {
-      _fabLocation = value;
+      _fabLocation = value!;
     });
   }
 
-  void _onBabColorChanged(Color value) {
+  void _onBabColorChanged(Color? value) {
     setState(() {
       _babColor = value;
     });
@@ -201,8 +201,8 @@
     );
   }
 
-  NotchedShape _selectNotch() {
-    if (!_showNotch.value)
+  NotchedShape? _selectNotch() {
+    if (!_showNotch.value!)
       return null;
     if (_fabShape == kCircularFab)
       return const CircularNotchedRectangle();
@@ -215,9 +215,9 @@
 class _ChoiceValue<T> {
   const _ChoiceValue({ this.value, this.title, this.label });
 
-  final T value;
-  final String title;
-  final String label; // For the Semantics widget that contains title
+  final T? value;
+  final String? title;
+  final String? label; // For the Semantics widget that contains title
 
   @override
   String toString() => '$runtimeType("$title")';
@@ -228,7 +228,7 @@
 
   final _ChoiceValue<T> value;
   final _ChoiceValue<T> groupValue;
-  final ValueChanged<_ChoiceValue<T>> onChanged;
+  final ValueChanged<_ChoiceValue<T>?> onChanged;
 
   @override
   Widget build(BuildContext context) {
@@ -256,7 +256,7 @@
                     onChanged(value);
                   },
                   child: Text(
-                    value.title,
+                    value.title!,
                     style: theme.textTheme.subtitle1,
                   ),
                 ),
@@ -272,7 +272,7 @@
 class _NamedColor {
   const _NamedColor(this.color, this.name);
 
-  final Color color;
+  final Color? color;
   final String name;
 }
 
@@ -280,8 +280,8 @@
   const _ColorsItem(this.colors, this.selectedColor, this.onChanged);
 
   final List<_NamedColor> colors;
-  final Color selectedColor;
-  final ValueChanged<Color> onChanged;
+  final Color? selectedColor;
+  final ValueChanged<Color?> onChanged;
 
   @override
   Widget build(BuildContext context) {
@@ -340,9 +340,9 @@
     this.shape,
   });
 
-  final Color color;
-  final FloatingActionButtonLocation fabLocation;
-  final NotchedShape shape;
+  final Color? color;
+  final FloatingActionButtonLocation? fabLocation;
+  final NotchedShape? shape;
 
   static final List<FloatingActionButtonLocation> kCenterLocations = <FloatingActionButtonLocation>[
     FloatingActionButtonLocation.centerDocked,
@@ -421,8 +421,8 @@
     this.onPressed,
   });
 
-  final Widget child;
-  final VoidCallback onPressed;
+  final Widget? child;
+  final VoidCallback? onPressed;
 
   @override
   Widget build(BuildContext context) {
@@ -436,7 +436,7 @@
           height: 56.0,
           child: IconTheme.merge(
             data: IconThemeData(color: Theme.of(context).accentIconTheme.color),
-            child: child,
+            child: child!,
           ),
         ),
       ),
@@ -449,8 +449,8 @@
   const _DiamondNotchedRectangle();
 
   @override
-  Path getOuterPath(Rect host, Rect guest) {
-    if (!host.overlaps(guest))
+  Path getOuterPath(Rect host, Rect? guest) {
+    if (!host.overlaps(guest!))
       return Path()..addRect(host);
     assert(guest.width > 0.0);
 
@@ -492,12 +492,12 @@
   }
 
   @override
-  Path getInnerPath(Rect rect, { TextDirection textDirection }) {
+  Path getInnerPath(Rect rect, { TextDirection? textDirection }) {
     return getOuterPath(rect, textDirection: textDirection);
   }
 
   @override
-  Path getOuterPath(Rect rect, { TextDirection textDirection }) {
+  Path getOuterPath(Rect rect, { TextDirection? textDirection }) {
     return Path()
       ..moveTo(rect.left + rect.width / 2.0, rect.top)
       ..lineTo(rect.right, rect.top + rect.height / 2.0)
@@ -507,11 +507,11 @@
   }
 
   @override
-  void paint(Canvas canvas, Rect rect, { TextDirection textDirection }) { }
+  void paint(Canvas canvas, Rect rect, { TextDirection? textDirection }) { }
 
   // This border doesn't support scaling.
   @override
   ShapeBorder scale(double t) {
-    return null;
+    return this;
   }
 }
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart
index 838c60a..67d8ea0 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/bottom_navigation_demo.dart
@@ -8,11 +8,11 @@
 
 class NavigationIconView {
   NavigationIconView({
-    Widget icon,
-    Widget activeIcon,
-    String title,
-    Color color,
-    TickerProvider vsync,
+    required Widget icon,
+    Widget? activeIcon,
+    String? title,
+    Color? color,
+    required TickerProvider vsync,
   }) : _icon = icon,
        _color = color,
        _title = title,
@@ -32,14 +32,14 @@
   }
 
   final Widget _icon;
-  final Color _color;
-  final String _title;
+  final Color? _color;
+  final String? _title;
   final BottomNavigationBarItem item;
   final AnimationController controller;
-  Animation<double> _animation;
+  late Animation<double> _animation;
 
   FadeTransition transition(BottomNavigationBarType type, BuildContext context) {
-    Color iconColor;
+    Color? iconColor;
     if (type == BottomNavigationBarType.shifting) {
       iconColor = _color;
     } else {
@@ -79,8 +79,8 @@
     final IconThemeData iconTheme = IconTheme.of(context);
     return Container(
       margin: const EdgeInsets.all(4.0),
-      width: iconTheme.size - 8.0,
-      height: iconTheme.size - 8.0,
+      width: iconTheme.size! - 8.0,
+      height: iconTheme.size! - 8.0,
       color: iconTheme.color,
     );
   }
@@ -92,10 +92,10 @@
     final IconThemeData iconTheme = IconTheme.of(context);
     return Container(
       margin: const EdgeInsets.all(4.0),
-      width: iconTheme.size - 8.0,
-      height: iconTheme.size - 8.0,
+      width: iconTheme.size! - 8.0,
+      height: iconTheme.size! - 8.0,
       decoration: BoxDecoration(
-        border: Border.all(color: iconTheme.color, width: 2.0),
+        border: Border.all(color: iconTheme.color!, width: 2.0),
       ),
     );
   }
@@ -112,7 +112,7 @@
     with TickerProviderStateMixin {
   int _currentIndex = 0;
   BottomNavigationBarType _type = BottomNavigationBarType.shifting;
-  List<NavigationIconView> _navigationViews;
+  late List<NavigationIconView> _navigationViews;
 
   @override
   void initState() {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/buttons_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/buttons_demo.dart
index b73b114..186a83e 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/buttons_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/buttons_demo.dart
@@ -53,7 +53,7 @@
 }
 
 class _ButtonsDemoState extends State<ButtonsDemo> {
-  OutlinedBorder _buttonShape;
+  OutlinedBorder? _buttonShape;
 
   @override
   Widget build(BuildContext context) {
@@ -118,7 +118,7 @@
     );
   }
 
-  Widget buildElevatedButton(OutlinedBorder shape) {
+  Widget buildElevatedButton(OutlinedBorder? shape) {
     final ButtonStyle style = ElevatedButton.styleFrom(shape: shape);
     return Align(
       alignment: const Alignment(0.0, -0.2),
@@ -156,7 +156,7 @@
                 style: style,
                 icon: const Icon(Icons.add, size: 18.0),
                 label: const Text('DISABLED', semanticsLabel: 'DISABLED BUTTON 2'),
-                onPressed: null,
+                onPressed: () {},
               ),
             ],
           ),
@@ -165,7 +165,7 @@
     );
   }
 
-  Widget buildTextButton(OutlinedBorder shape) {
+  Widget buildTextButton(OutlinedBorder? shape) {
     final ButtonStyle style = ElevatedButton.styleFrom(shape: shape);
     return Align(
       alignment: const Alignment(0.0, -0.2),
@@ -203,7 +203,7 @@
                 style: style,
                 icon: const Icon(Icons.add_circle_outline, size: 18.0),
                 label: const Text('DISABLED', semanticsLabel: 'DISABLED BUTTON 4'),
-                onPressed: null,
+                onPressed: () {},
               ),
             ],
           ),
@@ -212,7 +212,7 @@
     );
   }
 
-  Widget buildOutlinedButton(OutlinedBorder shape) {
+  Widget buildOutlinedButton(OutlinedBorder? shape) {
     final ButtonStyle style = ElevatedButton.styleFrom(shape: shape);
     return Align(
       alignment: const Alignment(0.0, -0.2),
@@ -260,9 +260,9 @@
   }
 
   // https://en.wikipedia.org/wiki/Free_Four
-  String dropdown1Value = 'Free';
-  String dropdown2Value;
-  String dropdown3Value = 'Four';
+  String? dropdown1Value = 'Free';
+  String? dropdown2Value;
+  String? dropdown3Value = 'Four';
 
   Widget buildDropdownButton() {
     return Padding(
@@ -274,7 +274,7 @@
             title: const Text('Simple dropdown:'),
             trailing: DropdownButton<String>(
               value: dropdown1Value,
-              onChanged: (String newValue) {
+              onChanged: (String? newValue) {
                 setState(() {
                   dropdown1Value = newValue;
                 });
@@ -295,7 +295,7 @@
             trailing: DropdownButton<String>(
               value: dropdown2Value,
               hint: const Text('Choose'),
-              onChanged: (String newValue) {
+              onChanged: (String? newValue) {
                 setState(() {
                   dropdown2Value = newValue;
                 });
@@ -315,7 +315,7 @@
             title: const Text('Scrollable dropdown:'),
             trailing: DropdownButton<String>(
               value: dropdown3Value,
-              onChanged: (String newValue) {
+              onChanged: (String? newValue) {
                 setState(() {
                   dropdown3Value = newValue;
                 });
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/cards_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/cards_demo.dart
index 60ccc6e..8233c51 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/cards_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/cards_demo.dart
@@ -17,19 +17,14 @@
 
 class TravelDestination {
   const TravelDestination({
-    @required this.assetName,
-    @required this.assetPackage,
-    @required this.title,
-    @required this.description,
-    @required this.city,
-    @required this.location,
+    required this.assetName,
+    required this.assetPackage,
+    required this.title,
+    required this.description,
+    required this.city,
+    required this.location,
     this.type = CardDemoType.standard,
-  }) : assert(assetName != null),
-       assert(assetPackage != null),
-       assert(title != null),
-       assert(description != null),
-       assert(city != null),
-       assert(location != null);
+  });
 
   final String assetName;
   final String assetPackage;
@@ -70,14 +65,13 @@
 ];
 
 class TravelDestinationItem extends StatelessWidget {
-  const TravelDestinationItem({ Key key, @required this.destination, this.shape })
-    : assert(destination != null),
-      super(key: key);
+  const TravelDestinationItem({ Key? key, required this.destination, this.shape })
+    : super(key: key);
 
   // This height will allow for all the Card's content to fit comfortably within the card.
   static const double height = 338.0;
   final TravelDestination destination;
-  final ShapeBorder shape;
+  final ShapeBorder? shape;
 
   @override
   Widget build(BuildContext context) {
@@ -106,14 +100,13 @@
 }
 
 class TappableTravelDestinationItem extends StatelessWidget {
-  const TappableTravelDestinationItem({ Key key, @required this.destination, this.shape })
-    : assert(destination != null),
-      super(key: key);
+  const TappableTravelDestinationItem({ Key? key, required this.destination, this.shape })
+    : super(key: key);
 
   // This height will allow for all the Card's content to fit comfortably within the card.
   static const double height = 298.0;
   final TravelDestination destination;
-  final ShapeBorder shape;
+  final ShapeBorder? shape;
 
   @override
   Widget build(BuildContext context) {
@@ -151,12 +144,11 @@
 }
 
 class SelectableTravelDestinationItem extends StatefulWidget {
-  const SelectableTravelDestinationItem({ Key key, @required this.destination, this.shape })
-    : assert(destination != null),
-      super(key: key);
+  const SelectableTravelDestinationItem({ Key? key, required this.destination, this.shape })
+    : super(key: key);
 
   final TravelDestination destination;
-  final ShapeBorder shape;
+  final ShapeBorder? shape;
 
   @override
   _SelectableTravelDestinationItemState createState() => _SelectableTravelDestinationItemState();
@@ -231,11 +223,11 @@
 
 class SectionTitle extends StatelessWidget {
   const SectionTitle({
-    Key key,
+    Key? key,
     this.title,
   }) : super(key: key);
 
-  final String title;
+  final String? title;
 
   @override
   Widget build(BuildContext context) {
@@ -243,24 +235,23 @@
       padding: const EdgeInsets.fromLTRB(4.0, 4.0, 4.0, 12.0),
       child: Align(
         alignment: Alignment.centerLeft,
-        child: Text(title, style: Theme.of(context).textTheme.subtitle1),
+        child: Text(title!, style: Theme.of(context).textTheme.subtitle1),
       ),
     );
   }
 }
 
 class TravelDestinationContent extends StatelessWidget {
-  const TravelDestinationContent({ Key key, @required this.destination })
-    : assert(destination != null),
-      super(key: key);
+  const TravelDestinationContent({ Key? key, required this.destination })
+    : super(key: key);
 
   final TravelDestination destination;
 
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
-    final TextStyle titleStyle = theme.textTheme.headline5.copyWith(color: Colors.white);
-    final TextStyle descriptionStyle = theme.textTheme.subtitle1;
+    final TextStyle titleStyle = theme.textTheme.headline5!.copyWith(color: Colors.white);
+    final TextStyle descriptionStyle = theme.textTheme.subtitle1!;
     final ButtonStyle textButtonStyle = TextButton.styleFrom(primary: Colors.amber.shade500);
 
     return Column(
@@ -352,7 +343,7 @@
 }
 
 class _CardsDemoState extends State<CardsDemo> {
-  ShapeBorder _shape;
+  ShapeBorder? _shape;
 
   @override
   Widget build(BuildContext context) {
@@ -385,7 +376,7 @@
         child: ListView(
           padding: const EdgeInsets.only(top: 8.0, left: 8.0, right: 8.0),
           children: destinations.map<Widget>((TravelDestination destination) {
-            Widget child;
+            Widget? child;
             switch (destination.type) {
               case CardDemoType.standard:
                 child = TravelDestinationItem(destination: destination, shape: _shape);
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/chip_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/chip_demo.dart
index 8ec3515..935015b 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/chip_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/chip_demo.dart
@@ -88,13 +88,13 @@
 
 class _ChipsTile extends StatelessWidget {
   const _ChipsTile({
-    Key key,
+    Key? key,
     this.label,
     this.children,
   }) : super(key: key);
 
-  final String label;
-  final List<Widget> children;
+  final String? label;
+  final List<Widget>? children;
 
   // Wraps a list of chips into a ListTile for display as a section in the demo.
   @override
@@ -107,11 +107,11 @@
           Container(
             padding: const EdgeInsets.only(top: 16.0, bottom: 4.0),
             alignment: Alignment.center,
-            child: Text(label, textAlign: TextAlign.start),
+            child: Text(label!, textAlign: TextAlign.start),
           ),
-          if (children.isNotEmpty)
+          if (children!.isNotEmpty)
             Wrap(
-              children: children.map<Widget>((Widget chip) {
+              children: children!.map<Widget>((Widget chip) {
                 return Padding(
                   padding: const EdgeInsets.all(2.0),
                   child: chip,
@@ -125,7 +125,7 @@
                 alignment: Alignment.center,
                 constraints: const BoxConstraints(minWidth: 48.0, minHeight: 48.0),
                 padding: const EdgeInsets.all(8.0),
-                child: Text('None', style: Theme.of(context).textTheme.caption.copyWith(fontStyle: FontStyle.italic)),
+                child: Text('None', style: Theme.of(context).textTheme.caption!.copyWith(fontStyle: FontStyle.italic)),
               ),
             ),
         ],
@@ -188,7 +188,7 @@
   }
 
   String _capitalize(String name) {
-    assert(name != null && name.isNotEmpty);
+    assert(name.isNotEmpty);
     return name.substring(0, 1).toUpperCase() + name.substring(1);
   }
 
@@ -209,7 +209,7 @@
   AssetImage _nameToAvatar(String name) {
     assert(_avatars.containsKey(name));
     return AssetImage(
-      _avatars[name],
+      _avatars[name]!,
       package: 'flutter_gallery_assets',
     );
   }
@@ -218,7 +218,7 @@
     if (_selectedAction.isEmpty) {
       return '';
     }
-    return _capitalize(_results[_selectedAction]) + '!';
+    return _capitalize(_results[_selectedAction]!) + '!';
   }
 
   @override
@@ -285,11 +285,11 @@
     }).toList();
 
     Set<String> allowedActions = <String>{};
-    if (_selectedMaterial != null && _selectedMaterial.isNotEmpty) {
+    if (_selectedMaterial.isNotEmpty) {
       for (final String tool in _selectedTools) {
-        allowedActions.addAll(_toolActions[tool]);
+        allowedActions.addAll(_toolActions[tool]!);
       }
-      allowedActions = allowedActions.intersection(_materialActions[_selectedMaterial]);
+      allowedActions = allowedActions.intersection(_materialActions[_selectedMaterial]!);
     }
 
     final List<Widget> actionChips = allowedActions.map<Widget>((String name) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/data_table_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/data_table_demo.dart
index 07f090c..51747dd 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/data_table_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/data_table_demo.dart
@@ -18,7 +18,7 @@
   final int calcium;
   final int iron;
 
-  bool selected = false;
+  bool? selected = false;
 }
 
 class DessertDataSource extends DataTableSource {
@@ -96,17 +96,17 @@
   int _selectedCount = 0;
 
   @override
-  DataRow getRow(int index) {
+  DataRow? getRow(int index) {
     assert(index >= 0);
     if (index >= _desserts.length)
       return null;
     final Dessert dessert = _desserts[index];
     return DataRow.byIndex(
       index: index,
-      selected: dessert.selected,
-      onSelectChanged: (bool value) {
+      selected: dessert.selected!,
+      onSelectChanged: (bool? value) {
         if (dessert.selected != value) {
-          _selectedCount += value ? 1 : -1;
+          _selectedCount += value! ? 1 : -1;
           assert(_selectedCount >= 0);
           dessert.selected = value;
           notifyListeners();
@@ -134,10 +134,10 @@
   @override
   int get selectedRowCount => _selectedCount;
 
-  void _selectAll(bool checked) {
+  void _selectAll(bool? checked) {
     for (final Dessert dessert in _desserts)
       dessert.selected = checked;
-    _selectedCount = checked ? _desserts.length : 0;
+    _selectedCount = checked! ? _desserts.length : 0;
     notifyListeners();
   }
 }
@@ -150,8 +150,8 @@
 }
 
 class _DataTableDemoState extends State<DataTableDemo> {
-  int _rowsPerPage = PaginatedDataTable.defaultRowsPerPage;
-  int _sortColumnIndex;
+  int? _rowsPerPage = PaginatedDataTable.defaultRowsPerPage;
+  int? _sortColumnIndex;
   bool _sortAscending = true;
   final DessertDataSource _dessertsDataSource = DessertDataSource();
 
@@ -178,8 +178,8 @@
           children: <Widget>[
             PaginatedDataTable(
               header: const Text('Nutrition'),
-              rowsPerPage: _rowsPerPage,
-              onRowsPerPageChanged: (int value) { setState(() { _rowsPerPage = value; }); },
+              rowsPerPage: _rowsPerPage!,
+              onRowsPerPageChanged: (int? value) { setState(() { _rowsPerPage = value; }); },
               sortColumnIndex: _sortColumnIndex,
               sortAscending: _sortAscending,
               onSelectAll: _dessertsDataSource._selectAll,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
index 33307c2..3c89b74 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
@@ -9,7 +9,7 @@
 
 class _InputDropdown extends StatelessWidget {
   const _InputDropdown({
-    Key key,
+    Key? key,
     this.child,
     this.labelText,
     this.valueText,
@@ -17,11 +17,11 @@
     this.onPressed,
   }) : super(key: key);
 
-  final String labelText;
-  final String valueText;
-  final TextStyle valueStyle;
-  final VoidCallback onPressed;
-  final Widget child;
+  final String? labelText;
+  final String? valueText;
+  final TextStyle? valueStyle;
+  final VoidCallback? onPressed;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -36,7 +36,7 @@
           mainAxisAlignment: MainAxisAlignment.spaceBetween,
           mainAxisSize: MainAxisSize.min,
           children: <Widget>[
-            Text(valueText, style: valueStyle),
+            Text(valueText!, style: valueStyle),
             Icon(Icons.arrow_drop_down,
               color: Theme.of(context).brightness == Brightness.light ? Colors.grey.shade700 : Colors.white70,
             ),
@@ -49,7 +49,7 @@
 
 class _DateTimePicker extends StatelessWidget {
   const _DateTimePicker({
-    Key key,
+    Key? key,
     this.labelText,
     this.selectedDate,
     this.selectedTime,
@@ -57,35 +57,35 @@
     this.selectTime,
   }) : super(key: key);
 
-  final String labelText;
-  final DateTime selectedDate;
-  final TimeOfDay selectedTime;
-  final ValueChanged<DateTime> selectDate;
-  final ValueChanged<TimeOfDay> selectTime;
+  final String? labelText;
+  final DateTime? selectedDate;
+  final TimeOfDay? selectedTime;
+  final ValueChanged<DateTime>? selectDate;
+  final ValueChanged<TimeOfDay>? selectTime;
 
   Future<void> _selectDate(BuildContext context) async {
-    final DateTime picked = await showDatePicker(
+    final DateTime? picked = await showDatePicker(
       context: context,
-      initialDate: selectedDate,
+      initialDate: selectedDate!,
       firstDate: DateTime(2015, 8),
       lastDate: DateTime(2101),
     );
     if (picked != null && picked != selectedDate)
-      selectDate(picked);
+      selectDate!(picked);
   }
 
   Future<void> _selectTime(BuildContext context) async {
-    final TimeOfDay picked = await showTimePicker(
+    final TimeOfDay? picked = await showTimePicker(
       context: context,
-      initialTime: selectedTime,
+      initialTime: selectedTime!,
     );
     if (picked != null && picked != selectedTime)
-      selectTime(picked);
+      selectTime!(picked);
   }
 
   @override
   Widget build(BuildContext context) {
-    final TextStyle valueStyle = Theme.of(context).textTheme.headline6;
+    final TextStyle? valueStyle = Theme.of(context).textTheme.headline6;
     return Row(
       crossAxisAlignment: CrossAxisAlignment.end,
       children: <Widget>[
@@ -93,7 +93,7 @@
           flex: 4,
           child: _InputDropdown(
             labelText: labelText,
-            valueText: DateFormat.yMMMd().format(selectedDate),
+            valueText: DateFormat.yMMMd().format(selectedDate!),
             valueStyle: valueStyle,
             onPressed: () { _selectDate(context); },
           ),
@@ -102,7 +102,7 @@
         Expanded(
           flex: 3,
           child: _InputDropdown(
-            valueText: selectedTime.format(context),
+            valueText: selectedTime!.format(context),
             valueStyle: valueStyle,
             onPressed: () { _selectTime(context); },
           ),
@@ -125,7 +125,7 @@
   DateTime _toDate = DateTime.now();
   TimeOfDay _toTime = const TimeOfDay(hour: 8, minute: 28);
   final List<String> _allActivities = <String>['hiking', 'swimming', 'boating', 'fishing'];
-  String _activity = 'fishing';
+  String? _activity = 'fishing';
 
   @override
   Widget build(BuildContext context) {
@@ -153,7 +153,7 @@
                 decoration: const InputDecoration(
                   labelText: 'Location',
                 ),
-                style: Theme.of(context).textTheme.headline4.copyWith(fontSize: 20.0),
+                style: Theme.of(context).textTheme.headline4!.copyWith(fontSize: 20.0),
               ),
               _DateTimePicker(
                 labelText: 'From',
@@ -195,7 +195,7 @@
                 isEmpty: _activity == null,
                 child: DropdownButton<String>(
                   value: _activity,
-                  onChanged: (String newValue) {
+                  onChanged: (String? newValue) {
                     setState(() {
                       _activity = newValue;
                     });
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/dialog_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/dialog_demo.dart
index 0561ec7..b2fe440 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/dialog_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/dialog_demo.dart
@@ -21,12 +21,12 @@
   'data to Google, even when no apps are running.';
 
 class DialogDemoItem extends StatelessWidget {
-  const DialogDemoItem({ Key key, this.icon, this.color, this.text, this.onPressed }) : super(key: key);
+  const DialogDemoItem({ Key? key, this.icon, this.color, this.text, this.onPressed }) : super(key: key);
 
-  final IconData icon;
-  final Color color;
-  final String text;
-  final VoidCallback onPressed;
+  final IconData? icon;
+  final Color? color;
+  final String? text;
+  final VoidCallback? onPressed;
 
   @override
   Widget build(BuildContext context) {
@@ -39,7 +39,7 @@
           Icon(icon, size: 36.0, color: color),
           Padding(
             padding: const EdgeInsets.only(left: 16.0),
-            child: Text(text),
+            child: Text(text!),
           ),
         ],
       ),
@@ -56,7 +56,7 @@
 
 class DialogDemoState extends State<DialogDemo> {
 
-  TimeOfDay _selectedTime;
+  TimeOfDay? _selectedTime;
 
   @override
   void initState() {
@@ -65,12 +65,12 @@
     _selectedTime = TimeOfDay(hour: now.hour, minute: now.minute);
   }
 
-  void showDemoDialog<T>({ BuildContext context, Widget child }) {
+  void showDemoDialog<T>({ required BuildContext context, Widget? child }) {
     showDialog<T>(
       context: context,
-      builder: (BuildContext context) => child,
+      builder: (BuildContext context) => child!,
     )
-    .then<void>((T value) { // The value passed to Navigator.pop() or null.
+    .then((T? value) { // The value passed to Navigator.pop() or null.
       if (value != null) {
         ScaffoldMessenger.of(context).showSnackBar(SnackBar(
           content: Text('You selected: $value'),
@@ -82,7 +82,7 @@
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
-    final TextStyle dialogTextStyle = theme.textTheme.subtitle1.copyWith(color: theme.textTheme.caption.color);
+    final TextStyle dialogTextStyle = theme.textTheme.subtitle1!.copyWith(color: theme.textTheme.caption!.color);
 
     return Scaffold(
       appBar: AppBar(
@@ -176,9 +176,9 @@
             onPressed: () {
               showTimePicker(
                 context: context,
-                initialTime: _selectedTime,
+                initialTime: _selectedTime!,
               )
-              .then<void>((TimeOfDay value) {
+              .then((TimeOfDay? value) {
                 if (value != null && value != _selectedTime) {
                   _selectedTime = value;
                   ScaffoldMessenger.of(context).showSnackBar(SnackBar(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/drawer_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/drawer_demo.dart
index 22c7a64..841a1e3 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/drawer_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/drawer_demo.dart
@@ -33,9 +33,9 @@
     curve: Curves.fastOutSlowIn,
   ));
 
-  AnimationController _controller;
-  Animation<double> _drawerContentsOpacity;
-  Animation<Offset> _drawerDetailsPosition;
+  late AnimationController _controller;
+  late Animation<double> _drawerContentsOpacity;
+  late Animation<Offset> _drawerDetailsPosition;
   bool _showDrawerContents = true;
 
   @override
@@ -58,7 +58,7 @@
     super.dispose();
   }
 
-  IconData _backIcon() {
+  IconData? _backIcon() {
     switch (Theme.of(context).platform) {
       case TargetPlatform.android:
       case TargetPlatform.fuchsia:
@@ -69,8 +69,6 @@
       case TargetPlatform.macOS:
         return Icons.arrow_back_ios;
     }
-    assert(false);
-    return null;
   }
 
   void _showNotImplementedMessage() {
@@ -211,7 +209,7 @@
       body: Center(
         child: InkWell(
           onTap: () {
-            _scaffoldKey.currentState.openDrawer();
+            _scaffoldKey.currentState!.openDrawer();
           },
           child: Semantics(
             button: true,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/expansion_panels_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
index 710905e..f76f861 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/expansion_panels_demo.dart
@@ -14,7 +14,7 @@
 }
 
 typedef DemoItemBodyBuilder<T> = Widget Function(DemoItem<T> item);
-typedef ValueToString<T> = String Function(T value);
+typedef ValueToString<T> = String? Function(T value);
 
 class DualHeaderWithHint extends StatelessWidget {
   const DualHeaderWithHint({
@@ -24,10 +24,10 @@
     this.showHint,
   });
 
-  final String name;
-  final String value;
-  final String hint;
-  final bool showHint;
+  final String? name;
+  final String? value;
+  final String? hint;
+  final bool? showHint;
 
   Widget _crossFade(Widget first, Widget second, bool isExpanded) {
     return AnimatedCrossFade(
@@ -56,8 +56,8 @@
               fit: BoxFit.scaleDown,
               alignment: Alignment.centerLeft,
               child: Text(
-                name,
-                style: textTheme.bodyText2.copyWith(fontSize: 15.0),
+                name!,
+                style: textTheme.bodyText2!.copyWith(fontSize: 15.0),
               ),
             ),
           ),
@@ -67,9 +67,9 @@
           child: Container(
             margin: const EdgeInsets.only(left: 24.0),
             child: _crossFade(
-              Text(value, style: textTheme.caption.copyWith(fontSize: 15.0)),
-              Text(hint, style: textTheme.caption.copyWith(fontSize: 15.0)),
-              showHint,
+              Text(value!, style: textTheme.caption!.copyWith(fontSize: 15.0)),
+              Text(hint!, style: textTheme.caption!.copyWith(fontSize: 15.0)),
+              showHint!,
             ),
           ),
         ),
@@ -87,9 +87,9 @@
   });
 
   final EdgeInsets margin;
-  final Widget child;
-  final VoidCallback onSave;
-  final VoidCallback onCancel;
+  final Widget? child;
+  final VoidCallback? onSave;
+  final VoidCallback? onCancel;
 
   @override
   Widget build(BuildContext context) {
@@ -106,8 +106,8 @@
           ) - margin,
           child: Center(
             child: DefaultTextStyle(
-              style: textTheme.caption.copyWith(fontSize: 15.0),
-              child: child,
+              style: textTheme.caption!.copyWith(fontSize: 15.0),
+              child: child!,
             ),
           ),
         ),
@@ -149,15 +149,15 @@
     this.value,
     this.hint,
     this.builder,
-    this.valueToString,
+    required this.valueToString,
   }) : textController = TextEditingController(text: valueToString(value));
 
-  final String name;
-  final String hint;
+  final String? name;
+  final String? hint;
   final TextEditingController textController;
-  final DemoItemBodyBuilder<T> builder;
-  final ValueToString<T> valueToString;
-  T value;
+  final DemoItemBodyBuilder<T>? builder;
+  final ValueToString<T?> valueToString;
+  T? value;
   bool isExpanded = false;
 
   ExpansionPanelHeaderBuilder get headerBuilder {
@@ -171,7 +171,7 @@
     };
   }
 
-  Widget build() => builder(this);
+  Widget build() => builder!(this);
 }
 
 class ExpansionPanelsDemo extends StatefulWidget {
@@ -182,7 +182,7 @@
 }
 
 class _ExpansionPanelsDemoState extends State<ExpansionPanelsDemo> {
-  List<DemoItem<dynamic>> _demoItems;
+  late List<DemoItem<dynamic>> _demoItems;
 
   @override
   void initState() {
@@ -193,7 +193,7 @@
         name: 'Trip',
         value: 'Caribbean cruise',
         hint: 'Change trip name',
-        valueToString: (String value) => value,
+        valueToString: (String? value) => value,
         builder: (DemoItem<String> item) {
           void close() {
             setState(() {
@@ -206,8 +206,8 @@
               builder: (BuildContext context) {
                 return CollapsibleBody(
                   margin: const EdgeInsets.symmetric(horizontal: 16.0),
-                  onSave: () { Form.of(context).save(); close(); },
-                  onCancel: () { Form.of(context).reset(); close(); },
+                  onSave: () { Form.of(context)!.save(); close(); },
+                  onCancel: () { Form.of(context)!.reset(); close(); },
                   child: Padding(
                     padding: const EdgeInsets.symmetric(horizontal: 16.0),
                     child: TextFormField(
@@ -216,7 +216,7 @@
                         hintText: item.hint,
                         labelText: item.name,
                       ),
-                      onSaved: (String value) { item.value = value; },
+                      onSaved: (String? value) { item.value = value; },
                     ),
                   ),
                 );
@@ -229,7 +229,7 @@
         name: 'Location',
         value: Location.Bahamas,
         hint: 'Select location',
-        valueToString: (Location location) => location.toString().split('.')[1],
+        valueToString: (Location? location) => location.toString().split('.')[1],
         builder: (DemoItem<Location> item) {
           void close() {
             setState(() {
@@ -240,11 +240,11 @@
             child: Builder(
               builder: (BuildContext context) {
                 return CollapsibleBody(
-                  onSave: () { Form.of(context).save(); close(); },
-                  onCancel: () { Form.of(context).reset(); close(); },
+                  onSave: () { Form.of(context)!.save(); close(); },
+                  onCancel: () { Form.of(context)!.reset(); close(); },
                   child: FormField<Location>(
                     initialValue: item.value,
-                    onSaved: (Location result) { item.value = result; },
+                    onSaved: (Location? result) { item.value = result; },
                     builder: (FormFieldState<Location> field) {
                       return Column(
                         mainAxisSize: MainAxisSize.min,
@@ -282,7 +282,7 @@
         name: 'Sun',
         value: 80.0,
         hint: 'Select sun level',
-        valueToString: (double amount) => '${amount.round()}',
+        valueToString: (double? amount) => '${amount!.round()}',
         builder: (DemoItem<double> item) {
           void close() {
             setState(() {
@@ -294,11 +294,11 @@
             child: Builder(
               builder: (BuildContext context) {
                 return CollapsibleBody(
-                  onSave: () { Form.of(context).save(); close(); },
-                  onCancel: () { Form.of(context).reset(); close(); },
+                  onSave: () { Form.of(context)!.save(); close(); },
+                  onCancel: () { Form.of(context)!.reset(); close(); },
                   child: FormField<double>(
                     initialValue: item.value,
-                    onSaved: (double value) { item.value = value; },
+                    onSaved: (double? value) { item.value = value; },
                     builder: (FormFieldState<double> field) {
                       return Container(
                         // Allow room for the value indicator.
@@ -307,9 +307,9 @@
                           min: 0.0,
                           max: 100.0,
                           divisions: 5,
-                          activeColor: Colors.orange[100 + (field.value * 5.0).round()],
-                          label: '${field.value.round()}',
-                          value: field.value,
+                          activeColor: Colors.orange[100 + (field.value! * 5.0).round()],
+                          label: '${field.value!.round()}',
+                          value: field.value!,
                           onChanged: field.didChange,
                         ),
                       );
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
index cf341b4..5aefbec 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
@@ -15,9 +15,8 @@
 }
 
 class DateTimeItem extends StatelessWidget {
-  DateTimeItem({ Key key, DateTime dateTime, @required this.onChanged })
-    : assert(onChanged != null),
-      date = DateTime(dateTime.year, dateTime.month, dateTime.day),
+  DateTimeItem({ Key? key, required DateTime dateTime, required this.onChanged })
+    : date = DateTime(dateTime.year, dateTime.month, dateTime.day),
       time = TimeOfDay(hour: dateTime.hour, minute: dateTime.minute),
       super(key: key);
 
@@ -30,7 +29,7 @@
     final ThemeData theme = Theme.of(context);
 
     return DefaultTextStyle(
-      style: theme.textTheme.subtitle1,
+      style: theme.textTheme.subtitle1!,
       child: Row(
         children: <Widget>[
           Expanded(
@@ -47,7 +46,7 @@
                     firstDate: date.subtract(const Duration(days: 30)),
                     lastDate: date.add(const Duration(days: 30)),
                   )
-                  .then<void>((DateTime value) {
+                  .then((DateTime? value) {
                     if (value != null)
                       onChanged(DateTime(value.year, value.month, value.day, time.hour, time.minute));
                   });
@@ -74,7 +73,7 @@
                   context: context,
                   initialTime: time,
                 )
-                .then<void>((TimeOfDay value) {
+                .then((TimeOfDay? value) {
                   if (value != null)
                     onChanged(DateTime(date.year, date.month, date.day, value.hour, value.minute));
                 });
@@ -101,11 +100,11 @@
 class FullScreenDialogDemoState extends State<FullScreenDialogDemo> {
   DateTime _fromDateTime = DateTime.now();
   DateTime _toDateTime = DateTime.now();
-  bool _allDayValue = false;
+  bool? _allDayValue = false;
   bool _saveNeeded = false;
   bool _hasLocation = false;
   bool _hasName = false;
-  String _eventName;
+  late String _eventName;
 
   Future<bool> _onWillPop() async {
     _saveNeeded = _hasLocation || _hasName || _saveNeeded;
@@ -113,9 +112,9 @@
       return true;
 
     final ThemeData theme = Theme.of(context);
-    final TextStyle dialogTextStyle = theme.textTheme.subtitle1.copyWith(color: theme.textTheme.caption.color);
+    final TextStyle dialogTextStyle = theme.textTheme.subtitle1!.copyWith(color: theme.textTheme.caption!.color);
 
-    return await showDialog<bool>(
+    return await (showDialog<bool>(
       context: context,
       builder: (BuildContext context) {
         return AlertDialog(
@@ -127,19 +126,19 @@
             TextButton(
               child: const Text('CANCEL'),
               onPressed: () {
-                Navigator.of(context).pop(false); // Pops the confirmation dialog but not the page.
+                Navigator.of(context)!.pop(false); // Pops the confirmation dialog but not the page.
               },
             ),
             TextButton(
               child: const Text('DISCARD'),
               onPressed: () {
-                Navigator.of(context).pop(true); // Returning true to _onWillPop will pop again.
+                Navigator.of(context)!.pop(true); // Returning true to _onWillPop will pop again.
               },
             ),
           ],
         );
       },
-    ) ?? false;
+    ) as Future<bool>);
   }
 
   @override
@@ -151,7 +150,7 @@
         title: Text(_hasName ? _eventName : 'Event Name TBD'),
         actions: <Widget> [
           TextButton(
-            child: Text('SAVE', style: theme.textTheme.bodyText2.copyWith(color: Colors.white)),
+            child: Text('SAVE', style: theme.textTheme.bodyText2!.copyWith(color: Colors.white)),
             onPressed: () {
               Navigator.pop(context, DismissDialogAction.save);
             },
@@ -238,7 +237,7 @@
                   children: <Widget> [
                     Checkbox(
                       value: _allDayValue,
-                      onChanged: (bool value) {
+                      onChanged: (bool? value) {
                         setState(() {
                           _allDayValue = value;
                           _saveNeeded = true;
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/grid_list_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/grid_list_demo.dart
index 8c8144b..bc887ce 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/grid_list_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/grid_list_demo.dart
@@ -26,21 +26,21 @@
     this.isFavorite = false,
   });
 
-  final String assetName;
-  final String assetPackage;
-  final String title;
-  final String caption;
+  final String? assetName;
+  final String? assetPackage;
+  final String? title;
+  final String? caption;
 
   bool isFavorite;
-  String get tag => assetName; // Assuming that all asset names are unique.
+  String? get tag => assetName; // Assuming that all asset names are unique.
 
-  bool get isValid => assetName != null && title != null && caption != null && isFavorite != null;
+  bool get isValid => assetName != null && title != null && caption != null;
 }
 
 class GridPhotoViewer extends StatefulWidget {
-  const GridPhotoViewer({ Key key, this.photo }) : super(key: key);
+  const GridPhotoViewer({ Key? key, this.photo }) : super(key: key);
 
-  final Photo photo;
+  final Photo? photo;
 
   @override
   _GridPhotoViewerState createState() => _GridPhotoViewerState();
@@ -49,25 +49,25 @@
 class _GridTitleText extends StatelessWidget {
   const _GridTitleText(this.text);
 
-  final String text;
+  final String? text;
 
   @override
   Widget build(BuildContext context) {
     return FittedBox(
       fit: BoxFit.scaleDown,
       alignment: Alignment.centerLeft,
-      child: Text(text),
+      child: Text(text!),
     );
   }
 }
 
 class _GridPhotoViewerState extends State<GridPhotoViewer> with SingleTickerProviderStateMixin {
-  AnimationController _controller;
-  Animation<Offset> _flingAnimation;
+  late AnimationController _controller;
+  late Animation<Offset> _flingAnimation;
   Offset _offset = Offset.zero;
   double _scale = 1.0;
-  Offset _normalizedOffset;
-  double _previousScale;
+  late Offset _normalizedOffset;
+  late double _previousScale;
 
   @override
   void initState() {
@@ -85,11 +85,11 @@
   // The maximum offset value is 0,0. If the size of this renderer's box is w,h
   // then the minimum offset value is w - _scale * w, h - _scale * h.
   Offset _clampOffset(Offset offset) {
-    final Size size = context.size;
+    final Size size = context.size!;
     final Offset minOffset = Offset(size.width, size.height) * (1.0 - _scale);
     return Offset(
-      offset.dx.clamp(minOffset.dx, 0.0) as double,
-      offset.dy.clamp(minOffset.dy, 0.0) as double,
+      offset.dx.clamp(minOffset.dx, 0.0),
+      offset.dy.clamp(minOffset.dy, 0.0),
     );
   }
 
@@ -110,7 +110,7 @@
 
   void _handleOnScaleUpdate(ScaleUpdateDetails details) {
     setState(() {
-      _scale = (_previousScale * details.scale).clamp(1.0, 4.0) as double;
+      _scale = (_previousScale * details.scale).clamp(1.0, 4.0);
       // Ensure that image location under the focal point stays in the same place despite scaling.
       _offset = _clampOffset(details.focalPoint - _normalizedOffset * _scale);
     });
@@ -121,7 +121,7 @@
     if (magnitude < _kMinFlingVelocity)
       return;
     final Offset direction = details.velocity.pixelsPerSecond / magnitude;
-    final double distance = (Offset.zero & context.size).shortestSide;
+    final double distance = (Offset.zero & context.size!).shortestSide;
     _flingAnimation = _controller.drive(Tween<Offset>(
       begin: _offset,
       end: _clampOffset(_offset + direction * distance),
@@ -143,8 +143,8 @@
             ..translate(_offset.dx, _offset.dy)
             ..scale(_scale),
           child: Image.asset(
-            widget.photo.assetName,
-            package: widget.photo.assetPackage,
+            widget.photo!.assetName!,
+            package: widget.photo!.assetPackage,
             fit: BoxFit.cover,
           ),
         ),
@@ -155,13 +155,11 @@
 
 class GridDemoPhotoItem extends StatelessWidget {
   GridDemoPhotoItem({
-    Key key,
-    @required this.photo,
-    @required this.tileStyle,
-    @required this.onBannerTap,
-  }) : assert(photo != null && photo.isValid),
-       assert(tileStyle != null),
-       assert(onBannerTap != null),
+    Key? key,
+    required this.photo,
+    required this.tileStyle,
+    required this.onBannerTap,
+  }) : assert(photo.isValid),
        super(key: key);
 
   final Photo photo;
@@ -173,11 +171,11 @@
       builder: (BuildContext context) {
         return Scaffold(
           appBar: AppBar(
-            title: Text(photo.title),
+            title: Text(photo.title!),
           ),
           body: SizedBox.expand(
             child: Hero(
-              tag: photo.tag,
+              tag: photo.tag!,
               child: GridPhotoViewer(photo: photo),
             ),
           ),
@@ -193,10 +191,10 @@
       child: GestureDetector(
         onTap: () { showPhoto(context); },
         child: Hero(
-          key: Key(photo.assetName),
-          tag: photo.tag,
+          key: Key(photo.assetName!),
+          tag: photo.tag!,
           child: Image.asset(
-            photo.assetName,
+            photo.assetName!,
             package: photo.assetPackage,
             fit: BoxFit.cover,
           ),
@@ -243,13 +241,11 @@
           child: image,
         );
     }
-    assert(tileStyle != null);
-    return null;
   }
 }
 
 class GridListDemo extends StatefulWidget {
-  const GridListDemo({ Key key }) : super(key: key);
+  const GridListDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/grid-list';
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/icons_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/icons_demo.dart
index a42e82f..601e8c3 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/icons_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/icons_demo.dart
@@ -109,7 +109,7 @@
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
-    final TextStyle textStyle = theme.textTheme.subtitle1.copyWith(color: theme.textTheme.caption.color);
+    final TextStyle textStyle = theme.textTheme.subtitle1!.copyWith(color: theme.textTheme.caption!.color);
     return Card(
       child: DefaultTextStyle(
         style: textStyle,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/leave_behind_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/leave_behind_demo.dart
index 53b2044..6c3b974 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/leave_behind_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/leave_behind_demo.dart
@@ -23,17 +23,17 @@
   LeaveBehindItem.from(LeaveBehindItem item)
     : index = item.index, name = item.name, subject = item.subject, body = item.body;
 
-  final int index;
-  final String name;
-  final String subject;
-  final String body;
+  final int? index;
+  final String? name;
+  final String? subject;
+  final String? body;
 
   @override
-  int compareTo(LeaveBehindItem other) => index.compareTo(other.index);
+  int compareTo(LeaveBehindItem other) => index!.compareTo(other.index!);
 }
 
 class LeaveBehindDemo extends StatefulWidget {
-  const LeaveBehindDemo({ Key key }) : super(key: key);
+  const LeaveBehindDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/leave-behind';
 
@@ -44,7 +44,7 @@
 class LeaveBehindDemoState extends State<LeaveBehindDemo> {
   DismissDirection _dismissDirection = DismissDirection.horizontal;
   bool _confirmDismiss = true;
-  List<LeaveBehindItem> leaveBehindItems;
+  late List<LeaveBehindItem> leaveBehindItems;
 
   void initListItems() {
     leaveBehindItems = List<LeaveBehindItem>.generate(16, (int index) {
@@ -188,12 +188,12 @@
 
 class _LeaveBehindListItem extends StatelessWidget {
   const _LeaveBehindListItem({
-    Key key,
-    @required this.item,
-    @required this.onArchive,
-    @required this.onDelete,
-    @required this.dismissDirection,
-    @required this.confirmDismiss,
+    Key? key,
+    required this.item,
+    required this.onArchive,
+    required this.onDelete,
+    required this.dismissDirection,
+    required this.confirmDismiss,
   }) : super(key: key);
 
   final LeaveBehindItem item;
@@ -263,7 +263,7 @@
             border: Border(bottom: BorderSide(color: theme.dividerColor)),
           ),
           child: ListTile(
-            title: Text(item.name),
+            title: Text(item.name!),
             subtitle: Text('${item.subject}\n${item.body}'),
             isThreeLine: true,
           ),
@@ -272,7 +272,7 @@
     );
   }
 
-  Future<bool> _showConfirmationDialog(BuildContext context, String action) {
+  Future<bool?> _showConfirmationDialog(BuildContext context, String action) {
     return showDialog<bool>(
       context: context,
       barrierDismissible: true,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/list_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/list_demo.dart
index 45d7781..9a32b13 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/list_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/list_demo.dart
@@ -21,7 +21,7 @@
 }
 
 class ListDemo extends StatefulWidget {
-  const ListDemo({ Key key }) : super(key: key);
+  const ListDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/list';
 
@@ -32,26 +32,26 @@
 class _ListDemoState extends State<ListDemo> {
   static final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
 
-  PersistentBottomSheetController<void> _bottomSheet;
-  _MaterialListType _itemType = _MaterialListType.threeLine;
-  bool _dense = false;
-  bool _showAvatars = true;
-  bool _showIcons = false;
-  bool _showDividers = false;
+  PersistentBottomSheetController<void>? _bottomSheet;
+  _MaterialListType? _itemType = _MaterialListType.threeLine;
+  bool? _dense = false;
+  bool? _showAvatars = true;
+  bool? _showIcons = false;
+  bool? _showDividers = false;
   bool _reverseSort = false;
   List<String> items = <String>[
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
   ];
 
-  void changeItemType(_MaterialListType type) {
+  void changeItemType(_MaterialListType? type) {
     setState(() {
       _itemType = type;
     });
-    _bottomSheet?.setState(() { });
+    _bottomSheet?.setState!(() { });
   }
 
   void _showConfigurationSheet() {
-    final PersistentBottomSheetController<void> bottomSheet = scaffoldKey.currentState.showBottomSheet<void>((BuildContext bottomSheetContext) {
+    final PersistentBottomSheetController<void> bottomSheet = scaffoldKey.currentState!.showBottomSheet<void>((BuildContext bottomSheetContext) {
       return Container(
         decoration: const BoxDecoration(
           border: Border(top: BorderSide(color: Colors.black26)),
@@ -65,7 +65,7 @@
                 dense: true,
                 title: const Text('One-line'),
                 trailing: Radio<_MaterialListType>(
-                  value: _showAvatars ? _MaterialListType.oneLineWithAvatar : _MaterialListType.oneLine,
+                  value: _showAvatars! ? _MaterialListType.oneLineWithAvatar : _MaterialListType.oneLine,
                   groupValue: _itemType,
                   onChanged: changeItemType,
                 ),
@@ -99,11 +99,14 @@
                 title: const Text('Show avatar'),
                 trailing: Checkbox(
                   value: _showAvatars,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       _showAvatars = value;
                     });
-                    _bottomSheet?.setState(() { });
+                    final StateSetter? bottomSheetSetState = _bottomSheet?.setState;
+                    if (bottomSheetSetState != null) {
+                      bottomSheetSetState(() { });
+                    }
                   },
                 ),
               ),
@@ -114,11 +117,14 @@
                 title: const Text('Show icon'),
                 trailing: Checkbox(
                   value: _showIcons,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       _showIcons = value;
                     });
-                    _bottomSheet?.setState(() { });
+                    final StateSetter? bottomSheetSetState = _bottomSheet?.setState;
+                    if (bottomSheetSetState != null) {
+                      bottomSheetSetState(() { });
+                    }
                   },
                 ),
               ),
@@ -129,11 +135,14 @@
                 title: const Text('Show dividers'),
                 trailing: Checkbox(
                   value: _showDividers,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       _showDividers = value;
                     });
-                    _bottomSheet?.setState(() { });
+                    final StateSetter? bottomSheetSetState = _bottomSheet?.setState;
+                    if (bottomSheetSetState != null) {
+                      bottomSheetSetState(() { });
+                    }
                   },
                 ),
               ),
@@ -144,11 +153,14 @@
                 title: const Text('Dense layout'),
                 trailing: Checkbox(
                   value: _dense,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       _dense = value;
                     });
-                    _bottomSheet?.setState(() { });
+                    final StateSetter? bottomSheetSetState = _bottomSheet?.setState;
+                    if (bottomSheetSetState != null) {
+                      bottomSheetSetState(() { });
+                    }
                   },
                 ),
               ),
@@ -162,7 +174,7 @@
       _bottomSheet = bottomSheet;
     });
 
-    _bottomSheet.closed.whenComplete(() {
+    _bottomSheet?.closed.whenComplete(() {
       if (mounted) {
         setState(() {
           _bottomSheet = null;
@@ -172,7 +184,7 @@
   }
 
   Widget buildListTile(BuildContext context, String item) {
-    Widget secondary;
+    Widget? secondary;
     if (_itemType == _MaterialListType.twoLine) {
       secondary = const Text('Additional item information.');
     } else if (_itemType == _MaterialListType.threeLine) {
@@ -184,18 +196,18 @@
       child: ListTile(
         isThreeLine: _itemType == _MaterialListType.threeLine,
         dense: _dense,
-        leading: _showAvatars ? ExcludeSemantics(child: CircleAvatar(child: Text(item))) : null,
+        leading: _showAvatars != null ? ExcludeSemantics(child: CircleAvatar(child: Text(item))) : null,
         title: Text('This item represents $item.'),
         subtitle: secondary,
-        trailing: _showIcons ? Icon(Icons.info, color: Theme.of(context).disabledColor) : null,
+        trailing: _showIcons != null ? Icon(Icons.info, color: Theme.of(context).disabledColor) : null,
       ),
     );
   }
 
   @override
   Widget build(BuildContext context) {
-    final String layoutText = _dense ? ' \u2013 Dense' : '';
-    String itemTypeText;
+    final String layoutText = _dense != null ? ' \u2013 Dense' : '';
+    String? itemTypeText;
     switch (_itemType) {
       case _MaterialListType.oneLine:
       case _MaterialListType.oneLineWithAvatar:
@@ -207,10 +219,12 @@
       case _MaterialListType.threeLine:
         itemTypeText = 'Three-line';
         break;
+      default:
+        break;
     }
 
     Iterable<Widget> listTiles = items.map<Widget>((String item) => buildListTile(context, item));
-    if (_showDividers)
+    if (_showDividers != null)
       listTiles = ListTile.divideTiles(context: context, tiles: listTiles);
 
     return Scaffold(
@@ -242,7 +256,7 @@
       ),
       body: Scrollbar(
         child: ListView(
-          padding: EdgeInsets.symmetric(vertical: _dense ? 4.0 : 8.0),
+          padding: EdgeInsets.symmetric(vertical: _dense != null ? 4.0 : 8.0),
           children: listTiles.toList(),
         ),
       ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/menu_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/menu_demo.dart
index c88627b..c66bca3 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/menu_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/menu_demo.dart
@@ -7,7 +7,7 @@
 import '../../gallery/demo.dart';
 
 class MenuDemo extends StatefulWidget {
-  const MenuDemo({ Key key }) : super(key: key);
+  const MenuDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/menu';
 
@@ -20,13 +20,13 @@
   final String _simpleValue1 = 'Menu item value one';
   final String _simpleValue2 = 'Menu item value two';
   final String _simpleValue3 = 'Menu item value three';
-  String _simpleValue;
+  String? _simpleValue;
 
   final String _checkedValue1 = 'One';
   final String _checkedValue2 = 'Two';
   final String _checkedValue3 = 'Free';
   final String _checkedValue4 = 'Four';
-  List<String> _checkedValues;
+  late List<String> _checkedValues;
 
   @override
   void initState() {
@@ -165,7 +165,7 @@
               onSelected: showMenuSelection,
               child: ListTile(
                 title: const Text('An item with a simple menu'),
-                subtitle: Text(_simpleValue),
+                subtitle: Text(_simpleValue!),
               ),
               itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
                 PopupMenuItem<String>(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/overscroll_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/overscroll_demo.dart
index 1b25b72..235a4cd 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/overscroll_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/overscroll_demo.dart
@@ -11,7 +11,7 @@
 enum IndicatorType { overscroll, refresh }
 
 class OverscrollDemo extends StatefulWidget {
-  const OverscrollDemo({ Key key }) : super(key: key);
+  const OverscrollDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/overscroll';
 
@@ -28,13 +28,13 @@
   Future<void> _handleRefresh() {
     final Completer<void> completer = Completer<void>();
     Timer(const Duration(seconds: 3), () { completer.complete(); });
-    return completer.future.then<void>((_) {
+    return completer.future.then((_) {
       ScaffoldMessenger.of(context).showSnackBar(SnackBar(
         content: const Text('Refresh complete'),
         action: SnackBarAction(
           label: 'RETRY',
           onPressed: () {
-            _refreshIndicatorKey.currentState.show();
+            _refreshIndicatorKey.currentState!.show();
           },
         ),
       ));
@@ -52,7 +52,7 @@
             icon: const Icon(Icons.refresh),
             tooltip: 'Refresh',
             onPressed: () {
-              _refreshIndicatorKey.currentState.show();
+              _refreshIndicatorKey.currentState!.show();
             },
           ),
         ],
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/page_selector_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/page_selector_demo.dart
index 02b56b4..c22f5f0 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/page_selector_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/page_selector_demo.dart
@@ -9,17 +9,17 @@
 class _PageSelector extends StatelessWidget {
   const _PageSelector({ this.icons });
 
-  final List<Icon> icons;
+  final List<Icon>? icons;
 
   void _handleArrowButtonPress(BuildContext context, int delta) {
-    final TabController controller = DefaultTabController.of(context);
+    final TabController controller = DefaultTabController.of(context)!;
     if (!controller.indexIsChanging)
-      controller.animateTo((controller.index + delta).clamp(0, icons.length - 1) as int);
+      controller.animateTo((controller.index + delta).clamp(0, icons!.length - 1));
   }
 
   @override
   Widget build(BuildContext context) {
-    final TabController controller = DefaultTabController.of(context);
+    final TabController? controller = DefaultTabController.of(context);
     final Color color = Theme.of(context).accentColor;
     return SafeArea(
       top: false,
@@ -54,7 +54,7 @@
                 color: color,
               ),
               child: TabBarView(
-                children: icons.map<Widget>((Icon icon) {
+                children: icons!.map<Widget>((Icon icon) {
                   return Container(
                     padding: const EdgeInsets.all(12.0),
                     child: Card(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
index 3937ff1..a1c9d51 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
@@ -16,7 +16,7 @@
 class _PersistentBottomSheetDemoState extends State<PersistentBottomSheetDemo> {
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
-  VoidCallback _showBottomSheetCallback;
+  VoidCallback? _showBottomSheetCallback;
 
   @override
   void initState() {
@@ -28,7 +28,7 @@
     setState(() { // disable the button
       _showBottomSheetCallback = null;
     });
-    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
+    _scaffoldKey.currentState!.showBottomSheet<void>((BuildContext context) {
       final ThemeData themeData = Theme.of(context);
       return Container(
         decoration: BoxDecoration(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/progress_indicator_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/progress_indicator_demo.dart
index 1c4a2f4..7f1b497 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/progress_indicator_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/progress_indicator_demo.dart
@@ -14,8 +14,8 @@
 }
 
 class _ProgressIndicatorDemoState extends State<ProgressIndicatorDemo> with SingleTickerProviderStateMixin {
-  AnimationController _controller;
-  Animation<double> _animation;
+  late AnimationController _controller;
+  late Animation<double> _animation;
 
   @override
   void initState() {
@@ -64,7 +64,7 @@
     });
   }
 
-  Widget _buildIndicators(BuildContext context, Widget child) {
+  Widget _buildIndicators(BuildContext context, Widget? child) {
     final List<Widget> indicators = <Widget>[
       const SizedBox(
         width: 200.0,
@@ -109,7 +109,7 @@
       body: Center(
         child: SingleChildScrollView(
           child: DefaultTextStyle(
-            style: Theme.of(context).textTheme.headline6,
+            style: Theme.of(context).textTheme.headline6!,
             child: GestureDetector(
               onTap: _handleTap,
               behavior: HitTestBehavior.opaque,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/reorderable_list_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
index 34917c5..d9425d3 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
@@ -20,7 +20,7 @@
 }
 
 class ReorderableListDemo extends StatefulWidget {
-  const ReorderableListDemo({ Key key }) : super(key: key);
+  const ReorderableListDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/reorderable-list';
 
@@ -33,38 +33,38 @@
 
   final String value;
 
-  bool checkState;
+  bool? checkState;
 }
 
 class _ListDemoState extends State<ReorderableListDemo> {
   static final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
 
-  PersistentBottomSheetController<void> _bottomSheet;
-  _ReorderableListType _itemType = _ReorderableListType.threeLine;
-  bool _reverse = false;
+  PersistentBottomSheetController<void>? _bottomSheet;
+  _ReorderableListType? _itemType = _ReorderableListType.threeLine;
+  bool? _reverse = false;
   bool _reverseSort = false;
   final List<_ListItem> _items = <String>[
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
   ].map<_ListItem>((String item) => _ListItem(item, false)).toList();
 
-  void changeItemType(_ReorderableListType type) {
+  void changeItemType(_ReorderableListType? type) {
     setState(() {
       _itemType = type;
     });
     // Rebuild the bottom sheet to reflect the selected list view.
-    _bottomSheet?.setState(() {
+    _bottomSheet?.setState!(() {
       // Trigger a rebuild.
     });
     // Close the bottom sheet to give the user a clear view of the list.
     _bottomSheet?.close();
   }
 
-  void changeReverse(bool newValue) {
+  void changeReverse(bool? newValue) {
     setState(() {
       _reverse = newValue;
     });
     // Rebuild the bottom sheet to reflect the selected list view.
-    _bottomSheet?.setState(() {
+    _bottomSheet?.setState!(() {
       // Trigger a rebuild.
     });
     // Close the bottom sheet to give the user a clear view of the list.
@@ -73,7 +73,7 @@
 
   void _showConfigurationSheet() {
     setState(() {
-      _bottomSheet = scaffoldKey.currentState.showBottomSheet<void>((BuildContext bottomSheetContext) {
+      _bottomSheet = scaffoldKey.currentState!.showBottomSheet<void>((BuildContext bottomSheetContext) {
         return DecoratedBox(
           decoration: const BoxDecoration(
             border: Border(top: BorderSide(color: Colors.black26)),
@@ -115,7 +115,7 @@
       });
 
       // Garbage collect the bottom sheet when it closes.
-      _bottomSheet.closed.whenComplete(() {
+      _bottomSheet?.closed.whenComplete(() {
         if (mounted) {
           setState(() {
             _bottomSheet = null;
@@ -129,14 +129,14 @@
     const Widget secondary = Text(
       'Even more additional list item information appears on line three.',
     );
-    Widget listTile;
+    late Widget listTile;
     switch (_itemType) {
       case _ReorderableListType.threeLine:
         listTile = CheckboxListTile(
           key: Key(item.value),
           isThreeLine: true,
           value: item.checkState ?? false,
-          onChanged: (bool newValue) {
+          onChanged: (bool? newValue) {
             setState(() {
               item.checkState = newValue;
             });
@@ -157,6 +157,11 @@
           ),
         );
         break;
+      default:
+        listTile = Container(
+          key: Key(item.value),
+        );
+        break;
     }
 
     return listTile;
@@ -210,7 +215,7 @@
                   child: Text('Header of the list', style: Theme.of(context).textTheme.headline5))
               : null,
           onReorder: _onReorder,
-          reverse: _reverse,
+          reverse: _reverse!,
           scrollDirection: _itemType == _ReorderableListType.horizontalAvatar ? Axis.horizontal : Axis.vertical,
           padding: const EdgeInsets.symmetric(vertical: 8.0),
           children: _items.map<Widget>(buildListTile).toList(),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart
index 1b90e8a..17ef3de 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/scrollable_tabs_demo.dart
@@ -14,8 +14,8 @@
 
 class _Page {
   const _Page({ this.icon, this.text });
-  final IconData icon;
-  final String text;
+  final IconData? icon;
+  final String? text;
 }
 
 const List<_Page> _allPages = <_Page>[
@@ -43,7 +43,7 @@
 }
 
 class ScrollableTabsDemoState extends State<ScrollableTabsDemo> with SingleTickerProviderStateMixin {
-  TabController _controller;
+  TabController? _controller;
   TabsDemoStyle _demoStyle = TabsDemoStyle.iconsAndText;
   bool _customIndicator = false;
 
@@ -55,7 +55,7 @@
 
   @override
   void dispose() {
-    _controller.dispose();
+    _controller!.dispose();
     super.dispose();
   }
 
@@ -65,7 +65,7 @@
     });
   }
 
-  Decoration getIndicator() {
+  Decoration? getIndicator() {
     if (!_customIndicator)
       return const UnderlineTabIndicator();
 
@@ -117,7 +117,6 @@
           ),
         );
     }
-    return null;
   }
 
   @override
@@ -161,7 +160,6 @@
           isScrollable: true,
           indicator: getIndicator(),
           tabs: _allPages.map<Tab>((_Page page) {
-            assert(_demoStyle != null);
             switch (_demoStyle) {
               case TabsDemoStyle.iconsAndText:
                 return Tab(text: page.text, icon: Icon(page.icon));
@@ -169,9 +167,10 @@
                 return Tab(icon: Icon(page.icon));
               case TabsDemoStyle.textOnly:
                 return Tab(text: page.text);
+              default:
+                return Tab();
             }
-            return null;
-          }).toList(),
+          }).toList()
         ),
       ),
       body: TabBarView(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/search_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/search_demo.dart
index cba1512..2ef49eb 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/search_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/search_demo.dart
@@ -17,7 +17,7 @@
   final _SearchDemoSearchDelegate _delegate = _SearchDemoSearchDelegate();
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
-  int _lastIntegerSelected;
+  int? _lastIntegerSelected;
 
   @override
   Widget build(BuildContext context) {
@@ -32,7 +32,7 @@
             progress: _delegate.transitionAnimation,
           ),
           onPressed: () {
-            _scaffoldKey.currentState.openDrawer();
+            _scaffoldKey.currentState!.openDrawer();
           },
         ),
         title: const Text('Numbers'),
@@ -41,7 +41,7 @@
             tooltip: 'Search',
             icon: const Icon(Icons.search),
             onPressed: () async {
-              final int selected = await showSearch<int>(
+              final int? selected = await showSearch<int?>(
                 context: context,
                 delegate: _delegate,
               );
@@ -98,7 +98,7 @@
       floatingActionButton: FloatingActionButton.extended(
         tooltip: 'Back', // Tests depend on this label to exit the demo.
         onPressed: () {
-          Navigator.of(context).pop();
+          Navigator.of(context)!.pop();
         },
         label: const Text('Close demo'),
         icon: const Icon(Icons.close),
@@ -133,7 +133,7 @@
   }
 }
 
-class _SearchDemoSearchDelegate extends SearchDelegate<int> {
+class _SearchDemoSearchDelegate extends SearchDelegate<int?> {
   final List<int> _data = List<int>.generate(100001, (int i) => i).reversed.toList();
   final List<int> _history = <int>[42607, 85604, 66374, 44, 174];
 
@@ -170,7 +170,7 @@
 
   @override
   Widget buildResults(BuildContext context) {
-    final int searched = int.tryParse(query);
+    final int? searched = int.tryParse(query);
     if (searched == null || !_data.contains(searched)) {
       return Center(
         child: Text(
@@ -228,26 +228,26 @@
 class _ResultCard extends StatelessWidget {
   const _ResultCard({this.integer, this.title, this.searchDelegate});
 
-  final int integer;
-  final String title;
-  final SearchDelegate<int> searchDelegate;
+  final int? integer;
+  final String? title;
+  final SearchDelegate<int?>? searchDelegate;
 
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
     return GestureDetector(
       onTap: () {
-        searchDelegate.close(context, integer);
+        searchDelegate!.close(context, integer);
       },
       child: Card(
         child: Padding(
           padding: const EdgeInsets.all(8.0),
           child: Column(
             children: <Widget>[
-              Text(title),
+              Text(title!),
               Text(
                 '$integer',
-                style: theme.textTheme.headline5.copyWith(fontSize: 72.0),
+                style: theme.textTheme.headline5!.copyWith(fontSize: 72.0),
               ),
             ],
           ),
@@ -260,33 +260,33 @@
 class _SuggestionList extends StatelessWidget {
   const _SuggestionList({this.suggestions, this.query, this.onSelected});
 
-  final List<String> suggestions;
-  final String query;
-  final ValueChanged<String> onSelected;
+  final List<String>? suggestions;
+  final String? query;
+  final ValueChanged<String>? onSelected;
 
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
     return ListView.builder(
-      itemCount: suggestions.length,
+      itemCount: suggestions!.length,
       itemBuilder: (BuildContext context, int i) {
-        final String suggestion = suggestions[i];
+        final String suggestion = suggestions![i];
         return ListTile(
-          leading: query.isEmpty ? const Icon(Icons.history) : const Icon(null),
+          leading: query!.isEmpty ? const Icon(Icons.history) : const Icon(null),
           title: RichText(
             text: TextSpan(
-              text: suggestion.substring(0, query.length),
-              style: theme.textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold),
+              text: suggestion.substring(0, query!.length),
+              style: theme.textTheme.subtitle1!.copyWith(fontWeight: FontWeight.bold),
               children: <TextSpan>[
                 TextSpan(
-                  text: suggestion.substring(query.length),
+                  text: suggestion.substring(query!.length),
                   style: theme.textTheme.subtitle1,
                 ),
               ],
             ),
           ),
           onTap: () {
-            onSelected(suggestion);
+            onSelected!(suggestion);
           },
         );
       },
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/selection_controls_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/selection_controls_demo.dart
index dd15ca1..ef77a6c 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/selection_controls_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/selection_controls_demo.dart
@@ -67,13 +67,13 @@
     );
   }
 
-  bool checkboxValueA = true;
-  bool checkboxValueB = false;
-  bool checkboxValueC;
-  int radioValue = 0;
+  bool? checkboxValueA = true;
+  bool? checkboxValueB = false;
+  bool? checkboxValueC;
+  int? radioValue = 0;
   bool switchValue = false;
 
-  void handleRadioValueChanged(int value) {
+  void handleRadioValueChanged(int? value) {
     setState(() {
       radioValue = value;
     });
@@ -92,7 +92,7 @@
                 label: 'Checkbox A',
                 child: Checkbox(
                   value: checkboxValueA,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       checkboxValueA = value;
                     });
@@ -103,7 +103,7 @@
                 label: 'Checkbox B',
                 child: Checkbox(
                   value: checkboxValueB,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       checkboxValueB = value;
                     });
@@ -115,7 +115,7 @@
                 child: Checkbox(
                   value: checkboxValueC,
                   tristate: true,
-                  onChanged: (bool value) {
+                  onChanged: (bool? value) {
                     setState(() {
                       checkboxValueC = value;
                     });
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/slider_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/slider_demo.dart
index fd0f0e5..b96412d 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/slider_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/slider_demo.dart
@@ -61,15 +61,15 @@
   void paint(
     PaintingContext context,
     Offset center, {
-    @required Animation<double> activationAnimation,
-    @required Animation<double> enableAnimation,
+    required Animation<double> activationAnimation,
+    required Animation<double> enableAnimation,
     bool isDiscrete = false,
     bool isEnabled = false,
-    bool isOnTop,
-    @required SliderThemeData sliderTheme,
-    TextDirection textDirection,
-    Thumb thumb,
-    bool isPressed,
+    bool? isOnTop,
+    required SliderThemeData sliderTheme,
+    TextDirection? textDirection,
+    Thumb? thumb,
+    bool? isPressed,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween colorTween = ColorTween(
@@ -78,7 +78,7 @@
     );
 
     final double size = _thumbSize * sizeTween.evaluate(enableAnimation);
-    Path thumbPath;
+    late Path thumbPath;
     switch (textDirection) {
       case TextDirection.rtl:
         switch (thumb) {
@@ -88,6 +88,8 @@
           case Thumb.end:
             thumbPath = _leftTriangle(size, center);
             break;
+          default:
+            break;
         }
         break;
       case TextDirection.ltr:
@@ -98,10 +100,14 @@
           case Thumb.end:
             thumbPath = _rightTriangle(size, center);
             break;
+          default:
+            break;
         }
         break;
+      default:
+        break;
     }
-    canvas.drawPath(thumbPath, Paint()..color = colorTween.evaluate(enableAnimation));
+    canvas.drawPath(thumbPath, Paint()..color = colorTween.evaluate(enableAnimation)!);
   }
 }
 
@@ -123,16 +129,16 @@
   void paint(
     PaintingContext context,
     Offset thumbCenter, {
-    Animation<double> activationAnimation,
-    Animation<double> enableAnimation,
-    bool isDiscrete,
-    TextPainter labelPainter,
-    RenderBox parentBox,
-    SliderThemeData sliderTheme,
-    TextDirection textDirection,
-    double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
+    Animation<double>? activationAnimation,
+    required Animation<double> enableAnimation,
+    bool? isDiscrete,
+    TextPainter? labelPainter,
+    RenderBox? parentBox,
+    required SliderThemeData sliderTheme,
+    TextDirection? textDirection,
+    double? value,
+    double? textScaleFactor,
+    Size? sizeWithOverflow,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween colorTween = ColorTween(
@@ -141,7 +147,7 @@
     );
     final double size = _thumbSize * sizeTween.evaluate(enableAnimation);
     final Path thumbPath = _downTriangle(size, thumbCenter);
-    canvas.drawPath(thumbPath, Paint()..color = colorTween.evaluate(enableAnimation));
+    canvas.drawPath(thumbPath, Paint()..color = colorTween.evaluate(enableAnimation)!);
   }
 }
 
@@ -164,16 +170,16 @@
   void paint(
     PaintingContext context,
     Offset thumbCenter, {
-    Animation<double> activationAnimation,
-    Animation<double> enableAnimation,
-    bool isDiscrete,
-    TextPainter labelPainter,
-    RenderBox parentBox,
-    SliderThemeData sliderTheme,
-    TextDirection textDirection,
-    double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
+    required Animation<double> activationAnimation,
+    required Animation<double> enableAnimation,
+    bool? isDiscrete,
+    required TextPainter labelPainter,
+    RenderBox? parentBox,
+    required SliderThemeData sliderTheme,
+    TextDirection? textDirection,
+    double? value,
+    double? textScaleFactor,
+    Size? sizeWithOverflow,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween enableColor = ColorTween(
@@ -187,7 +193,7 @@
     final double size = _indicatorSize * sizeTween.evaluate(enableAnimation);
     final Offset slideUpOffset = Offset(0.0, -slideUpTween.evaluate(activationAnimation));
     final Path thumbPath = _upTriangle(size, thumbCenter + slideUpOffset);
-    final Color paintColor = enableColor.evaluate(enableAnimation).withAlpha((255.0 * activationAnimation.value).round());
+    final Color paintColor = enableColor.evaluate(enableAnimation)!.withAlpha((255.0 * activationAnimation.value).round());
     canvas.drawPath(
       thumbPath,
       Paint()..color = paintColor,
@@ -259,10 +265,10 @@
                   child: TextField(
                     textAlign: TextAlign.center,
                     onSubmitted: (String value) {
-                      final double newValue = double.tryParse(value);
+                      final double? newValue = double.tryParse(value);
                       if (newValue != null && newValue != _continuousValue) {
                         setState(() {
-                          _continuousValue = newValue.clamp(0.0, 100.0) as double;
+                          _continuousValue = newValue.clamp(0.0, 100.0);
                         });
                       }
                     },
@@ -326,7 +332,7 @@
                   valueIndicatorColor: Colors.deepPurpleAccent,
                   thumbShape: _CustomThumbShape(),
                   valueIndicatorShape: _CustomValueIndicatorShape(),
-                  valueIndicatorTextStyle: theme.accentTextTheme.bodyText1.copyWith(color: theme.colorScheme.onSurface),
+                  valueIndicatorTextStyle: theme.accentTextTheme.bodyText1!.copyWith(color: theme.colorScheme.onSurface),
                 ),
                 child: Slider(
                   value: _discreteCustomValue,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/snack_bar_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/snack_bar_demo.dart
index 682f85d..2eb5947 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/snack_bar_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/snack_bar_demo.dart
@@ -19,7 +19,7 @@
   'By default snackbars automatically disappear after a few seconds ';
 
 class SnackBarDemo extends StatefulWidget {
-  const SnackBarDemo({ Key key }) : super(key: key);
+  const SnackBarDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/snack-bar';
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_demo.dart
index 9f94906..b2ff9e7 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_demo.dart
@@ -13,17 +13,17 @@
 
 class _Page {
   _Page({ this.label });
-  final String label;
-  String get id => label.characters.first;
+  final String? label;
+  String get id => label!.characters.first;
   @override
   String toString() => '$runtimeType("$label")';
 }
 
 class _CardData {
   const _CardData({ this.title, this.imageAsset, this.imageAssetPackage });
-  final String title;
-  final String imageAsset;
-  final String imageAssetPackage;
+  final String? title;
+  final String? imageAsset;
+  final String? imageAssetPackage;
 }
 
 final Map<_Page, List<_CardData>> _allPages = <_Page, List<_CardData>>{
@@ -97,8 +97,8 @@
   const _CardDataItem({ this.page, this.data });
 
   static const double height = 272.0;
-  final _Page page;
-  final _CardData data;
+  final _Page? page;
+  final _CardData? data;
 
   @override
   Widget build(BuildContext context) {
@@ -110,23 +110,23 @@
           mainAxisAlignment: MainAxisAlignment.start,
           children: <Widget>[
             Align(
-              alignment: page.id == 'H'
+              alignment: page!.id == 'H'
                 ? Alignment.centerLeft
                 : Alignment.centerRight,
-              child: CircleAvatar(child: Text(page.id)),
+              child: CircleAvatar(child: Text(page!.id)),
             ),
             SizedBox(
               width: 144.0,
               height: 144.0,
               child: Image.asset(
-                data.imageAsset,
-                package: data.imageAssetPackage,
+                data!.imageAsset!,
+                package: data!.imageAssetPackage,
                 fit: BoxFit.contain,
               ),
             ),
             Center(
               child: Text(
-                data.title,
+                data!.title!,
                 style: Theme.of(context).textTheme.headline6,
               ),
             ),
@@ -187,7 +187,7 @@
                             itemExtent: _CardDataItem.height,
                             delegate: SliverChildBuilderDelegate(
                               (BuildContext context, int index) {
-                                final _CardData data = _allPages[page][index];
+                                final _CardData data = _allPages[page]![index];
                                 return Padding(
                                   padding: const EdgeInsets.symmetric(
                                     vertical: 8.0,
@@ -198,7 +198,7 @@
                                   ),
                                 );
                               },
-                              childCount: _allPages[page].length,
+                              childCount: _allPages[page]!.length,
                             ),
                           ),
                         ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_fab_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
index 9daa091..31bab87 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
@@ -15,13 +15,13 @@
 class _Page {
   _Page({ this.label, this.colors, this.icon });
 
-  final String label;
-  final MaterialColor colors;
-  final IconData icon;
+  final String? label;
+  final MaterialColor? colors;
+  final IconData? icon;
 
-  Color get labelColor => colors != null ? colors.shade300 : Colors.grey.shade300;
+  Color get labelColor => colors != null ? colors!.shade300 : Colors.grey.shade300;
   bool get fabDefined => colors != null && icon != null;
-  Color get fabColor => colors.shade400;
+  Color get fabColor => colors!.shade400;
   Icon get fabIcon => Icon(icon);
   Key get fabKey => ValueKey<Color>(fabColor);
 }
@@ -44,32 +44,32 @@
 class _TabsFabDemoState extends State<TabsFabDemo> with SingleTickerProviderStateMixin {
   final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
 
-  TabController _controller;
-  _Page _selectedPage;
+  TabController? _controller;
+  late _Page _selectedPage;
   bool _extendedButtons = false;
 
   @override
   void initState() {
     super.initState();
     _controller = TabController(vsync: this, length: _allPages.length);
-    _controller.addListener(_handleTabSelection);
+    _controller!.addListener(_handleTabSelection);
     _selectedPage = _allPages[0];
   }
 
   @override
   void dispose() {
-    _controller.dispose();
+    _controller!.dispose();
     super.dispose();
   }
 
   void _handleTabSelection() {
     setState(() {
-      _selectedPage = _allPages[_controller.index];
+      _selectedPage = _allPages[_controller!.index];
     });
   }
 
   void _showExplanatoryText() {
-    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
+    _scaffoldKey.currentState!.showBottomSheet<void>((BuildContext context) {
       return Container(
         decoration: BoxDecoration(
           border: Border(top: BorderSide(color: Theme.of(context).dividerColor))
@@ -86,11 +86,11 @@
     return Builder(
       builder: (BuildContext context) {
         return Container(
-          key: ValueKey<String>(page.label),
+          key: ValueKey<String?>(page.label),
           padding: const EdgeInsets.fromLTRB(48.0, 48.0, 48.0, 96.0),
           child: Card(
             child: Center(
-              child: Text(page.label,
+              child: Text(page.label!,
                 style: TextStyle(
                   color: page.labelColor,
                   fontSize: 32.0,
@@ -104,7 +104,7 @@
     );
   }
 
-  Widget buildFloatingActionButton(_Page page) {
+  Widget? buildFloatingActionButton(_Page page) {
     if (!page.fabDefined)
       return null;
 
@@ -114,7 +114,7 @@
         tooltip: 'Show explanation',
         backgroundColor: page.fabColor,
         icon: page.fabIcon,
-        label: Text(page.label.toUpperCase()),
+        label: Text(page.label!.toUpperCase()),
         onPressed: _showExplanatoryText,
       );
     }
@@ -136,7 +136,7 @@
         title: const Text('FAB per tab'),
         bottom: TabBar(
           controller: _controller,
-          tabs: _allPages.map<Widget>((_Page page) => Tab(text: page.label.toUpperCase())).toList(),
+          tabs: _allPages.map<Widget>((_Page page) => Tab(text: page.label!.toUpperCase())).toList(),
         ),
         actions: <Widget>[
           MaterialDemoDocumentationButton(TabsFabDemo.routeName),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/material/text_form_field_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/material/text_form_field_demo.dart
index 5c1ccf5..d65bf3e 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/material/text_form_field_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/material/text_form_field_demo.dart
@@ -9,7 +9,7 @@
 import '../../gallery/demo.dart';
 
 class TextFormFieldDemo extends StatefulWidget {
-  const TextFormFieldDemo({ Key key }) : super(key: key);
+  const TextFormFieldDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/material/text-form-field';
 
@@ -18,9 +18,9 @@
 }
 
 class PersonData {
-  String name = '';
-  String phoneNumber = '';
-  String email = '';
+  String? name = '';
+  String? phoneNumber = '';
+  String? email = '';
   String password = '';
 }
 
@@ -35,13 +35,13 @@
     this.onFieldSubmitted,
   });
 
-  final Key fieldKey;
-  final String hintText;
-  final String labelText;
-  final String helperText;
-  final FormFieldSetter<String> onSaved;
-  final FormFieldValidator<String> validator;
-  final ValueChanged<String> onFieldSubmitted;
+  final Key? fieldKey;
+  final String? hintText;
+  final String? labelText;
+  final String? helperText;
+  final FormFieldSetter<String>? onSaved;
+  final FormFieldValidator<String>? validator;
+  final ValueChanged<String>? onFieldSubmitted;
 
   @override
   _PasswordFieldState createState() => _PasswordFieldState();
@@ -99,7 +99,7 @@
   final GlobalKey<FormFieldState<String>> _passwordFieldKey = GlobalKey<FormFieldState<String>>();
   final _UsNumberTextInputFormatter _phoneNumberFormatter = _UsNumberTextInputFormatter();
   void _handleSubmitted() {
-    final FormState form = _formKey.currentState;
+    final FormState form = _formKey.currentState!;
     if (!form.validate()) {
       _autovalidateMode = AutovalidateMode.always; // Start validating on every change.
       showInSnackBar('Please fix the errors in red before submitting.');
@@ -109,9 +109,9 @@
     }
   }
 
-  String _validateName(String value) {
+  String? _validateName(String? value) {
     _formWasEdited = true;
-    if (value.isEmpty)
+    if (value!.isEmpty)
       return 'Name is required.';
     final RegExp nameExp = RegExp(r'^[A-Za-z ]+$');
     if (!nameExp.hasMatch(value))
@@ -119,18 +119,18 @@
     return null;
   }
 
-  String _validatePhoneNumber(String value) {
+  String? _validatePhoneNumber(String? value) {
     _formWasEdited = true;
     final RegExp phoneExp = RegExp(r'^\(\d\d\d\) \d\d\d\-\d\d\d\d$');
-    if (!phoneExp.hasMatch(value))
+    if (!phoneExp.hasMatch(value!))
       return '(###) ###-#### - Enter a US phone number.';
     return null;
   }
 
-  String _validatePassword(String value) {
+  String? _validatePassword(String? value) {
     _formWasEdited = true;
-    final FormFieldState<String> passwordField = _passwordFieldKey.currentState;
-    if (passwordField.value == null || passwordField.value.isEmpty)
+    final FormFieldState<String> passwordField = _passwordFieldKey.currentState!;
+    if (passwordField.value == null || passwordField.value!.isEmpty)
       return 'Please enter a password.';
     if (passwordField.value != value)
       return "The passwords don't match";
@@ -138,11 +138,11 @@
   }
 
   Future<bool> _warnUserAboutInvalidData() async {
-    final FormState form = _formKey.currentState;
+    final FormState? form = _formKey.currentState;
     if (form == null || !_formWasEdited || form.validate())
       return true;
 
-    return await showDialog<bool>(
+    return await (showDialog<bool>(
       context: context,
       builder: (BuildContext context) {
         return AlertDialog(
@@ -151,16 +151,16 @@
           actions: <Widget> [
             TextButton(
               child: const Text('YES'),
-              onPressed: () { Navigator.of(context).pop(true); },
+              onPressed: () { Navigator.of(context)!.pop(true); },
             ),
             TextButton(
               child: const Text('NO'),
-              onPressed: () { Navigator.of(context).pop(false); },
+              onPressed: () { Navigator.of(context)!.pop(false); },
             ),
           ],
         );
       },
-    ) ?? false;
+    ) as Future<bool>);
   }
 
   @override
@@ -195,7 +195,7 @@
                       hintText: 'What do people call you?',
                       labelText: 'Name *',
                     ),
-                    onSaved: (String value) { person.name = value; },
+                    onSaved: (String? value) { person.name = value; },
                     validator: _validateName,
                   ),
                   const SizedBox(height: 24.0),
@@ -209,7 +209,7 @@
                       prefixText: '+1',
                     ),
                     keyboardType: TextInputType.phone,
-                    onSaved: (String value) { person.phoneNumber = value; },
+                    onSaved: (String? value) { person.phoneNumber = value; },
                     validator: _validatePhoneNumber,
                     // TextInputFormatters are applied in sequence.
                     inputFormatters: <TextInputFormatter> [
@@ -228,7 +228,7 @@
                       labelText: 'E-mail',
                     ),
                     keyboardType: TextInputType.emailAddress,
-                    onSaved: (String value) { person.email = value; },
+                    onSaved: (String? value) { person.email = value; },
                   ),
                   const SizedBox(height: 24.0),
                   TextFormField(
@@ -265,7 +265,7 @@
                   ),
                   const SizedBox(height: 24.0),
                   TextFormField(
-                    enabled: person.password != null && person.password.isNotEmpty,
+                    enabled: person.password.isNotEmpty,
                     decoration: const InputDecoration(
                       border: UnderlineInputBorder(),
                       filled: true,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/pesto_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/pesto_demo.dart
index b6838fd..613994e 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/pesto_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/pesto_demo.dart
@@ -6,7 +6,7 @@
 import 'package:flutter/rendering.dart';
 
 class PestoDemo extends StatelessWidget {
-  const PestoDemo({ Key key }) : super(key: key);
+  const PestoDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/pesto';
 
@@ -21,7 +21,7 @@
 const double _kFabHalfSize = 28.0; // TODO(mpcomplete): needs to adapt to screen size
 const double _kRecipePageMaxWidth = 500.0;
 
-final Set<Recipe> _favoriteRecipes = <Recipe>{};
+final Set<Recipe?> _favoriteRecipes = <Recipe?>{};
 
 final ThemeData _kTheme = ThemeData(
   brightness: Brightness.light,
@@ -46,10 +46,10 @@
 class PestoStyle extends TextStyle {
   const PestoStyle({
     double fontSize = 12.0,
-    FontWeight fontWeight,
+    FontWeight? fontWeight,
     Color color = Colors.black87,
-    double letterSpacing,
-    double height,
+    double? letterSpacing,
+    double? height,
   }) : super(
     inherit: false,
     color: color,
@@ -64,9 +64,9 @@
 
 // Displays a grid of recipe cards.
 class RecipeGridPage extends StatefulWidget {
-  const RecipeGridPage({ Key key, this.recipes }) : super(key: key);
+  const RecipeGridPage({ Key? key, this.recipes }) : super(key: key);
 
-  final List<Recipe> recipes;
+  final List<Recipe?>? recipes;
 
   @override
   _RecipeGridPageState createState() => _RecipeGridPageState();
@@ -89,7 +89,7 @@
           },
         ),
         body: CustomScrollView(
-          semanticChildCount: widget.recipes.length,
+          semanticChildCount: widget.recipes!.length,
           slivers: <Widget>[
             _buildAppBar(context, statusBarHeight),
             _buildBody(context, statusBarHeight),
@@ -127,7 +127,7 @@
               bottom: extraPadding,
             ),
             child: Center(
-              child: PestoLogo(height: logoHeight, t: t.clamp(0.0, 1.0) as double),
+              child: PestoLogo(height: logoHeight, t: t.clamp(0.0, 1.0)),
             ),
           );
         },
@@ -153,13 +153,13 @@
         ),
         delegate: SliverChildBuilderDelegate(
           (BuildContext context, int index) {
-            final Recipe recipe = widget.recipes[index];
+            final Recipe? recipe = widget.recipes![index];
             return RecipeCard(
               recipe: recipe,
               onTap: () { showRecipePage(context, recipe); },
             );
           },
-          childCount: widget.recipes.length,
+          childCount: widget.recipes!.length,
         ),
       ),
     );
@@ -172,7 +172,7 @@
     ));
   }
 
-  void showRecipePage(BuildContext context, Recipe recipe) {
+  void showRecipePage(BuildContext context, Recipe? recipe) {
     Navigator.push(context, MaterialPageRoute<void>(
       settings: const RouteSettings(name: '/pesto/recipe'),
       builder: (BuildContext context) {
@@ -188,8 +188,8 @@
 class PestoLogo extends StatefulWidget {
   const PestoLogo({this.height, this.t});
 
-  final double height;
-  final double t;
+  final double? height;
+  final double? t;
 
   @override
   _PestoLogoState createState() => _PestoLogoState();
@@ -217,7 +217,7 @@
     return Semantics(
       namesRoute: true,
       child: Transform(
-        transform: Matrix4.identity()..scale(widget.height / kLogoHeight),
+        transform: Matrix4.identity()..scale(widget.height! / kLogoHeight),
         alignment: Alignment.topCenter,
         child: SizedBox(
           width: kLogoWidth,
@@ -225,7 +225,7 @@
             clipBehavior: Clip.none,
             children: <Widget>[
               Positioned.fromRect(
-                rect: _imageRectTween.lerp(widget.t),
+                rect: _imageRectTween.lerp(widget.t!)!,
                 child: Image.asset(
                   _kSmallLogoImage,
                   package: _kGalleryAssetsPackage,
@@ -233,9 +233,9 @@
                 ),
               ),
               Positioned.fromRect(
-                rect: _textRectTween.lerp(widget.t),
+                rect: _textRectTween.lerp(widget.t!)!,
                 child: Opacity(
-                  opacity: _textOpacity.transform(widget.t),
+                  opacity: _textOpacity.transform(widget.t!),
                   child: Text('PESTO', style: titleStyle, textAlign: TextAlign.center),
                 ),
               ),
@@ -249,10 +249,10 @@
 
 // A card with the recipe's image, author, and title.
 class RecipeCard extends StatelessWidget {
-  const RecipeCard({ Key key, this.recipe, this.onTap }) : super(key: key);
+  const RecipeCard({ Key? key, this.recipe, this.onTap }) : super(key: key);
 
-  final Recipe recipe;
-  final VoidCallback onTap;
+  final Recipe? recipe;
+  final VoidCallback? onTap;
 
   TextStyle get titleStyle => const PestoStyle(fontSize: 24.0, fontWeight: FontWeight.w600);
   TextStyle get authorStyle => const PestoStyle(fontWeight: FontWeight.w500, color: Colors.black54);
@@ -266,14 +266,14 @@
           crossAxisAlignment: CrossAxisAlignment.start,
           children: <Widget>[
             Hero(
-              tag: 'packages/$_kGalleryAssetsPackage/${recipe.imagePath}',
+              tag: 'packages/$_kGalleryAssetsPackage/${recipe!.imagePath}',
               child: AspectRatio(
                 aspectRatio: 4.0 / 3.0,
                 child: Image.asset(
-                  recipe.imagePath,
-                  package: recipe.imagePackage,
+                  recipe!.imagePath!,
+                  package: recipe!.imagePackage,
                   fit: BoxFit.cover,
-                  semanticLabel: recipe.name,
+                  semanticLabel: recipe!.name,
                 ),
               ),
             ),
@@ -283,8 +283,8 @@
                   Padding(
                     padding: const EdgeInsets.all(16.0),
                     child: Image.asset(
-                      recipe.ingredientsImagePath,
-                      package: recipe.ingredientsImagePackage,
+                      recipe!.ingredientsImagePath!,
+                      package: recipe!.ingredientsImagePackage,
                       width: 48.0,
                       height: 48.0,
                     ),
@@ -294,8 +294,8 @@
                       crossAxisAlignment: CrossAxisAlignment.start,
                       mainAxisAlignment: MainAxisAlignment.center,
                       children: <Widget>[
-                        Text(recipe.name, style: titleStyle, softWrap: false, overflow: TextOverflow.ellipsis),
-                        Text(recipe.author, style: authorStyle),
+                        Text(recipe!.name!, style: titleStyle, softWrap: false, overflow: TextOverflow.ellipsis),
+                        Text(recipe!.author!, style: authorStyle),
                       ],
                     ),
                   ),
@@ -311,9 +311,9 @@
 
 // Displays one recipe. Includes the recipe sheet with a background image.
 class RecipePage extends StatefulWidget {
-  const RecipePage({ Key key, this.recipe }) : super(key: key);
+  const RecipePage({ Key? key, this.recipe }) : super(key: key);
 
-  final Recipe recipe;
+  final Recipe? recipe;
 
   @override
   _RecipePageState createState() => _RecipePageState();
@@ -342,10 +342,10 @@
             right: 0.0,
             height: appBarHeight + _kFabHalfSize,
             child: Hero(
-              tag: 'packages/$_kGalleryAssetsPackage/${widget.recipe.imagePath}',
+              tag: 'packages/$_kGalleryAssetsPackage/${widget.recipe!.imagePath}',
               child: Image.asset(
-                widget.recipe.imagePath,
-                package: widget.recipe.imagePackage,
+                widget.recipe!.imagePath!,
+                package: widget.recipe!.imagePackage,
                 fit: fullWidth ? BoxFit.fitWidth : BoxFit.cover,
               ),
             ),
@@ -429,7 +429,7 @@
 
 /// Displays the recipe's name and instructions.
 class RecipeSheet extends StatelessWidget {
-  RecipeSheet({ Key key, this.recipe }) : super(key: key);
+  RecipeSheet({ Key? key, this.recipe }) : super(key: key);
 
   final TextStyle titleStyle = const PestoStyle(fontSize: 34.0);
   final TextStyle descriptionStyle = const PestoStyle(fontSize: 15.0, color: Colors.black54, height: 24.0/15.0);
@@ -437,7 +437,7 @@
   final TextStyle itemAmountStyle = PestoStyle(fontSize: 15.0, color: _kTheme.primaryColor, height: 24.0/15.0);
   final TextStyle headingStyle = const PestoStyle(fontSize: 16.0, fontWeight: FontWeight.bold, height: 24.0/15.0);
 
-  final Recipe recipe;
+  final Recipe? recipe;
 
   @override
   Widget build(BuildContext context) {
@@ -457,8 +457,8 @@
                   TableCell(
                     verticalAlignment: TableCellVerticalAlignment.middle,
                     child: Image.asset(
-                      recipe.ingredientsImagePath,
-                      package: recipe.ingredientsImagePackage,
+                      recipe!.ingredientsImagePath!,
+                      package: recipe!.ingredientsImagePackage,
                       width: 32.0,
                       height: 32.0,
                       alignment: Alignment.centerLeft,
@@ -467,7 +467,7 @@
                   ),
                   TableCell(
                     verticalAlignment: TableCellVerticalAlignment.middle,
-                    child: Text(recipe.name, style: titleStyle),
+                    child: Text(recipe!.name!, style: titleStyle),
                   ),
                 ]
               ),
@@ -476,7 +476,7 @@
                   const SizedBox(),
                   Padding(
                     padding: const EdgeInsets.only(top: 8.0, bottom: 4.0),
-                    child: Text(recipe.description, style: descriptionStyle),
+                    child: Text(recipe!.description!, style: descriptionStyle),
                   ),
                 ]
               ),
@@ -489,8 +489,8 @@
                   ),
                 ]
               ),
-              ...recipe.ingredients.map<TableRow>((RecipeIngredient ingredient) {
-                return _buildItemRow(ingredient.amount, ingredient.description);
+              ...recipe!.ingredients!.map<TableRow>((RecipeIngredient ingredient) {
+                return _buildItemRow(ingredient.amount!, ingredient.description!);
               }),
               TableRow(
                 children: <Widget>[
@@ -501,8 +501,8 @@
                   ),
                 ]
               ),
-              ...recipe.steps.map<TableRow>((RecipeStep step) {
-                return _buildItemRow(step.duration ?? '', step.description);
+              ...recipe!.steps!.map<TableRow>((RecipeStep step) {
+                return _buildItemRow(step.duration ?? '', step.description!);
               }),
             ],
           ),
@@ -540,29 +540,29 @@
     this.steps,
   });
 
-  final String name;
-  final String author;
-  final String description;
-  final String imagePath;
-  final String imagePackage;
-  final String ingredientsImagePath;
-  final String ingredientsImagePackage;
-  final List<RecipeIngredient> ingredients;
-  final List<RecipeStep> steps;
+  final String? name;
+  final String? author;
+  final String? description;
+  final String? imagePath;
+  final String? imagePackage;
+  final String? ingredientsImagePath;
+  final String? ingredientsImagePackage;
+  final List<RecipeIngredient>? ingredients;
+  final List<RecipeStep>? steps;
 }
 
 class RecipeIngredient {
   const RecipeIngredient({this.amount, this.description});
 
-  final String amount;
-  final String description;
+  final String? amount;
+  final String? description;
 }
 
 class RecipeStep {
   const RecipeStep({this.duration, this.description});
 
-  final String duration;
-  final String description;
+  final String? duration;
+  final String? description;
 }
 
 const List<Recipe> kPestoRecipes = <Recipe>[
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
index 720634a..2c38d88 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/app.dart
@@ -20,7 +20,7 @@
 class _ShrineAppState extends State<ShrineApp> with SingleTickerProviderStateMixin {
   // Controller to coordinate both the opening/closing of backdrop and sliding
   // of expanding bottom sheet
-  AnimationController _controller;
+  late AnimationController _controller;
 
   @override
   void initState() {
@@ -55,7 +55,7 @@
   }
 }
 
-Route<dynamic> _getRoute(RouteSettings settings) {
+Route<dynamic>? _getRoute(RouteSettings settings) {
   if (settings.name != '/login') {
     return null;
   }
@@ -98,11 +98,11 @@
 
 TextTheme _buildShrineTextTheme(TextTheme base) {
   return base.copyWith(
-    headline5: base.headline5.copyWith(fontWeight: FontWeight.w500),
-    headline6: base.headline6.copyWith(fontSize: 18.0),
-    caption: base.caption.copyWith(fontWeight: FontWeight.w400, fontSize: 14.0),
-    bodyText1: base.bodyText1.copyWith(fontWeight: FontWeight.w500, fontSize: 16.0),
-    button: base.button.copyWith(fontWeight: FontWeight.w500, fontSize: 14.0),
+    headline5: base.headline5!.copyWith(fontWeight: FontWeight.w500),
+    headline6: base.headline6!.copyWith(fontSize: 18.0),
+    caption: base.caption!.copyWith(fontWeight: FontWeight.w400, fontSize: 14.0),
+    bodyText1: base.bodyText1!.copyWith(fontWeight: FontWeight.w500, fontSize: 16.0),
+    button: base.button!.copyWith(fontWeight: FontWeight.w500, fontSize: 14.0),
   ).apply(
     fontFamily: 'Raleway',
     displayColor: kShrineBrown900,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/backdrop.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/backdrop.dart
index 4e85d65..89e05f1 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/backdrop.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/backdrop.dart
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import 'package:flutter/material.dart';
-import 'package:meta/meta.dart';
 
 import 'package:flutter_gallery/demo/shrine/login.dart';
 
@@ -15,37 +14,37 @@
 class _TappableWhileStatusIs extends StatefulWidget {
   const _TappableWhileStatusIs(
       this.status, {
-        Key key,
+        Key? key,
         this.controller,
         this.child,
       }) : super(key: key);
 
-  final AnimationController controller;
+  final AnimationController? controller;
   final AnimationStatus status;
-  final Widget child;
+  final Widget? child;
 
   @override
   _TappableWhileStatusIsState createState() => _TappableWhileStatusIsState();
 }
 
 class _TappableWhileStatusIsState extends State<_TappableWhileStatusIs> {
-  bool _active;
+  bool? _active;
 
   @override
   void initState() {
     super.initState();
-    widget.controller.addStatusListener(_handleStatusChange);
-    _active = widget.controller.status == widget.status;
+    widget.controller!.addStatusListener(_handleStatusChange);
+    _active = widget.controller!.status == widget.status;
   }
 
   @override
   void dispose() {
-    widget.controller.removeStatusListener(_handleStatusChange);
+    widget.controller!.removeStatusListener(_handleStatusChange);
     super.dispose();
   }
 
   void _handleStatusChange(AnimationStatus status) {
-    final bool value = widget.controller.status == widget.status;
+    final bool value = widget.controller!.status == widget.status;
     if (_active != value) {
       setState(() {
         _active = value;
@@ -56,11 +55,11 @@
   @override
   Widget build(BuildContext context) {
     Widget child = AbsorbPointer(
-      absorbing: !_active,
+      absorbing: !_active!,
       child: widget.child,
     );
 
-    if (!_active) {
+    if (!_active!) {
       child = FocusScope(
         canRequestFocus: false,
         debugLabel: '$_TappableWhileStatusIs',
@@ -73,13 +72,13 @@
 
 class _FrontLayer extends StatelessWidget {
   const _FrontLayer({
-    Key key,
+    Key? key,
     this.onTap,
     this.child,
   }) : super(key: key);
 
-  final VoidCallback onTap;
-  final Widget child;
+  final VoidCallback? onTap;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -100,7 +99,7 @@
             ),
           ),
           Expanded(
-            child: child,
+            child: child!,
           ),
         ],
       ),
@@ -110,16 +109,14 @@
 
 class _BackdropTitle extends AnimatedWidget {
   const _BackdropTitle({
-    Key key,
-    Animation<double> listenable,
+    Key? key,
+    required Animation<double> listenable,
     this.onPress,
-    @required this.frontTitle,
-    @required this.backTitle,
-  }) : assert(frontTitle != null),
-       assert(backTitle != null),
-       super(key: key, listenable: listenable);
+    required this.frontTitle,
+    required this.backTitle,
+  }) : super(key: key, listenable: listenable);
 
-  final void Function() onPress;
+  final void Function()? onPress;
   final Widget frontTitle;
   final Widget backTitle;
 
@@ -131,7 +128,7 @@
     );
 
     return DefaultTextStyle(
-      style: Theme.of(context).primaryTextTheme.headline6,
+      style: Theme.of(context).primaryTextTheme.headline6!,
       softWrap: false,
       overflow: TextOverflow.ellipsis,
       child: Row(children: <Widget>[
@@ -201,16 +198,12 @@
 /// front or back layer is showing.
 class Backdrop extends StatefulWidget {
   const Backdrop({
-    @required this.frontLayer,
-    @required this.backLayer,
-    @required this.frontTitle,
-    @required this.backTitle,
-    @required this.controller,
-  }) : assert(frontLayer != null),
-       assert(backLayer != null),
-       assert(frontTitle != null),
-       assert(backTitle != null),
-       assert(controller != null);
+    required this.frontLayer,
+    required this.backLayer,
+    required this.frontTitle,
+    required this.backTitle,
+    required this.controller,
+  });
 
   final Widget frontLayer;
   final Widget backLayer;
@@ -224,8 +217,8 @@
 
 class _BackdropState extends State<Backdrop> with SingleTickerProviderStateMixin {
   final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop');
-  AnimationController _controller;
-  Animation<RelativeRect> _layerAnimation;
+  AnimationController? _controller;
+  late Animation<RelativeRect> _layerAnimation;
 
   @override
   void initState() {
@@ -235,19 +228,19 @@
 
   @override
   void dispose() {
-    _controller.dispose();
+    _controller!.dispose();
     super.dispose();
   }
 
   bool get _frontLayerVisible {
-    final AnimationStatus status = _controller.status;
+    final AnimationStatus status = _controller!.status;
     return status == AnimationStatus.completed || status == AnimationStatus.forward;
   }
 
   void _toggleBackdropLayerVisibility() {
     // Call setState here to update layerAnimation if that's necessary
     setState(() {
-      _frontLayerVisible ? _controller.reverse() : _controller.forward();
+      _frontLayerVisible ? _controller!.reverse() : _controller!.forward();
     });
   }
 
@@ -267,7 +260,7 @@
       firstWeight = _kPeakVelocityTime;
       secondWeight = 1.0 - _kPeakVelocityTime;
       animation = CurvedAnimation(
-        parent: _controller.view,
+        parent: _controller!.view,
         curve: const Interval(0.0, 0.78),
       );
     } else {
@@ -276,7 +269,7 @@
       secondCurve = _kAccelerateCurve.flipped;
       firstWeight = 1.0 - _kPeakVelocityTime;
       secondWeight = _kPeakVelocityTime;
-      animation = _controller.view;
+      animation = _controller!.view;
     }
 
     return TweenSequence<RelativeRect>(
@@ -351,7 +344,7 @@
       elevation: 0.0,
       titleSpacing: 0.0,
       title: _BackdropTitle(
-        listenable: _controller.view,
+        listenable: _controller!.view,
         onPress: _toggleBackdropLayerVisibility,
         frontTitle: widget.frontTitle,
         backTitle: widget.backTitle,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/category_menu_page.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/category_menu_page.dart
index da08a80..891ee40 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/category_menu_page.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/category_menu_page.dart
@@ -11,22 +11,22 @@
 
 class CategoryMenuPage extends StatelessWidget {
   const CategoryMenuPage({
-    Key key,
+    Key? key,
     this.onCategoryTap,
   }) : super(key: key);
 
-  final VoidCallback onCategoryTap;
+  final VoidCallback? onCategoryTap;
 
   Widget _buildCategory(Category category, BuildContext context) {
     final String categoryString = category.toString().replaceAll('Category.', '').toUpperCase();
     final ThemeData theme = Theme.of(context);
     return ScopedModelDescendant<AppStateModel>(
-      builder: (BuildContext context, Widget child, AppStateModel model) =>
+      builder: (BuildContext context, Widget? child, AppStateModel model) =>
           GestureDetector(
             onTap: () {
               model.setCategory(category);
               if (onCategoryTap != null) {
-                onCategoryTap();
+                onCategoryTap!();
               }
             },
             child: model.selectedCategory == category
@@ -50,7 +50,7 @@
                   padding: const EdgeInsets.symmetric(vertical: 16.0),
                   child: Text(
                     categoryString,
-                    style: theme.textTheme.bodyText1.copyWith(
+                    style: theme.textTheme.bodyText1!.copyWith(
                       color: kShrineBrown900.withAlpha(153)
                     ),
                     textAlign: TextAlign.center,
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart
index d62e9bc..8b1fc80 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart
@@ -4,7 +4,6 @@
 
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
-import 'package:meta/meta.dart';
 import 'package:scoped_model/scoped_model.dart';
 
 import 'package:flutter_gallery/demo/shrine/colors.dart';
@@ -26,19 +25,16 @@
 const double _kWidthForCartIcon = 64.0;
 
 class ExpandingBottomSheet extends StatefulWidget {
-  const ExpandingBottomSheet({Key key, @required this.hideController})
-      : assert(hideController != null),
-        super(key: key);
+  const ExpandingBottomSheet({Key? key, required this.hideController})
+      : super(key: key);
 
   final AnimationController hideController;
 
   @override
   _ExpandingBottomSheetState createState() => _ExpandingBottomSheetState();
 
-  static _ExpandingBottomSheetState of(BuildContext context, {bool isNullOk = false}) {
-    assert(isNullOk != null);
-    assert(context != null);
-    final _ExpandingBottomSheetState result = context.findAncestorStateOfType<_ExpandingBottomSheetState>();
+  static _ExpandingBottomSheetState? of(BuildContext context, {bool isNullOk = false}) {
+    final _ExpandingBottomSheetState? result = context.findAncestorStateOfType<_ExpandingBottomSheetState>();
     if (isNullOk || result != null) {
       return result;
     }
@@ -53,11 +49,11 @@
 // curve formula. It's quintic, not cubic. But it _can_ be expressed as one
 // curve followed by another, which we do here.
 Animation<T> _getEmphasizedEasingAnimation<T>({
-  @required T begin,
-  @required T peak,
-  @required T end,
-  @required bool isForward,
-  @required Animation<double> parent,
+  required T begin,
+  required T peak,
+  required T end,
+  required bool isForward,
+  required Animation<double> parent,
 }) {
   Curve firstCurve;
   Curve secondCurve;
@@ -98,7 +94,7 @@
 
 // Calculates the value where two double Animations should be joined. Used by
 // callers of _getEmphasisedEasing<double>().
-double _getPeakPoint({double begin, double end}) {
+double _getPeakPoint({required double begin, required double end}) {
   return begin + (end - begin) * _kPeakVelocityProgress;
 }
 
@@ -111,15 +107,15 @@
   double _width = _kWidthForCartIcon;
 
   // Controller for the opening and closing of the ExpandingBottomSheet
-  AnimationController _controller;
+  late AnimationController _controller;
 
   // Animations for the opening and closing of the ExpandingBottomSheet
-  Animation<double> _widthAnimation;
-  Animation<double> _heightAnimation;
-  Animation<double> _thumbnailOpacityAnimation;
-  Animation<double> _cartOpacityAnimation;
-  Animation<double> _shapeAnimation;
-  Animation<Offset> _slideAnimation;
+  late Animation<double> _widthAnimation;
+  late Animation<double> _heightAnimation;
+  late Animation<double> _thumbnailOpacityAnimation;
+  late Animation<double> _cartOpacityAnimation;
+  late Animation<double> _shapeAnimation;
+  late Animation<Offset> _slideAnimation;
 
   @override
   void initState() {
@@ -308,7 +304,7 @@
     );
   }
 
-  Widget _buildCart(BuildContext context, Widget child) {
+  Widget _buildCart(BuildContext context, Widget? child) {
     // numProducts is the number of different products in the cart (does not
     // include multiples of the same product).
     final AppStateModel model = ScopedModel.of<AppStateModel>(context);
@@ -349,7 +345,7 @@
   }
 
   // Builder for the hide and reveal animation when the backdrop opens and closes
-  Widget _buildSlideAnimation(BuildContext context, Widget child) {
+  Widget _buildSlideAnimation(BuildContext context, Widget? child) {
     _slideAnimation = _getEmphasizedEasingAnimation(
       begin: const Offset(1.0, 0.0),
       peak: const Offset(_kPeakVelocityProgress, 0.0),
@@ -393,7 +389,7 @@
             behavior: HitTestBehavior.opaque,
             onTap: open,
             child: ScopedModelDescendant<AppStateModel>(
-              builder: (BuildContext context, Widget child, AppStateModel model) {
+              builder: (BuildContext context, Widget? child, AppStateModel model) {
                 return AnimatedBuilder(
                   builder: _buildCart,
                   animation: _controller,
@@ -417,10 +413,10 @@
 
   // _list represents what's currently on screen. If _internalList updates,
   // it will need to be updated to match it.
-  _ListModel _list;
+  late _ListModel _list;
 
   // _internalList represents the list as it is updated by the AppStateModel.
-  List<int> _internalList;
+  late List<int> _internalList;
 
   @override
   void initState() {
@@ -436,7 +432,6 @@
   Product _productWithId(int productId) {
     final AppStateModel model = ScopedModel.of<AppStateModel>(context);
     final Product product = model.getProductById(productId);
-    assert(product != null);
     return product;
   }
 
@@ -510,7 +505,7 @@
   Widget build(BuildContext context) {
     _updateLists();
     return ScopedModelDescendant<AppStateModel>(
-      builder: (BuildContext context, Widget child, AppStateModel model) => _buildAnimatedList(),
+      builder: (BuildContext context, Widget? child, AppStateModel model) => _buildAnimatedList(),
     );
   }
 }
@@ -529,7 +524,7 @@
     final int numProducts = products.length;
     if (numProducts > 3) {
       for (int i = 3; i < numProducts; i++) {
-        overflow += productMap[products[i]];
+        overflow += productMap[products[i]]!;
       }
     }
     return overflow;
@@ -553,7 +548,7 @@
   @override
   Widget build(BuildContext context) {
     return ScopedModelDescendant<AppStateModel>(
-      builder: (BuildContext builder, Widget child, AppStateModel model) => _buildOverflow(model, context),
+      builder: (BuildContext builder, Widget? child, AppStateModel model) => _buildOverflow(model, context),
     );
   }
 }
@@ -594,18 +589,16 @@
 // _ListModel manipulates an internal list and an AnimatedList
 class _ListModel {
   _ListModel({
-    @required this.listKey,
-    @required this.removedItemBuilder,
-    Iterable<int> initialItems,
-  }) : assert(listKey != null),
-       assert(removedItemBuilder != null),
-       _items = initialItems?.toList() ?? <int>[];
+    required this.listKey,
+    required this.removedItemBuilder,
+    Iterable<int>? initialItems,
+  }) : _items = initialItems?.toList() ?? <int>[];
 
   final GlobalKey<AnimatedListState> listKey;
   final Widget Function(int item, BuildContext context, Animation<double> animation) removedItemBuilder;
   final List<int> _items;
 
-  AnimatedListState get _animatedList => listKey.currentState;
+  AnimatedListState? get _animatedList => listKey.currentState;
 
   void add(int product) {
     _insert(_items.length, product);
@@ -613,7 +606,7 @@
 
   void _insert(int index, int item) {
     _items.insert(index, item);
-    _animatedList.insertItem(index, duration: const Duration(milliseconds: 225));
+    _animatedList!.insertItem(index, duration: const Duration(milliseconds: 225));
   }
 
   void remove(int product) {
@@ -625,11 +618,9 @@
 
   void _removeAt(int index) {
     final int removedItem = _items.removeAt(index);
-    if (removedItem != null) {
-      _animatedList.removeItem(index, (BuildContext context, Animation<double> animation) {
-        return removedItemBuilder(removedItem, context, animation);
-      });
-    }
+    _animatedList!.removeItem(index, (BuildContext context, Animation<double> animation) {
+      return removedItemBuilder(removedItem, context, animation);
+    });
   }
 
   int get length => _items.length;
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/home.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/home.dart
index da3393d..fb16a0d 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/home.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/home.dart
@@ -19,7 +19,7 @@
   @override
   Widget build(BuildContext context) {
     return ScopedModelDescendant<AppStateModel>(
-      builder: (BuildContext context, Widget child, AppStateModel model) {
+      builder: (BuildContext context, Widget? child, AppStateModel model) {
         return AsymmetricView(products: model.getProducts());
       });
   }
@@ -29,17 +29,18 @@
   const HomePage({
     this.expandingBottomSheet,
     this.backdrop,
-    Key key,
+    Key? key,
   }) : super(key: key);
 
-  final ExpandingBottomSheet expandingBottomSheet;
-  final Backdrop backdrop;
+  final ExpandingBottomSheet? expandingBottomSheet;
+  final Backdrop? backdrop;
 
   @override
   Widget build(BuildContext context) {
     return Stack(
       children: <Widget>[
-        backdrop,
+        if (backdrop != null)
+          backdrop!,
         Align(child: expandingBottomSheet, alignment: Alignment.bottomRight),
       ],
     );
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/login.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/login.dart
index 1f00f99..3061a41 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/login.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/login.dart
@@ -35,7 +35,7 @@
             // The login screen is immediately displayed on top of the Shrine
             // home screen using onGenerateRoute and so rootNavigator must be
             // set to true in order to get out of Shrine completely.
-            Navigator.of(context, rootNavigator: true).pop();
+            Navigator.of(context, rootNavigator: true)!.pop();
           },
         ),
       ),
@@ -95,7 +95,7 @@
                         // the Shrine home screen using onGenerateRoute and so
                         // rootNavigator must be set to true in order to get out
                         // of Shrine completely.
-                        Navigator.of(context, rootNavigator: true).pop();
+                        Navigator.of(context, rootNavigator: true)!.pop();
                       },
                       child: const Text('CANCEL'),
                     ),
@@ -123,15 +123,15 @@
 }
 
 class PrimaryColorOverride extends StatelessWidget {
-  const PrimaryColorOverride({Key key, this.color, this.child}) : super(key: key);
+  const PrimaryColorOverride({Key? key, this.color, this.child}) : super(key: key);
 
-  final Color color;
-  final Widget child;
+  final Color? color;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
     return Theme(
-      child: child,
+      child: child!,
       data: Theme.of(context).copyWith(primaryColor: color),
     );
   }
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/app_state_model.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/app_state_model.dart
index 46a5ac9..2c00dbe 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/app_state_model.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/app_state_model.dart
@@ -12,7 +12,7 @@
 
 class AppStateModel extends Model {
   // All the available products.
-  List<Product> _availableProducts;
+  List<Product>? _availableProducts;
 
   // The currently selected category of products.
   Category _selectedCategory = Category.all;
@@ -30,7 +30,7 @@
   // Totaled prices of the items in the cart.
   double get subtotalCost {
     return _productsInCart.keys
-      .map((int id) => _availableProducts[id].price * _productsInCart[id])
+      .map((int id) => _availableProducts![id].price * _productsInCart[id]!)
       .fold(0.0, (double sum, int e) => sum + e);
   }
 
@@ -52,9 +52,9 @@
     }
 
     if (_selectedCategory == Category.all) {
-      return List<Product>.from(_availableProducts);
+      return List<Product>.from(_availableProducts!);
     } else {
-      return _availableProducts
+      return _availableProducts!
         .where((Product p) => p.category == _selectedCategory)
         .toList();
     }
@@ -62,10 +62,11 @@
 
   // Adds a product to the cart.
   void addProductToCart(int productId) {
-    if (!_productsInCart.containsKey(productId)) {
+    final int? value = _productsInCart[productId];
+    if (value == null) {
       _productsInCart[productId] = 1;
     } else {
-      _productsInCart[productId]++;
+      _productsInCart[productId] = value+1;
     }
 
     notifyListeners();
@@ -73,11 +74,13 @@
 
   // Removes an item from the cart.
   void removeItemFromCart(int productId) {
-    if (_productsInCart.containsKey(productId)) {
+    final int? value = _productsInCart[productId];
+
+    if (value != null) {
       if (_productsInCart[productId] == 1) {
         _productsInCart.remove(productId);
       } else {
-        _productsInCart[productId]--;
+        _productsInCart[productId] = value - 1;
       }
     }
 
@@ -86,7 +89,7 @@
 
   // Returns the Product instance matching the provided id.
   Product getProductById(int id) {
-    return _availableProducts.firstWhere((Product p) => p.id == id);
+    return _availableProducts!.firstWhere((Product p) => p.id == id);
   }
 
   // Removes everything from the cart.
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/product.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/product.dart
index d37b71a..8c328b7 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/product.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/model/product.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:flutter/foundation.dart';
-
 enum Category {
   all,
   accessories,
@@ -13,16 +11,12 @@
 
 class Product {
   const Product({
-    @required this.category,
-    @required this.id,
-    @required this.isFeatured,
-    @required this.name,
-    @required this.price,
-  }) : assert(category != null),
-       assert(id != null),
-       assert(isFeatured != null),
-       assert(name != null),
-       assert(price != null);
+    required this.category,
+    required this.id,
+    required this.isFeatured,
+    required this.name,
+    required this.price,
+  });
 
   final Category category;
   final int id;
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/shopping_cart.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/shopping_cart.dart
index 0c05739..adcdfbb 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/shopping_cart.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/shopping_cart.dart
@@ -41,7 +41,7 @@
       body: SafeArea(
         child: Container(
           child: ScopedModelDescendant<AppStateModel>(
-            builder: (BuildContext context, Widget child, AppStateModel model) {
+            builder: (BuildContext context, Widget? child, AppStateModel model) {
               return Stack(
                 children: <Widget>[
                   ListView(
@@ -52,12 +52,12 @@
                             width: _leftColumnWidth,
                             child: IconButton(
                               icon: const Icon(Icons.keyboard_arrow_down),
-                              onPressed: () => ExpandingBottomSheet.of(context).close(),
+                              onPressed: () => ExpandingBottomSheet.of(context)!.close(),
                             ),
                           ),
                           Text(
                             'CART',
-                            style: localTheme.textTheme.subtitle1.copyWith(fontWeight: FontWeight.w600),
+                            style: localTheme.textTheme.subtitle1!.copyWith(fontWeight: FontWeight.w600),
                           ),
                           const SizedBox(width: 16.0),
                           Text('${model.totalCartQuantity} ITEMS'),
@@ -88,7 +88,7 @@
                       ),
                       onPressed: () {
                         model.clearCart();
-                        ExpandingBottomSheet.of(context).close();
+                        ExpandingBottomSheet.of(context)!.close();
                       },
                     ),
                   ),
@@ -105,12 +105,12 @@
 class ShoppingCartSummary extends StatelessWidget {
   const ShoppingCartSummary({this.model});
 
-  final AppStateModel model;
+  final AppStateModel? model;
 
   @override
   Widget build(BuildContext context) {
-    final TextStyle smallAmountStyle = Theme.of(context).textTheme.bodyText2.copyWith(color: kShrineBrown600);
-    final TextStyle largeAmountStyle = Theme.of(context).textTheme.headline4;
+    final TextStyle smallAmountStyle = Theme.of(context).textTheme.bodyText2!.copyWith(color: kShrineBrown600);
+    final TextStyle? largeAmountStyle = Theme.of(context).textTheme.headline4;
     final NumberFormat formatter = NumberFormat.simpleCurrency(
       decimalDigits: 2,
       locale: Localizations.localeOf(context).toString(),
@@ -131,7 +131,7 @@
                       child: Text('TOTAL'),
                     ),
                     Text(
-                      formatter.format(model.totalCost),
+                      formatter.format(model!.totalCost),
                       style: largeAmountStyle,
                     ),
                   ],
@@ -143,7 +143,7 @@
                       child: Text('Subtotal:'),
                     ),
                     Text(
-                      formatter.format(model.subtotalCost),
+                      formatter.format(model!.subtotalCost),
                       style: smallAmountStyle,
                     ),
                   ],
@@ -155,7 +155,7 @@
                       child: Text('Shipping:'),
                     ),
                     Text(
-                      formatter.format(model.shippingCost),
+                      formatter.format(model!.shippingCost),
                       style: smallAmountStyle,
                     ),
                   ],
@@ -167,7 +167,7 @@
                       child: Text('Tax:'),
                     ),
                     Text(
-                      formatter.format(model.tax),
+                      formatter.format(model!.tax),
                       style: smallAmountStyle,
                     ),
                   ],
@@ -183,14 +183,14 @@
 
 class ShoppingCartRow extends StatelessWidget {
   const ShoppingCartRow({
-    @required this.product,
-    @required this.quantity,
+    required this.product,
+    required this.quantity,
     this.onPressed,
   });
 
   final Product product;
-  final int quantity;
-  final VoidCallback onPressed;
+  final int? quantity;
+  final VoidCallback? onPressed;
 
   @override
   Widget build(BuildContext context) {
@@ -243,7 +243,7 @@
                             ),
                             Text(
                               product.name,
-                              style: localTheme.textTheme.subtitle1.copyWith(fontWeight: FontWeight.w600),
+                              style: localTheme.textTheme.subtitle1!.copyWith(fontWeight: FontWeight.w600),
                             ),
                           ],
                         ),
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart
index 147b7a2..9cbce63 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart
@@ -8,12 +8,12 @@
 import 'package:flutter_gallery/demo/shrine/supplemental/product_columns.dart';
 
 class AsymmetricView extends StatelessWidget {
-  const AsymmetricView({Key key, this.products}) : super(key: key);
+  const AsymmetricView({Key? key, this.products}) : super(key: key);
 
-  final List<Product> products;
+  final List<Product>? products;
 
   List<Container> _buildColumns(BuildContext context) {
-    if (products == null || products.isEmpty) {
+    if (products == null || products!.isEmpty) {
       return const <Container>[];
     }
 
@@ -25,23 +25,23 @@
     // some kinda awkward math so we use _evenCasesIndex and _oddCasesIndex as
     // helpers for creating the index of the product list that will correspond
     // to the index of the list of columns.
-    return List<Container>.generate(_listItemCount(products.length), (int index) {
+    return List<Container>.generate(_listItemCount(products!.length), (int index) {
       double width = .59 * MediaQuery.of(context).size.width;
       Widget column;
       if (index.isEven) {
         /// Even cases
         final int bottom = _evenCasesIndex(index);
         column = TwoProductCardColumn(
-          bottom: products[bottom],
-          top: products.length - 1 >= bottom + 1
-            ? products[bottom + 1]
+          bottom: products![bottom],
+          top: products!.length - 1 >= bottom + 1
+            ? products![bottom + 1]
             : null,
         );
         width += 32.0;
       } else {
         /// Odd cases
         column = OneProductCardColumn(
-          product: products[_oddCasesIndex(index)],
+          product: products![_oddCasesIndex(index)],
         );
       }
       return Container(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart
index b67d0e7..ef892be 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart
@@ -21,10 +21,10 @@
 
   @override
   CutCornersBorder copyWith({
-    BorderSide borderSide,
-    BorderRadius borderRadius,
-    double gapPadding,
-    double cut,
+    BorderSide? borderSide,
+    BorderRadius? borderRadius,
+    double? gapPadding,
+    double? cut,
   }) {
     return CutCornersBorder(
       borderSide: borderSide ?? this.borderSide,
@@ -37,11 +37,11 @@
   final double cut;
 
   @override
-  ShapeBorder lerpFrom(ShapeBorder a, double t) {
+  ShapeBorder? lerpFrom(ShapeBorder? a, double t) {
     if (a is CutCornersBorder) {
       final CutCornersBorder outline = a;
       return CutCornersBorder(
-        borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t),
+        borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t)!,
         borderSide: BorderSide.lerp(outline.borderSide, borderSide, t),
         cut: cut,
         gapPadding: outline.gapPadding,
@@ -51,11 +51,11 @@
   }
 
   @override
-  ShapeBorder lerpTo(ShapeBorder b, double t) {
+  ShapeBorder? lerpTo(ShapeBorder? b, double t) {
     if (b is CutCornersBorder) {
       final CutCornersBorder outline = b;
       return CutCornersBorder(
-        borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t),
+        borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t)!,
         borderSide: BorderSide.lerp(borderSide, outline.borderSide, t),
         cut: cut,
         gapPadding: outline.gapPadding,
@@ -64,10 +64,10 @@
     return super.lerpTo(b, t);
   }
 
-  Path _notchedCornerPath(Rect center, [double start = 0.0, double extent = 0.0]) {
+  Path _notchedCornerPath(Rect center, [double start = 0.0, double? extent = 0.0]) {
     final Path path = Path();
-    if (start > 0.0 || extent > 0.0) {
-      path.relativeMoveTo(extent + start, center.top);
+    if (start > 0.0 || extent! > 0.0) {
+      path.relativeMoveTo(extent! + start, center.top);
       _notchedSidesAndBottom(center, path);
       path..lineTo(center.left + cut, center.top)..lineTo(start, center.top);
     } else {
@@ -93,12 +93,11 @@
   void paint(
     Canvas canvas,
     Rect rect, {
-    double gapStart,
+    double? gapStart,
     double gapExtent = 0.0,
     double gapPercentage = 0.0,
-    TextDirection textDirection,
+    TextDirection? textDirection,
   }) {
-    assert(gapExtent != null);
     assert(gapPercentage >= 0.0 && gapPercentage <= 1.0);
 
     final Paint paint = borderSide.toPaint();
@@ -106,10 +105,10 @@
     if (gapStart == null || gapExtent <= 0.0 || gapPercentage == 0.0) {
       canvas.drawPath(_notchedCornerPath(outer.middleRect), paint);
     } else {
-      final double extent = lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage);
+      final double? extent = lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage);
       switch (textDirection) {
         case TextDirection.rtl: {
-          final Path path = _notchedCornerPath(outer.middleRect, gapStart + gapPadding - extent, extent);
+          final Path path = _notchedCornerPath(outer.middleRect, gapStart + gapPadding - extent!, extent);
           canvas.drawPath(path, paint);
           break;
         }
@@ -118,6 +117,8 @@
           canvas.drawPath(path, paint);
           break;
         }
+        default:
+          break;
       }
     }
   }
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart
index 27b7be5..f7becf5 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart
@@ -11,10 +11,10 @@
 
 class ProductCard extends StatelessWidget {
   const ProductCard({ this.imageAspectRatio = 33 / 49, this.product })
-      : assert(imageAspectRatio == null || imageAspectRatio > 0);
+      : assert(imageAspectRatio > 0);
 
   final double imageAspectRatio;
-  final Product product;
+  final Product? product;
 
   static const double kTextBoxHeight = 65.0;
 
@@ -28,16 +28,16 @@
     final ThemeData theme = Theme.of(context);
 
     final Image imageWidget = Image.asset(
-      product.assetName,
-      package: product.assetPackage,
+      product!.assetName,
+      package: product!.assetPackage,
       fit: BoxFit.cover,
     );
 
     return ScopedModelDescendant<AppStateModel>(
-      builder: (BuildContext context, Widget child, AppStateModel model) {
+      builder: (BuildContext context, Widget? child, AppStateModel model) {
         return GestureDetector(
           onTap: () {
-            model.addProductToCart(product.id);
+            model.addProductToCart(product!.id);
           },
           child: child,
         );
@@ -60,7 +60,7 @@
                   crossAxisAlignment: CrossAxisAlignment.center,
                   children: <Widget>[
                     Text(
-                      product == null ? '' : product.name,
+                      product == null ? '' : product!.name,
                       style: theme.textTheme.button,
                       softWrap: false,
                       overflow: TextOverflow.ellipsis,
@@ -68,7 +68,7 @@
                     ),
                     const SizedBox(height: 4.0),
                     Text(
-                      product == null ? '' : formatter.format(product.price),
+                      product == null ? '' : formatter.format(product!.price),
                       style: theme.textTheme.caption,
                     ),
                   ],
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart
index c989da1..4aa3e36 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart
@@ -9,11 +9,11 @@
 
 class TwoProductCardColumn extends StatelessWidget {
   const TwoProductCardColumn({
-    @required this.bottom,
+    required this.bottom,
     this.top,
-  }) : assert(bottom != null);
+  });
 
-  final Product bottom, top;
+  final Product? bottom, top;
 
   @override
   Widget build(BuildContext context) {
@@ -59,7 +59,7 @@
 class OneProductCardColumn extends StatelessWidget {
   const OneProductCardColumn({this.product});
 
-  final Product product;
+  final Product? product;
 
   @override
   Widget build(BuildContext context) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/shrine_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/shrine_demo.dart
index 3c46465..7bb548d 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/shrine_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/shrine_demo.dart
@@ -6,7 +6,7 @@
 import 'package:flutter_gallery/demo/shrine/app.dart';
 
 class ShrineDemo extends StatelessWidget {
-  const ShrineDemo({ Key key }) : super(key: key);
+  const ShrineDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/shrine'; // Used by the Gallery app.
 
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo.dart
index ad41788..0f4e88e 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo.dart
@@ -9,7 +9,7 @@
 import 'transformations_demo_gesture_transformable.dart';
 
 class TransformationsDemo extends StatefulWidget {
-  const TransformationsDemo({ Key key }) : super(key: key);
+  const TransformationsDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/transformations';
 
@@ -107,7 +107,7 @@
         TextButton(
           child: const Text('OK'),
           onPressed: () {
-            Navigator.of(context).pop();
+            Navigator.of(context)!.pop();
           },
         ),
       ],
@@ -139,10 +139,10 @@
             height: 150,
             padding: const EdgeInsets.all(12.0),
             child: EditBoardPoint(
-              boardPoint: _board.selected,
+              boardPoint: _board.selected!,
               onColorSelection: (Color color) {
                 setState(() {
-                  _board = _board.copyWithBoardPointColor(_board.selected, color);
+                  _board = _board.copyWithBoardPointColor(_board.selected!, color);
                   Navigator.pop(context);
                 });
               },
@@ -157,7 +157,7 @@
 
   void _onTapUp(TapUpDetails details) {
     final Offset scenePoint = details.globalPosition;
-    final BoardPoint boardPoint = _board.pointToBoardPoint(scenePoint);
+    final BoardPoint? boardPoint = _board.pointToBoardPoint(scenePoint);
     setState(() {
       _board = _board.copyWithSelected(boardPoint);
     });
@@ -171,19 +171,19 @@
     this.board,
   });
 
-  final Board board;
+  final Board? board;
 
   @override
   void paint(Canvas canvas, Size size) {
-    void drawBoardPoint(BoardPoint boardPoint) {
-      final Color color = boardPoint.color.withOpacity(
-        board.selected == boardPoint ? 0.2 : 1.0,
+    void drawBoardPoint(BoardPoint? boardPoint) {
+      final Color color = boardPoint!.color.withOpacity(
+        board!.selected == boardPoint ? 0.2 : 1.0,
       );
-      final Vertices vertices = board.getVerticesForBoardPoint(boardPoint, color);
+      final Vertices vertices = board!.getVerticesForBoardPoint(boardPoint, color);
       canvas.drawVertices(vertices, BlendMode.color, Paint());
     }
 
-    board.forEach(drawBoardPoint);
+    board!.forEach(drawBoardPoint);
   }
 
   // We should repaint whenever the board changes, such as board.selected.
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_board.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_board.dart
index 1ff5d6d..b8806bc 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_board.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_board.dart
@@ -11,13 +11,13 @@
 // The entire state of the hex board and abstraction to get information about
 // it. Iterable so that all BoardPoints on the board can be iterated over.
 @immutable
-class Board extends Object with IterableMixin<BoardPoint> {
+class Board extends Object with IterableMixin<BoardPoint?> {
   Board({
-    @required this.boardRadius,
-    @required this.hexagonRadius,
-    @required this.hexagonMargin,
+    required this.boardRadius,
+    required this.hexagonRadius,
+    required this.hexagonMargin,
     this.selected,
-    List<BoardPoint> boardPoints,
+    List<BoardPoint>? boardPoints,
   }) : assert(boardRadius > 0),
        assert(hexagonRadius > 0),
        assert(hexagonMargin >= 0) {
@@ -43,7 +43,7 @@
       _boardPoints.addAll(boardPoints);
     } else {
       // Generate boardPoints for a fresh board.
-      BoardPoint boardPoint = _getNextBoardPoint(null);
+      BoardPoint? boardPoint = _getNextBoardPoint(null);
       while (boardPoint != null) {
         _boardPoints.add(boardPoint);
         boardPoint = _getNextBoardPoint(boardPoint);
@@ -55,11 +55,11 @@
   final double hexagonRadius; // Pixel radius of a hexagon (center to vertex).
   final double hexagonMargin; // Margin between hexagons.
   final List<Offset> positionsForHexagonAtOrigin = <Offset>[];
-  final BoardPoint selected;
+  final BoardPoint? selected;
   final List<BoardPoint> _boardPoints = <BoardPoint>[];
 
   @override
-  Iterator<BoardPoint> get iterator => _BoardIterator(_boardPoints);
+  Iterator<BoardPoint?> get iterator => _BoardIterator(_boardPoints);
 
   // For a given q axial coordinate, get the range of possible r values
   // See the definition of BoardPoint for more information about hex grids and
@@ -81,7 +81,7 @@
   // Get the BoardPoint that comes after the given BoardPoint. If given null,
   // returns the origin BoardPoint. If given BoardPoint is the last, returns
   // null.
-  BoardPoint _getNextBoardPoint (BoardPoint boardPoint) {
+  BoardPoint? _getNextBoardPoint (BoardPoint? boardPoint) {
     // If before the first element.
     if (boardPoint == null) {
       return BoardPoint(-boardRadius, 0);
@@ -121,7 +121,7 @@
   // Return the q,r BoardPoint for a point in the scene, where the origin is in
   // the center of the board in both coordinate systems. If no BoardPoint at the
   // location, return null.
-  BoardPoint pointToBoardPoint(Offset point) {
+  BoardPoint? pointToBoardPoint(Offset point) {
     final BoardPoint boardPoint = BoardPoint(
       ((sqrt(3) / 3 * point.dx - 1 / 3 * point.dy) / hexagonRadius).round(),
       ((2 / 3 * point.dy) / hexagonRadius).round(),
@@ -160,7 +160,7 @@
   }
 
   // Return a new board with the given BoardPoint selected.
-  Board copyWithSelected(BoardPoint boardPoint) {
+  Board copyWithSelected(BoardPoint? boardPoint) {
     if (selected == boardPoint) {
       return this;
     }
@@ -187,7 +187,7 @@
 
     final List<BoardPoint> nextBoardPoints = List<BoardPoint>.from(_boardPoints);
     nextBoardPoints[boardPointIndex] = nextBoardPoint;
-    final BoardPoint selectedBoardPoint = boardPoint == selected
+    final BoardPoint? selectedBoardPoint = boardPoint == selected
       ? nextBoardPoint
       : selected;
     return Board(
@@ -200,29 +200,30 @@
   }
 }
 
-class _BoardIterator extends Iterator<BoardPoint> {
+class _BoardIterator extends Iterator<BoardPoint?> {
   _BoardIterator(this.boardPoints);
 
   final List<BoardPoint> boardPoints;
-  int currentIndex;
+  int? currentIndex;
 
   @override
-  BoardPoint current;
+  BoardPoint? current;
 
   @override
   bool moveNext() {
-    if (currentIndex == null) {
+    final int? index = currentIndex;
+    if (index == null) {
       currentIndex = 0;
     } else {
-      currentIndex++;
+      currentIndex = index + 1;
     }
 
-    if (currentIndex >= boardPoints.length) {
+    if (currentIndex! >= boardPoints.length) {
       current = null;
       return false;
     }
 
-    current = boardPoints[currentIndex];
+    current = boardPoints[currentIndex!];
     return true;
   }
 }
@@ -231,9 +232,7 @@
 @immutable
 class _Range {
   const _Range(this.min, this.max)
-    : assert(min != null),
-      assert(max != null),
-      assert(min <= max);
+    : assert(min <= max);
 
   final int min;
   final int max;
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_color_picker.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_color_picker.dart
index 40b68b1..4ecdd76 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_color_picker.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_color_picker.dart
@@ -8,15 +8,14 @@
 @immutable
 class ColorPicker extends StatelessWidget {
   const ColorPicker({
-    @required this.colors,
-    @required this.selectedColor,
+    required this.colors,
+    required this.selectedColor,
     this.onColorSelection,
-  }) : assert(colors != null),
-       assert(selectedColor != null);
+  });
 
   final Set<Color> colors;
   final Color selectedColor;
-  final ValueChanged<Color> onColorSelection;
+  final ValueChanged<Color>? onColorSelection;
 
   @override
   Widget build (BuildContext context) {
@@ -28,7 +27,7 @@
           selected: color == selectedColor,
           onTap: () {
             if (onColorSelection != null) {
-              onColorSelection(color);
+              onColorSelection!(color);
             }
           },
         );
@@ -41,15 +40,14 @@
 @immutable
 class _ColorPickerSwatch extends StatelessWidget {
   const _ColorPickerSwatch({
-    @required this.color,
-    @required this.selected,
+    required this.color,
+    required this.selected,
     this.onTap,
-  }) : assert(color != null),
-       assert(selected != null);
+  });
 
   final Color color;
   final bool selected;
-  final Function onTap;
+  final Function? onTap;
 
   @override
   Widget build (BuildContext context) {
@@ -61,7 +59,7 @@
         fillColor: color,
         onPressed: () {
           if (onTap != null) {
-            onTap();
+            onTap!();
           }
         },
         child: !selected ? null : const Icon(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_edit_board_point.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_edit_board_point.dart
index 126b58f..bb8eb2d 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_edit_board_point.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_edit_board_point.dart
@@ -10,14 +10,13 @@
 @immutable
 class EditBoardPoint extends StatelessWidget {
   const EditBoardPoint({
-    Key key,
-    @required this.boardPoint,
+    Key? key,
+    required this.boardPoint,
     this.onColorSelection,
-  }) : assert(boardPoint != null),
-       super(key: key);
+  }) : super(key: key);
 
   final BoardPoint boardPoint;
-  final ValueChanged<Color> onColorSelection;
+  final ValueChanged<Color>? onColorSelection;
 
   @override
   Widget build (BuildContext context) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_gesture_transformable.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_gesture_transformable.dart
index e7f8bad..1424d7b 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_gesture_transformable.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_gesture_transformable.dart
@@ -14,14 +14,14 @@
 @immutable
 class GestureTransformable extends StatefulWidget {
   const GestureTransformable({
-    Key key,
+    Key? key,
     // The child to perform the transformations on.
-    @required this.child,
+    required this.child,
     // The desired visible size of the widget and the area that is receptive to
     // gestures. If a widget that's as big as possible is desired, then wrap
     // this in a LayoutBuilder and pass
     // `Size(constraints.maxWidth, constraints.maxHeight)`.
-    @required this.size,
+    required this.size,
     // The scale will be clamped to between these values. A maxScale of null has
     // no bounds. minScale must be greater than zero.
     this.maxScale = 2.5,
@@ -71,14 +71,7 @@
     this.onScaleStart,
     this.onScaleUpdate,
     this.onScaleEnd,
-  }) : assert(child != null),
-       assert(size != null),
-       assert(minScale != null),
-       assert(minScale > 0),
-       assert(disableTranslation != null),
-       assert(disableScale != null),
-       assert(disableRotation != null),
-       assert(reset != null),
+  }) : assert(minScale > 0),
        assert(
          !reset || onResetEnd != null,
          'Must implement onResetEnd to use reset.',
@@ -88,41 +81,41 @@
   final Widget child;
   final Size size;
   final bool reset;
-  final GestureTapDownCallback onTapDown;
-  final GestureTapUpCallback onTapUp;
-  final GestureTapCallback onTap;
-  final GestureTapCancelCallback onTapCancel;
-  final GestureTapCallback onDoubleTap;
-  final GestureLongPressCallback onLongPress;
-  final GestureLongPressUpCallback onLongPressUp;
-  final GestureDragDownCallback onVerticalDragDown;
-  final GestureDragStartCallback onVerticalDragStart;
-  final GestureDragUpdateCallback onVerticalDragUpdate;
-  final GestureDragEndCallback onVerticalDragEnd;
-  final GestureDragCancelCallback onVerticalDragCancel;
-  final GestureDragDownCallback onHorizontalDragDown;
-  final GestureDragStartCallback onHorizontalDragStart;
-  final GestureDragUpdateCallback onHorizontalDragUpdate;
-  final GestureDragEndCallback onHorizontalDragEnd;
-  final GestureDragCancelCallback onHorizontalDragCancel;
-  final GestureDragDownCallback onPanDown;
-  final GestureDragStartCallback onPanStart;
-  final GestureDragUpdateCallback onPanUpdate;
-  final GestureDragEndCallback onPanEnd;
-  final GestureDragCancelCallback onPanCancel;
-  final VoidCallback onResetEnd;
-  final GestureScaleStartCallback onScaleStart;
-  final GestureScaleUpdateCallback onScaleUpdate;
-  final GestureScaleEndCallback onScaleEnd;
+  final GestureTapDownCallback? onTapDown;
+  final GestureTapUpCallback? onTapUp;
+  final GestureTapCallback? onTap;
+  final GestureTapCancelCallback? onTapCancel;
+  final GestureTapCallback? onDoubleTap;
+  final GestureLongPressCallback? onLongPress;
+  final GestureLongPressUpCallback? onLongPressUp;
+  final GestureDragDownCallback? onVerticalDragDown;
+  final GestureDragStartCallback? onVerticalDragStart;
+  final GestureDragUpdateCallback? onVerticalDragUpdate;
+  final GestureDragEndCallback? onVerticalDragEnd;
+  final GestureDragCancelCallback? onVerticalDragCancel;
+  final GestureDragDownCallback? onHorizontalDragDown;
+  final GestureDragStartCallback? onHorizontalDragStart;
+  final GestureDragUpdateCallback? onHorizontalDragUpdate;
+  final GestureDragEndCallback? onHorizontalDragEnd;
+  final GestureDragCancelCallback? onHorizontalDragCancel;
+  final GestureDragDownCallback? onPanDown;
+  final GestureDragStartCallback? onPanStart;
+  final GestureDragUpdateCallback? onPanUpdate;
+  final GestureDragEndCallback? onPanEnd;
+  final GestureDragCancelCallback? onPanCancel;
+  final VoidCallback? onResetEnd;
+  final GestureScaleStartCallback? onScaleStart;
+  final GestureScaleUpdateCallback? onScaleUpdate;
+  final GestureScaleEndCallback? onScaleEnd;
   final double maxScale;
   final double minScale;
-  final Rect boundaryRect;
+  final Rect? boundaryRect;
   final bool disableTranslation;
   final bool disableScale;
   final bool disableRotation;
-  final Offset initialTranslation;
-  final double initialScale;
-  final double initialRotation;
+  final Offset? initialTranslation;
+  final double? initialScale;
+  final double? initialRotation;
 
   @override _GestureTransformableState createState() => _GestureTransformableState();
 }
@@ -137,20 +130,20 @@
 
 // This is public only for access from a unit test.
 class _GestureTransformableState extends State<GestureTransformable> with TickerProviderStateMixin {
-  Animation<Offset> _animation;
-  AnimationController _controller;
-  Animation<Matrix4> _animationReset;
-  AnimationController _controllerReset;
+  Animation<Offset>? _animation;
+  late AnimationController _controller;
+  Animation<Matrix4>? _animationReset;
+  late AnimationController _controllerReset;
   // The translation that will be applied to the scene (not viewport).
   // A positive x offset moves the scene right, viewport left.
   // A positive y offset moves the scene down, viewport up.
-  Offset _translateFromScene; // Point where a single translation began.
-  double _scaleStart; // Scale value at start of scaling gesture.
-  double _rotationStart = 0.0; // Rotation at start of rotation gesture.
-  Rect _boundaryRect;
+  Offset? _translateFromScene; // Point where a single translation began.
+  double? _scaleStart; // Scale value at start of scaling gesture.
+  double? _rotationStart = 0.0; // Rotation at start of rotation gesture.
+  late Rect _boundaryRect;
   Matrix4 _transform = Matrix4.identity();
   double _currentRotation = 0.0;
-  _GestureType gestureType;
+  _GestureType? gestureType;
 
   // The transformation matrix that gives the initial home position.
   Matrix4 get _initialTransform {
@@ -183,7 +176,7 @@
   // Get the offset of the current widget from the global screen coordinates.
   // TODO(justinmc): Protect against calling this during first build.
   static Offset getOffset(BuildContext context) {
-    final RenderBox renderObject = context.findRenderObject() as RenderBox;
+    final RenderBox renderObject = context.findRenderObject()! as RenderBox;
     return renderObject.localToGlobal(Offset.zero);
   }
 
@@ -220,12 +213,12 @@
     return GestureDetector(
       behavior: HitTestBehavior.opaque, // Necessary when translating off screen
       onTapDown: widget.onTapDown == null ? null : (TapDownDetails details) {
-        widget.onTapDown(TapDownDetails(
+        widget.onTapDown!(TapDownDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onTapUp: widget.onTapUp == null ? null : (TapUpDetails details) {
-        widget.onTapUp(TapUpDetails(
+        widget.onTapUp!(TapUpDetails(
           kind: details.kind,
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
@@ -236,51 +229,51 @@
       onLongPress: widget.onLongPress,
       onLongPressUp: widget.onLongPressUp,
       onVerticalDragDown: widget.onVerticalDragDown == null ? null : (DragDownDetails details) {
-        widget.onVerticalDragDown(DragDownDetails(
+        widget.onVerticalDragDown!(DragDownDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onVerticalDragStart: widget.onVerticalDragStart == null ? null : (DragStartDetails details) {
-        widget.onVerticalDragStart(DragStartDetails(
+        widget.onVerticalDragStart!(DragStartDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onVerticalDragUpdate: widget.onVerticalDragUpdate == null ? null : (DragUpdateDetails details) {
-        widget.onVerticalDragUpdate(DragUpdateDetails(
+        widget.onVerticalDragUpdate!(DragUpdateDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onVerticalDragEnd: widget.onVerticalDragEnd,
       onVerticalDragCancel: widget.onVerticalDragCancel,
       onHorizontalDragDown: widget.onHorizontalDragDown == null ? null : (DragDownDetails details) {
-        widget.onHorizontalDragDown(DragDownDetails(
+        widget.onHorizontalDragDown!(DragDownDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onHorizontalDragStart: widget.onHorizontalDragStart == null ? null : (DragStartDetails details) {
-        widget.onHorizontalDragStart(DragStartDetails(
+        widget.onHorizontalDragStart!(DragStartDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onHorizontalDragUpdate: widget.onHorizontalDragUpdate == null ? null : (DragUpdateDetails details) {
-        widget.onHorizontalDragUpdate(DragUpdateDetails(
+        widget.onHorizontalDragUpdate!(DragUpdateDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onHorizontalDragEnd: widget.onHorizontalDragEnd,
       onHorizontalDragCancel: widget.onHorizontalDragCancel,
       onPanDown: widget.onPanDown == null ? null : (DragDownDetails details) {
-        widget.onPanDown(DragDownDetails(
+        widget.onPanDown!(DragDownDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onPanStart: widget.onPanStart == null ? null : (DragStartDetails details) {
-        widget.onPanStart(DragStartDetails(
+        widget.onPanStart!(DragStartDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
       onPanUpdate: widget.onPanUpdate == null ? null : (DragUpdateDetails details) {
-        widget.onPanUpdate(DragUpdateDetails(
+        widget.onPanUpdate!(DragUpdateDetails(
           globalPosition: fromViewport(details.globalPosition - getOffset(context), _transform),
         ));
       },
@@ -305,7 +298,7 @@
 
   // Return a new matrix representing the given matrix after applying the given
   // translation.
-  Matrix4 matrixTranslate(Matrix4 matrix, Offset translation) {
+  Matrix4 matrixTranslate(Matrix4 matrix, Offset? translation) {
     if (widget.disableTranslation || translation == Offset.zero) {
       return matrix;
     }
@@ -328,7 +321,7 @@
       -scale * viewportBoundaries.top,
     );
     final Matrix4 nextMatrix = matrix.clone()..translate(
-      translation.dx,
+      translation!.dx,
       translation.dy,
     );
     final Vector3 nextTranslationVector = nextMatrix.getTranslation();
@@ -350,7 +343,7 @@
 
   // Return a new matrix representing the given matrix after applying the given
   // scale transform.
-  Matrix4 matrixScale(Matrix4 matrix, double scale) {
+  Matrix4 matrixScale(Matrix4 matrix, double? scale) {
     if (widget.disableScale || scale == 1) {
       return matrix;
     }
@@ -374,11 +367,11 @@
     // Don't allow a scale that results in an overall scale beyond min/max
     // scale.
     final double currentScale = _transform.getMaxScaleOnAxis();
-    final double totalScale = currentScale * scale;
+    final double totalScale = currentScale * scale!;
     final double clampedTotalScale = totalScale.clamp(
       widget.minScale,
       widget.maxScale,
-    ) as double;
+    );
     final double clampedScale = clampedTotalScale / currentScale;
     return matrix..scale(clampedScale);
   }
@@ -386,21 +379,21 @@
   // Return a new matrix representing the given matrix after applying the given
   // rotation transform.
   // Rotating the scene cannot cause the viewport to view beyond _boundaryRect.
-  Matrix4 matrixRotate(Matrix4 matrix, double rotation, Offset focalPoint) {
+  Matrix4 matrixRotate(Matrix4 matrix, double? rotation, Offset focalPoint) {
     if (widget.disableRotation || rotation == 0) {
       return matrix;
     }
     final Offset focalPointScene = fromViewport(focalPoint, matrix);
     return matrix
       ..translate(focalPointScene.dx, focalPointScene.dy)
-      ..rotateZ(-rotation)
+      ..rotateZ(-rotation!)
       ..translate(-focalPointScene.dx, -focalPointScene.dy);
   }
 
   // Handle the start of a gesture of _GestureType.
   void _onScaleStart(ScaleStartDetails details) {
     if (widget.onScaleStart != null) {
-      widget.onScaleStart(details);
+      widget.onScaleStart!(details);
     }
 
     if (_controller.isAnimating) {
@@ -425,7 +418,7 @@
   void _onScaleUpdate(ScaleUpdateDetails details) {
     double scale = _transform.getMaxScaleOnAxis();
     if (widget.onScaleUpdate != null) {
-      widget.onScaleUpdate(ScaleUpdateDetails(
+      widget.onScaleUpdate!(ScaleUpdateDetails(
         focalPoint: fromViewport(details.focalPoint, _transform),
         scale: details.scale,
         rotation: details.rotation,
@@ -453,7 +446,7 @@
         // details.scale gives us the amount to change the scale as of the
         // start of this gesture, so calculate the amount to scale as of the
         // previous call to _onScaleUpdate.
-        final double desiredScale = _scaleStart * details.scale;
+        final double desiredScale = _scaleStart! * details.scale;
         final double scaleChange = desiredScale / scale;
         _transform = matrixScale(_transform, scaleChange);
         scale = _transform.getMaxScaleOnAxis();
@@ -468,13 +461,13 @@
         );
         _transform = matrixTranslate(_transform, focalPointSceneNext - focalPointScene);
       } else if (gestureType == _GestureType.rotate && details.rotation != 0.0) {
-        final double desiredRotation = _rotationStart + details.rotation;
+        final double desiredRotation = _rotationStart! + details.rotation;
         _transform = matrixRotate(_transform, _currentRotation - desiredRotation, details.focalPoint);
         _currentRotation = desiredRotation;
       } else if (_translateFromScene != null && details.scale == 1.0) {
         // Translate so that the same point in the scene is underneath the
         // focal point before and after the movement.
-        final Offset translationChange = focalPointScene - _translateFromScene;
+        final Offset translationChange = focalPointScene - _translateFromScene!;
         _transform = matrixTranslate(_transform, translationChange);
         _translateFromScene = fromViewport(details.focalPoint, _transform);
       }
@@ -484,7 +477,7 @@
   // Handle the end of a gesture of _GestureType.
   void _onScaleEnd(ScaleEndDetails details) {
     if (widget.onScaleEnd != null) {
-      widget.onScaleEnd(details);
+      widget.onScaleEnd!(details);
     }
     setState(() {
       _scaleStart = null;
@@ -510,7 +503,7 @@
       end: inertialMotion.finalPosition,
     ).animate(_controller);
     _controller.duration = Duration(milliseconds: inertialMotion.duration.toInt());
-    _animation.addListener(_onAnimate);
+    _animation!.addListener(_onAnimate);
     _controller.fling();
   }
 
@@ -522,7 +515,7 @@
       final Vector3 translationVector = _transform.getTranslation();
       final Offset translation = Offset(translationVector.x, translationVector.y);
       final Offset translationScene = fromViewport(translation, _transform);
-      final Offset animationScene = fromViewport(_animation.value, _transform);
+      final Offset animationScene = fromViewport(_animation!.value, _transform);
       final Offset translationChangeScene = animationScene - translationScene;
       _transform = matrixTranslate(_transform, translationChangeScene);
     });
@@ -536,13 +529,13 @@
   // Handle reset to home transform animation.
   void _onAnimateReset() {
     setState(() {
-      _transform = _animationReset.value;
+      _transform = _animationReset!.value;
     });
     if (!_controllerReset.isAnimating) {
       _animationReset?.removeListener(_onAnimateReset);
       _animationReset = null;
       _controllerReset.reset();
-      widget.onResetEnd();
+      widget.onResetEnd!();
     }
   }
 
@@ -554,7 +547,7 @@
       end: _initialTransform,
     ).animate(_controllerReset);
     _controllerReset.duration = const Duration(milliseconds: 400);
-    _animationReset.addListener(_onAnimateReset);
+    _animationReset!.addListener(_onAnimateReset);
     _controllerReset.forward();
   }
 
@@ -564,7 +557,7 @@
     _animationReset?.removeListener(_onAnimateReset);
     _animationReset = null;
     _controllerReset.reset();
-    widget.onResetEnd();
+    widget.onResetEnd!();
   }
 
   @override
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_inertial_motion.dart b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_inertial_motion.dart
index 3b741e7..b160d75 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_inertial_motion.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/transformations/transformations_demo_inertial_motion.dart
@@ -60,7 +60,7 @@
 
   // Solve the equation of motion to find the position at a given point in time
   // in one dimension.
-  double _getPosition({double r0, double v0, int t, double a}) {
+  double _getPosition({required double r0, required double v0, required int t, required double a}) {
     // Stop movement when it would otherwise reverse direction.
     final double stopTime = (v0 / a).abs();
     if (t > stopTime) {
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/typography_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/typography_demo.dart
index 5395fc6..017fdda 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/typography_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/typography_demo.dart
@@ -6,14 +6,11 @@
 
 class TextStyleItem extends StatelessWidget {
   const TextStyleItem({
-    Key key,
-    @required this.name,
-    @required this.style,
-    @required this.text,
-  }) : assert(name != null),
-       assert(style != null),
-       assert(text != null),
-       super(key: key);
+    Key? key,
+    required this.name,
+    required this.style,
+    required this.text,
+  }) : super(key: key);
 
   final String name;
   final TextStyle style;
@@ -22,7 +19,7 @@
   @override
   Widget build(BuildContext context) {
     final ThemeData theme = Theme.of(context);
-    final TextStyle nameStyle = theme.textTheme.caption.copyWith(color: theme.textTheme.caption.color);
+    final TextStyle nameStyle = theme.textTheme.caption!.copyWith(color: theme.textTheme.caption!.color);
     return Padding(
       padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 16.0),
       child: Row(
@@ -49,17 +46,17 @@
     final TextTheme textTheme = Theme.of(context).textTheme;
     final List<Widget> styleItems = <Widget>[
       if (MediaQuery.of(context).size.width > 500.0)
-        TextStyleItem(name: 'Headline 1', style: textTheme.headline1, text: 'Light 112sp'),
-      TextStyleItem(name: 'Headline 2', style: textTheme.headline2, text: 'Regular 56sp'),
-      TextStyleItem(name: 'Headline 3', style: textTheme.headline3, text: 'Regular 45sp'),
-      TextStyleItem(name: 'Headline 4', style: textTheme.headline4, text: 'Regular 34sp'),
-      TextStyleItem(name: 'Headline 5', style: textTheme.headline5, text: 'Regular 24sp'),
-      TextStyleItem(name: 'Headline 6', style: textTheme.headline6, text: 'Medium 20sp'),
-      TextStyleItem(name: 'Subtitle 1', style: textTheme.subtitle1, text: 'Regular 16sp'),
-      TextStyleItem(name: 'Body 1', style: textTheme.bodyText1, text: 'Medium 14sp'),
-      TextStyleItem(name: 'Body 2', style: textTheme.bodyText2, text: 'Regular 14sp'),
-      TextStyleItem(name: 'Caption', style: textTheme.caption, text: 'Regular 12sp'),
-      TextStyleItem(name: 'Button', style: textTheme.button, text: 'MEDIUM (ALL CAPS) 14sp'),
+        TextStyleItem(name: 'Headline 1', style: textTheme.headline1!, text: 'Light 112sp'),
+      TextStyleItem(name: 'Headline 2', style: textTheme.headline2!, text: 'Regular 56sp'),
+      TextStyleItem(name: 'Headline 3', style: textTheme.headline3!, text: 'Regular 45sp'),
+      TextStyleItem(name: 'Headline 4', style: textTheme.headline4!, text: 'Regular 34sp'),
+      TextStyleItem(name: 'Headline 5', style: textTheme.headline5!, text: 'Regular 24sp'),
+      TextStyleItem(name: 'Headline 6', style: textTheme.headline6!, text: 'Medium 20sp'),
+      TextStyleItem(name: 'Subtitle 1', style: textTheme.subtitle1!, text: 'Regular 16sp'),
+      TextStyleItem(name: 'Body 1', style: textTheme.bodyText1!, text: 'Medium 14sp'),
+      TextStyleItem(name: 'Body 2', style: textTheme.bodyText2!, text: 'Regular 14sp'),
+      TextStyleItem(name: 'Caption', style: textTheme.caption!, text: 'Regular 12sp'),
+      TextStyleItem(name: 'Button', style: textTheme.button!, text: 'MEDIUM (ALL CAPS) 14sp'),
     ];
 
     return Scaffold(
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/video_demo.dart b/dev/integration_tests/flutter_gallery/lib/demo/video_demo.dart
index 7a187ba..43e032a 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/video_demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/video_demo.dart
@@ -11,11 +11,11 @@
 import 'package:device_info/device_info.dart';
 
 class VideoCard extends StatelessWidget {
-  const VideoCard({ Key key, this.controller, this.title, this.subtitle }) : super(key: key);
+  const VideoCard({ Key? key, this.controller, this.title, this.subtitle }) : super(key: key);
 
-  final VideoPlayerController controller;
-  final String title;
-  final String subtitle;
+  final VideoPlayerController? controller;
+  final String? title;
+  final String? subtitle;
 
   Widget _buildInlineVideo() {
     return Padding(
@@ -24,7 +24,7 @@
         child: AspectRatio(
           aspectRatio: 3 / 2,
           child: Hero(
-            tag: controller,
+            tag: controller!,
             child: VideoPlayerLoading(controller),
           ),
         ),
@@ -35,13 +35,13 @@
   Widget _buildFullScreenVideo() {
     return Scaffold(
       appBar: AppBar(
-        title: Text(title),
+        title: Text(title!),
       ),
       body: Center(
         child: AspectRatio(
           aspectRatio: 3 / 2,
           child: Hero(
-            tag: controller,
+            tag: controller!,
             child: VideoPlayPause(controller),
           ),
         ),
@@ -66,11 +66,11 @@
       );
 
       route.completed.then((void value) {
-        controller.setVolume(0.0);
+        controller!.setVolume(0.0);
       });
 
-      controller.setVolume(1.0);
-      Navigator.of(context).push(route);
+      controller!.setVolume(1.0);
+      Navigator.of(context)!.push(route);
     }
 
     return SafeArea(
@@ -79,7 +79,7 @@
       child: Card(
         child: Column(
           children: <Widget>[
-            ListTile(title: Text(title), subtitle: Text(subtitle)),
+            ListTile(title: Text(title!), subtitle: Text(subtitle!)),
             GestureDetector(
               onTap: pushFullScreenWidget,
               child: _buildInlineVideo(),
@@ -94,24 +94,24 @@
 class VideoPlayerLoading extends StatefulWidget {
   const VideoPlayerLoading(this.controller);
 
-  final VideoPlayerController controller;
+  final VideoPlayerController? controller;
 
   @override
   _VideoPlayerLoadingState createState() => _VideoPlayerLoadingState();
 }
 
 class _VideoPlayerLoadingState extends State<VideoPlayerLoading> {
-  bool _initialized;
+  bool? _initialized;
 
   @override
   void initState() {
     super.initState();
-    _initialized = widget.controller.value.isInitialized;
-    widget.controller.addListener(() {
+    _initialized = widget.controller!.value.isInitialized;
+    widget.controller!.addListener(() {
       if (!mounted) {
         return;
       }
-      final bool controllerInitialized = widget.controller.value.isInitialized;
+      final bool controllerInitialized = widget.controller!.value.isInitialized;
       if (_initialized != controllerInitialized) {
         setState(() {
           _initialized = controllerInitialized;
@@ -122,12 +122,12 @@
 
   @override
   Widget build(BuildContext context) {
-    if (_initialized) {
-      return VideoPlayer(widget.controller);
+    if (_initialized!) {
+      return VideoPlayer(widget.controller!);
     }
     return Stack(
       children: <Widget>[
-        VideoPlayer(widget.controller),
+        VideoPlayer(widget.controller!),
         const Center(child: CircularProgressIndicator()),
       ],
       fit: StackFit.expand,
@@ -138,7 +138,7 @@
 class VideoPlayPause extends StatefulWidget {
   const VideoPlayPause(this.controller);
 
-  final VideoPlayerController controller;
+  final VideoPlayerController? controller;
 
   @override
   State createState() => _VideoPlayPauseState();
@@ -152,20 +152,20 @@
     };
   }
 
-  FadeAnimation imageFadeAnimation;
-  VoidCallback listener;
+  FadeAnimation? imageFadeAnimation;
+  late VoidCallback listener;
 
-  VideoPlayerController get controller => widget.controller;
+  VideoPlayerController? get controller => widget.controller;
 
   @override
   void initState() {
     super.initState();
-    controller.addListener(listener);
+    controller!.addListener(listener);
   }
 
   @override
   void deactivate() {
-    controller.removeListener(listener);
+    controller!.removeListener(listener);
     super.deactivate();
   }
 
@@ -178,19 +178,19 @@
         GestureDetector(
           child: VideoPlayerLoading(controller),
           onTap: () {
-            if (!controller.value.isInitialized) {
+            if (!controller!.value.isInitialized) {
               return;
             }
-            if (controller.value.isPlaying) {
+            if (controller!.value.isPlaying) {
               imageFadeAnimation = const FadeAnimation(
                 child: Icon(Icons.pause, size: 100.0),
               );
-              controller.pause();
+              controller!.pause();
             } else {
               imageFadeAnimation = const FadeAnimation(
                 child: Icon(Icons.play_arrow, size: 100.0),
               );
-              controller.play();
+              controller!.play();
             }
           },
         ),
@@ -206,7 +206,7 @@
     this.duration = const Duration(milliseconds: 500),
   });
 
-  final Widget child;
+  final Widget? child;
   final Duration duration;
 
   @override
@@ -214,7 +214,7 @@
 }
 
 class _FadeAnimationState extends State<FadeAnimation> with SingleTickerProviderStateMixin {
-  AnimationController animationController;
+  late AnimationController animationController;
 
   @override
   void initState() {
@@ -268,15 +268,15 @@
     this.connectedCompleter,
   });
 
-  final Widget child;
-  final Completer<void> connectedCompleter;
+  final Widget? child;
+  final Completer<void>? connectedCompleter;
 
   @override
   _ConnectivityOverlayState createState() => _ConnectivityOverlayState();
 }
 
 class _ConnectivityOverlayState extends State<ConnectivityOverlay> {
-  StreamSubscription<ConnectivityResult> connectivitySubscription;
+  StreamSubscription<ConnectivityResult>? connectivitySubscription;
   bool connected = true;
 
   static const SnackBar errorSnackBar = SnackBar(
@@ -308,8 +308,8 @@
       // Assume connectivity
       // TODO(ditman): Remove this shortcut when `connectivity` support for web
       // lands, https://github.com/flutter/flutter/issues/46735
-      if (!widget.connectedCompleter.isCompleted) {
-        widget.connectedCompleter.complete(null);
+      if (!widget.connectedCompleter!.isCompleted) {
+        widget.connectedCompleter!.complete();
       }
       return;
     }
@@ -321,8 +321,8 @@
         if (connectivityResult == ConnectivityResult.none) {
           ScaffoldMessenger.of(context).showSnackBar(errorSnackBar);
         } else {
-          if (!widget.connectedCompleter.isCompleted) {
-            widget.connectedCompleter.complete(null);
+          if (!widget.connectedCompleter!.isCompleted) {
+            widget.connectedCompleter!.complete();
           }
         }
       },
@@ -336,11 +336,11 @@
   }
 
   @override
-  Widget build(BuildContext context) => widget.child;
+  Widget build(BuildContext context) => widget.child!;
 }
 
 class VideoDemo extends StatefulWidget {
-  const VideoDemo({ Key key }) : super(key: key);
+  const VideoDemo({ Key? key }) : super(key: key);
 
   static const String routeName = '/video';
 
@@ -389,7 +389,7 @@
 
     initController(butterflyController, 'butterfly');
     initController(beeController, 'bee');
-    isIOSSimulator().then<void>((bool result) {
+    isIOSSimulator().then((bool result) {
       isSupported = !result;
     });
   }
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/about.dart b/dev/integration_tests/flutter_gallery/lib/gallery/about.dart
index 144cfdf..b2167c3 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/about.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/about.dart
@@ -23,19 +23,19 @@
   // manage the recognizer from outside the TextSpan, e.g. in the State of a
   // stateful widget that then hands the recognizer to the TextSpan.
 
-  _LinkTextSpan({ TextStyle style, String url, String text }) : super(
+  _LinkTextSpan({ TextStyle? style, String? url, String? text }) : super(
     style: style,
     text: text ?? url,
     recognizer: TapGestureRecognizer()..onTap = () {
-      launch(url, forceSafariVC: false);
+      launch(url!, forceSafariVC: false);
     }
   );
 }
 
 void showGalleryAboutDialog(BuildContext context) {
   final ThemeData themeData = Theme.of(context);
-  final TextStyle aboutTextStyle = themeData.textTheme.bodyText1;
-  final TextStyle linkStyle = themeData.textTheme.bodyText1.copyWith(color: themeData.accentColor);
+  final TextStyle? aboutTextStyle = themeData.textTheme.bodyText1;
+  final TextStyle linkStyle = themeData.textTheme.bodyText1!.copyWith(color: themeData.accentColor);
 
   showAboutDialog(
     context: context,
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/app.dart b/dev/integration_tests/flutter_gallery/lib/gallery/app.dart
index 228d3c5..2ccfca8 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/app.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/app.dart
@@ -22,7 +22,7 @@
 
 class GalleryApp extends StatefulWidget {
   const GalleryApp({
-    Key key,
+    Key? key,
     this.updateUrlFetcher,
     this.enablePerformanceOverlay = true,
     this.enableRasterCacheImagesCheckerboard = true,
@@ -31,11 +31,11 @@
     this.testMode = false,
   }) : super(key: key);
 
-  final UpdateUrlFetcher updateUrlFetcher;
+  final UpdateUrlFetcher? updateUrlFetcher;
   final bool enablePerformanceOverlay;
   final bool enableRasterCacheImagesCheckerboard;
   final bool enableOffscreenLayersCheckerboard;
-  final VoidCallback onSendFeedback;
+  final VoidCallback? onSendFeedback;
   final bool testMode;
 
   @override
@@ -43,9 +43,9 @@
 }
 
 class _GalleryAppState extends State<GalleryApp> {
-  GalleryOptions _options;
-  Timer _timeDilationTimer;
-  AppStateModel model;
+  GalleryOptions? _options;
+  Timer? _timeDilationTimer;
+  late AppStateModel model;
 
   Map<String, WidgetBuilder> _buildRoutes() {
     // For a different example of how to set up an application routing table
@@ -71,7 +71,7 @@
 
   @override
   void reassemble() {
-    _options = _options.copyWith(platform: defaultTargetPlatform);
+    _options = _options!.copyWith(platform: defaultTargetPlatform);
     super.reassemble();
   }
 
@@ -84,7 +84,7 @@
 
   void _handleOptionsChanged(GalleryOptions newOptions) {
     setState(() {
-      if (_options.timeDilation != newOptions.timeDilation) {
+      if (_options!.timeDilation != newOptions.timeDilation) {
         _timeDilationTimer?.cancel();
         _timeDilationTimer = null;
         if (newOptions.timeDilation > 1.0) {
@@ -108,7 +108,7 @@
       builder: (BuildContext context) {
         return MediaQuery(
           data: MediaQuery.of(context).copyWith(
-            textScaleFactor: _options.textScaleFactor.scale,
+            textScaleFactor: _options!.textScaleFactor!.scale,
           ),
           child: child,
         );
@@ -131,7 +131,7 @@
 
     if (widget.updateUrlFetcher != null) {
       home = Updater(
-        updateUrlFetcher: widget.updateUrlFetcher,
+        updateUrlFetcher: widget.updateUrlFetcher!,
         child: home,
       );
     }
@@ -139,18 +139,18 @@
     return ScopedModel<AppStateModel>(
       model: model,
       child: MaterialApp(
-        theme: kLightGalleryTheme.copyWith(platform: _options.platform, visualDensity: _options.visualDensity.visualDensity),
-        darkTheme: kDarkGalleryTheme.copyWith(platform: _options.platform, visualDensity: _options.visualDensity.visualDensity),
-        themeMode: _options.themeMode,
+        theme: kLightGalleryTheme.copyWith(platform: _options!.platform, visualDensity: _options!.visualDensity!.visualDensity),
+        darkTheme: kDarkGalleryTheme.copyWith(platform: _options!.platform, visualDensity: _options!.visualDensity!.visualDensity),
+        themeMode: _options!.themeMode,
         title: 'Flutter Gallery',
         color: Colors.grey,
-        showPerformanceOverlay: _options.showPerformanceOverlay,
-        checkerboardOffscreenLayers: _options.showOffscreenLayersCheckerboard,
-        checkerboardRasterCacheImages: _options.showRasterCacheImagesCheckerboard,
+        showPerformanceOverlay: _options!.showPerformanceOverlay,
+        checkerboardOffscreenLayers: _options!.showOffscreenLayersCheckerboard,
+        checkerboardRasterCacheImages: _options!.showRasterCacheImagesCheckerboard,
         routes: _buildRoutes(),
-        builder: (BuildContext context, Widget child) {
+        builder: (BuildContext context, Widget? child) {
           return Directionality(
-            textDirection: _options.textDirection,
+            textDirection: _options!.textDirection,
             child: _applyTextScaleFactor(
               // Specifically use a blank Cupertino theme here and do not transfer
               // over the Material primary color etc except the brightness to
@@ -160,7 +160,7 @@
                   data: CupertinoThemeData(
                     brightness: Theme.of(context).brightness,
                   ),
-                  child: child,
+                  child: child!,
                 );
               }),
             ),
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/backdrop.dart b/dev/integration_tests/flutter_gallery/lib/gallery/backdrop.dart
index 527657c..7d740fa 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/backdrop.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/backdrop.dart
@@ -26,37 +26,37 @@
 class _TappableWhileStatusIs extends StatefulWidget {
   const _TappableWhileStatusIs(
     this.status, {
-    Key key,
+    Key? key,
     this.controller,
     this.child,
   }) : super(key: key);
 
-  final AnimationController controller;
+  final AnimationController? controller;
   final AnimationStatus status;
-  final Widget child;
+  final Widget? child;
 
   @override
   _TappableWhileStatusIsState createState() => _TappableWhileStatusIsState();
 }
 
 class _TappableWhileStatusIsState extends State<_TappableWhileStatusIs> {
-  bool _active;
+  bool? _active;
 
   @override
   void initState() {
     super.initState();
-    widget.controller.addStatusListener(_handleStatusChange);
-    _active = widget.controller.status == widget.status;
+    widget.controller!.addStatusListener(_handleStatusChange);
+    _active = widget.controller!.status == widget.status;
   }
 
   @override
   void dispose() {
-    widget.controller.removeStatusListener(_handleStatusChange);
+    widget.controller!.removeStatusListener(_handleStatusChange);
     super.dispose();
   }
 
   void _handleStatusChange(AnimationStatus status) {
-    final bool value = widget.controller.status == widget.status;
+    final bool value = widget.controller!.status == widget.status;
     if (_active != value) {
       setState(() {
         _active = value;
@@ -67,11 +67,11 @@
   @override
   Widget build(BuildContext context) {
     Widget child = AbsorbPointer(
-      absorbing: !_active,
+      absorbing: !_active!,
       child: widget.child,
     );
 
-    if (!_active) {
+    if (!_active!) {
       child = FocusScope(
         canRequestFocus: false,
         debugLabel: '$_TappableWhileStatusIs',
@@ -84,16 +84,16 @@
 
 class _CrossFadeTransition extends AnimatedWidget {
   const _CrossFadeTransition({
-    Key key,
+    Key? key,
     this.alignment = Alignment.center,
-    Animation<double> progress,
+    required Animation<double> progress,
     this.child0,
     this.child1,
   }) : super(key: key, listenable: progress);
 
   final AlignmentGeometry alignment;
-  final Widget child0;
-  final Widget child1;
+  final Widget? child0;
+  final Widget? child1;
 
   @override
   Widget build(BuildContext context) {
@@ -135,15 +135,15 @@
 
 class _BackAppBar extends StatelessWidget {
   const _BackAppBar({
-    Key key,
+    Key? key,
     this.leading = const SizedBox(width: 56.0),
-    @required this.title,
+    required this.title,
     this.trailing,
-  }) : assert(leading != null), assert(title != null), super(key: key);
+  }) : super(key: key);
 
   final Widget leading;
   final Widget title;
-  final Widget trailing;
+  final Widget? trailing;
 
   @override
   Widget build(BuildContext context) {
@@ -151,7 +151,7 @@
     return IconTheme.merge(
       data: theme.primaryIconTheme,
       child: DefaultTextStyle(
-        style: theme.primaryTextTheme.headline6,
+        style: theme.primaryTextTheme.headline6!,
         child: SizedBox(
           height: _kBackAppBarHeight,
           child: Row(
@@ -188,12 +188,12 @@
     this.backLayer,
   });
 
-  final Widget frontAction;
-  final Widget frontTitle;
-  final Widget frontLayer;
-  final Widget frontHeading;
-  final Widget backTitle;
-  final Widget backLayer;
+  final Widget? frontAction;
+  final Widget? frontTitle;
+  final Widget? frontLayer;
+  final Widget? frontHeading;
+  final Widget? backTitle;
+  final Widget? backLayer;
 
   @override
   _BackdropState createState() => _BackdropState();
@@ -201,8 +201,8 @@
 
 class _BackdropState extends State<Backdrop> with SingleTickerProviderStateMixin {
   final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop');
-  AnimationController _controller;
-  Animation<double> _frontOpacity;
+  AnimationController? _controller;
+  late Animation<double> _frontOpacity;
 
   static final Animatable<double> _frontOpacityTween = Tween<double>(begin: 0.2, end: 1.0)
     .chain(CurveTween(curve: const Interval(0.0, 0.4, curve: Curves.easeInOut)));
@@ -215,7 +215,7 @@
       value: 1.0,
       vsync: this,
     );
-    _controller.addStatusListener((AnimationStatus status) {
+    _controller!.addStatusListener((AnimationStatus status) {
       setState(() {
         // This is intentionally left empty. The state change itself takes
         // place inside the AnimationController, so there's nothing to update.
@@ -223,47 +223,47 @@
         // state from the AnimationController.
       });
     });
-    _frontOpacity = _controller.drive(_frontOpacityTween);
+    _frontOpacity = _controller!.drive(_frontOpacityTween);
   }
 
   @override
   void dispose() {
-    _controller.dispose();
+    _controller!.dispose();
     super.dispose();
   }
 
   double get _backdropHeight {
     // Warning: this can be safely called from the event handlers but it may
     // not be called at build time.
-    final RenderBox renderBox = _backdropKey.currentContext.findRenderObject() as RenderBox;
+    final RenderBox renderBox = _backdropKey.currentContext!.findRenderObject()! as RenderBox;
     return math.max(0.0, renderBox.size.height - _kBackAppBarHeight - _kFrontClosedHeight);
   }
 
   void _handleDragUpdate(DragUpdateDetails details) {
-    _controller.value -= details.primaryDelta / (_backdropHeight ?? details.primaryDelta);
+    _controller!.value -= details.primaryDelta! / _backdropHeight;
   }
 
   void _handleDragEnd(DragEndDetails details) {
-    if (_controller.isAnimating || _controller.status == AnimationStatus.completed)
+    if (_controller!.isAnimating || _controller!.status == AnimationStatus.completed)
       return;
 
     final double flingVelocity = details.velocity.pixelsPerSecond.dy / _backdropHeight;
     if (flingVelocity < 0.0)
-      _controller.fling(velocity: math.max(2.0, -flingVelocity));
+      _controller!.fling(velocity: math.max(2.0, -flingVelocity));
     else if (flingVelocity > 0.0)
-      _controller.fling(velocity: math.min(-2.0, -flingVelocity));
+      _controller!.fling(velocity: math.min(-2.0, -flingVelocity));
     else
-      _controller.fling(velocity: _controller.value < 0.5 ? -2.0 : 2.0);
+      _controller!.fling(velocity: _controller!.value < 0.5 ? -2.0 : 2.0);
   }
 
   void _toggleFrontLayer() {
-    final AnimationStatus status = _controller.status;
+    final AnimationStatus status = _controller!.status;
     final bool isOpen = status == AnimationStatus.completed || status == AnimationStatus.forward;
-    _controller.fling(velocity: isOpen ? -2.0 : 2.0);
+    _controller!.fling(velocity: isOpen ? -2.0 : 2.0);
   }
 
   Widget _buildStack(BuildContext context, BoxConstraints constraints) {
-    final Animation<RelativeRect> frontRelativeRect = _controller.drive(RelativeRectTween(
+    final Animation<RelativeRect> frontRelativeRect = _controller!.drive(RelativeRectTween(
       begin: RelativeRect.fromLTRB(0.0, constraints.biggest.height - _kFrontClosedHeight, 0.0, 0.0),
       end: const RelativeRect.fromLTRB(0.0, _kBackAppBarHeight, 0.0, 0.0),
     ));
@@ -275,9 +275,9 @@
           crossAxisAlignment: CrossAxisAlignment.stretch,
           children: <Widget>[
             _BackAppBar(
-              leading: widget.frontAction,
+              leading: widget.frontAction!,
               title: _CrossFadeTransition(
-                progress: _controller,
+                progress: _controller!,
                 alignment: AlignmentDirectional.centerStart,
                 child0: Semantics(namesRoute: true, child: widget.frontTitle),
                 child1: Semantics(namesRoute: true, child: widget.backTitle),
@@ -287,7 +287,7 @@
                 tooltip: 'Toggle options page',
                 icon: AnimatedIcon(
                   icon: AnimatedIcons.close_menu,
-                  progress: _controller,
+                  progress: _controller!,
                 ),
               ),
             ),
@@ -296,8 +296,8 @@
                 AnimationStatus.dismissed,
                 controller: _controller,
                 child: Visibility(
-                  child: widget.backLayer,
-                  visible: _controller.status != AnimationStatus.completed,
+                  child: widget.backLayer!,
+                  visible: _controller!.status != AnimationStatus.completed,
                   maintainState: true,
                 ),
               ),
@@ -308,14 +308,14 @@
         PositionedTransition(
           rect: frontRelativeRect,
           child: AnimatedBuilder(
-            animation: _controller,
-            builder: (BuildContext context, Widget child) {
+            animation: _controller!,
+            builder: (BuildContext context, Widget? child) {
               return PhysicalShape(
                 elevation: 12.0,
                 color: Theme.of(context).canvasColor,
                 clipper: ShapeBorderClipper(
                   shape: BeveledRectangleBorder(
-                    borderRadius: _kFrontHeadingBevelRadius.transform(_controller.value),
+                    borderRadius: _kFrontHeadingBevelRadius.transform(_controller!.value),
                   ),
                 ),
                 clipBehavior: Clip.antiAlias,
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/demo.dart b/dev/integration_tests/flutter_gallery/lib/gallery/demo.dart
index e3efe2c..c6cdcd4 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/demo.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/demo.dart
@@ -20,11 +20,11 @@
     this.documentationUrl,
   });
 
-  final Widget demoWidget;
-  final String exampleCodeTag;
-  final String description;
-  final String tabName;
-  final String documentationUrl;
+  final Widget? demoWidget;
+  final String? exampleCodeTag;
+  final String? description;
+  final String? tabName;
+  final String? documentationUrl;
 
   @override
   bool operator==(Object other) {
@@ -49,14 +49,14 @@
     this.showExampleCodeAction = true,
   });
 
-  final List<ComponentDemoTabData> demos;
-  final String title;
-  final List<Widget> actions;
+  final List<ComponentDemoTabData>? demos;
+  final String? title;
+  final List<Widget>? actions;
   final bool isScrollable;
   final bool showExampleCodeAction;
 
   void _showExampleCode(BuildContext context) {
-    final String tag = demos[DefaultTabController.of(context).index].exampleCodeTag;
+    final String? tag = demos![DefaultTabController.of(context)!.index].exampleCodeTag;
     if (tag != null) {
       Navigator.push(context, MaterialPageRoute<FullScreenCodeDialog>(
         builder: (BuildContext context) => FullScreenCodeDialog(exampleCodeTag: tag)
@@ -65,7 +65,7 @@
   }
 
   Future<void> _showApiDocumentation(BuildContext context) async {
-    final String url = demos[DefaultTabController.of(context).index].documentationUrl;
+    final String? url = demos![DefaultTabController.of(context)!.index].documentationUrl;
     if (url == null)
       return;
 
@@ -92,10 +92,10 @@
   @override
   Widget build(BuildContext context) {
     return DefaultTabController(
-      length: demos.length,
+      length: demos!.length,
       child: Scaffold(
         appBar: AppBar(
-          title: Text(title),
+          title: Text(title!),
           actions: <Widget>[
             ...?actions,
             Builder(
@@ -119,11 +119,11 @@
           ],
           bottom: TabBar(
             isScrollable: isScrollable,
-            tabs: demos.map<Widget>((ComponentDemoTabData data) => Tab(text: data.tabName)).toList(),
+            tabs: demos!.map<Widget>((ComponentDemoTabData data) => Tab(text: data.tabName)).toList(),
           ),
         ),
         body: TabBarView(
-          children: demos.map<Widget>((ComponentDemoTabData demo) {
+          children: demos!.map<Widget>((ComponentDemoTabData demo) {
             return SafeArea(
               top: false,
               bottom: false,
@@ -131,11 +131,11 @@
                 children: <Widget>[
                   Padding(
                     padding: const EdgeInsets.all(16.0),
-                    child: Text(demo.description,
+                    child: Text(demo.description!,
                       style: Theme.of(context).textTheme.subtitle1,
                     ),
                   ),
-                  Expanded(child: demo.demoWidget),
+                  Expanded(child: demo.demoWidget!),
                 ],
               ),
             );
@@ -149,7 +149,7 @@
 class FullScreenCodeDialog extends StatefulWidget {
   const FullScreenCodeDialog({ this.exampleCodeTag });
 
-  final String exampleCodeTag;
+  final String? exampleCodeTag;
 
   @override
   FullScreenCodeDialogState createState() => FullScreenCodeDialogState();
@@ -157,11 +157,11 @@
 
 class FullScreenCodeDialogState extends State<FullScreenCodeDialog> {
 
-  String _exampleCode;
+  String? _exampleCode;
 
   @override
   void didChangeDependencies() {
-    getExampleCode(widget.exampleCodeTag, DefaultAssetBundle.of(context)).then<void>((String code) {
+    getExampleCode(widget.exampleCodeTag, DefaultAssetBundle.of(context)).then((String? code) {
       if (mounted) {
         setState(() {
           _exampleCode = code ?? 'Example code not found';
@@ -215,7 +215,7 @@
 }
 
 class MaterialDemoDocumentationButton extends StatelessWidget {
-  MaterialDemoDocumentationButton(String routeName, { Key key })
+  MaterialDemoDocumentationButton(String routeName, { Key? key })
     : documentationUrl = kDemoDocumentationUrl[routeName],
       assert(
         kDemoDocumentationUrl[routeName] != null,
@@ -223,20 +223,20 @@
       ),
       super(key: key);
 
-  final String documentationUrl;
+  final String? documentationUrl;
 
   @override
   Widget build(BuildContext context) {
     return IconButton(
       icon: const Icon(Icons.library_books),
       tooltip: 'API documentation',
-      onPressed: () => launch(documentationUrl, forceWebView: true),
+      onPressed: () => launch(documentationUrl!, forceWebView: true),
     );
   }
 }
 
 class CupertinoDemoDocumentationButton extends StatelessWidget {
-  CupertinoDemoDocumentationButton(String routeName, { Key key })
+  CupertinoDemoDocumentationButton(String routeName, { Key? key })
     : documentationUrl = kDemoDocumentationUrl[routeName],
       assert(
         kDemoDocumentationUrl[routeName] != null,
@@ -244,7 +244,7 @@
       ),
       super(key: key);
 
-  final String documentationUrl;
+  final String? documentationUrl;
 
   @override
   Widget build(BuildContext context) {
@@ -254,7 +254,7 @@
         label: 'API documentation',
         child: const Icon(CupertinoIcons.book),
       ),
-      onPressed: () => launch(documentationUrl, forceWebView: true),
+      onPressed: () => launch(documentationUrl!, forceWebView: true),
     );
   }
 }
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/demos.dart b/dev/integration_tests/flutter_gallery/lib/gallery/demos.dart
index 5f8eec6..81ed41d 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/demos.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/demos.dart
@@ -10,8 +10,8 @@
 @immutable
 class GalleryDemoCategory {
   const GalleryDemoCategory._({
-    @required this.name,
-    @required this.icon,
+    required this.name,
+    required this.icon,
   });
 
   final String name;
@@ -64,25 +64,22 @@
 
 class GalleryDemo {
   const GalleryDemo({
-    @required this.title,
-    @required this.icon,
+    required this.title,
+    required this.icon,
     this.subtitle,
-    @required this.category,
-    @required this.routeName,
+    required this.category,
+    required this.routeName,
     this.documentationUrl,
-    @required this.buildRoute,
-  }) : assert(title != null),
-       assert(category != null),
-       assert(routeName != null),
-       assert(buildRoute != null);
+    required this.buildRoute,
+  });
 
   final String title;
   final IconData icon;
-  final String subtitle;
+  final String? subtitle;
   final GalleryDemoCategory category;
   final String routeName;
   final WidgetBuilder buildRoute;
-  final String documentationUrl;
+  final String? documentationUrl;
 
   @override
   String toString() {
@@ -581,7 +578,7 @@
     },
   );
 
-final Map<String, String> kDemoDocumentationUrl = <String, String>{
+final Map<String, String?> kDemoDocumentationUrl = <String, String?>{
   for (final GalleryDemo demo in kAllGalleryDemos)
     if (demo.documentationUrl != null) demo.routeName: demo.documentationUrl,
 };
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/example_code.dart b/dev/integration_tests/flutter_gallery/lib/gallery/example_code.dart
index d68761d..1a00a3b 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/example_code.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/example_code.dart
@@ -9,7 +9,7 @@
 
 class ButtonsDemo {
   void setState(VoidCallback callback) { }
-  BuildContext context;
+  late BuildContext context;
 
   void buttons() {
 
@@ -90,12 +90,12 @@
 
 // START buttons_dropdown
 // Member variable holding value.
-String dropdownValue;
+String? dropdownValue;
 
 // Dropdown button with string values.
 DropdownButton<String>(
   value: dropdownValue,
-  onChanged: (String newValue) {
+  onChanged: (String? newValue) {
     // null indicates the user didn't select a
     // new value.
     setState(() {
@@ -116,7 +116,7 @@
 
 // START buttons_icon
 // Member variable holding toggle value.
-bool value;
+late bool value;
 
 // Toggleable icon button.
 IconButton(
@@ -152,12 +152,12 @@
 
 // START selectioncontrols_checkbox
 // Member variable holding the checkbox's value.
-bool checkboxValue = false;
+bool? checkboxValue = false;
 
 // Create a checkbox.
 Checkbox(
   value: checkboxValue,
-  onChanged: (bool value) {
+  onChanged: (bool? value) {
     setState(() {
       checkboxValue = value;
     });
@@ -168,7 +168,7 @@
 Checkbox(
   tristate: true,
   value: checkboxValue,
-  onChanged: (bool value) {
+  onChanged: (bool? value) {
     setState(() {
       checkboxValue = value;
     });
@@ -184,10 +184,10 @@
 
 // START selectioncontrols_radio
 // Member variable holding value.
-int radioValue = 0;
+int? radioValue = 0;
 
 // Method setting value.
-void handleRadioValueChanged(int value) {
+void handleRadioValueChanged(int? value) {
   setState(() {
     radioValue = value;
   });
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/example_code_parser.dart b/dev/integration_tests/flutter_gallery/lib/gallery/example_code_parser.dart
index eef1885..cab344a 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/example_code_parser.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/example_code_parser.dart
@@ -7,23 +7,22 @@
 const String _kStartTag = '// START ';
 const String _kEndTag = '// END';
 
-Map<String, String> _exampleCode;
+Map<String?, String>? _exampleCode;
 
-Future<String> getExampleCode(String tag, AssetBundle bundle) async {
+Future<String?> getExampleCode(String? tag, AssetBundle bundle) async {
   if (_exampleCode == null)
     await _parseExampleCode(bundle);
-  return _exampleCode[tag];
+  return _exampleCode![tag];
 }
 
 Future<void> _parseExampleCode(AssetBundle bundle) async {
-  final String code = await bundle.loadString('lib/gallery/example_code.dart') ??
-    '// lib/gallery/example_code.dart not found\n';
-  _exampleCode = <String, String>{};
+  final String code = await bundle.loadString('lib/gallery/example_code.dart');
+  _exampleCode = <String?, String>{};
 
   final List<String> lines = code.split('\n');
 
-  List<String> codeBlock;
-  String codeTag;
+  List<String>? codeBlock;
+  String? codeTag;
 
   for (final String line in lines) {
     if (codeBlock == null) {
@@ -39,7 +38,7 @@
       // Inside a block.
       if (line.startsWith(_kEndTag)) {
         // Add the block.
-        _exampleCode[codeTag] = codeBlock.join('\n');
+        _exampleCode![codeTag] = codeBlock.join('\n');
         codeBlock = null;
         codeTag = null;
       } else {
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/home.dart b/dev/integration_tests/flutter_gallery/lib/gallery/home.dart
index 52e435e..9c1f3b3 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/home.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/home.dart
@@ -18,7 +18,7 @@
 const Duration _kFrontLayerSwitchDuration = Duration(milliseconds: 300);
 
 class _FlutterLogo extends StatelessWidget {
-  const _FlutterLogo({ Key key }) : super(key: key);
+  const _FlutterLogo({ Key? key }) : super(key: key);
 
   @override
   Widget build(BuildContext context) {
@@ -41,13 +41,13 @@
 
 class _CategoryItem extends StatelessWidget {
   const _CategoryItem({
-    Key key,
+    Key? key,
     this.category,
     this.onTap,
   }) : super (key: key);
 
-  final GalleryDemoCategory category;
-  final VoidCallback onTap;
+  final GalleryDemoCategory? category;
+  final VoidCallback? onTap;
 
   @override
   Widget build(BuildContext context) {
@@ -70,7 +70,7 @@
             Padding(
               padding: const EdgeInsets.all(6.0),
               child: Icon(
-                category.icon,
+                category!.icon,
                 size: 60.0,
                 color: isDark ? Colors.white : _kFlutterBlue,
               ),
@@ -80,9 +80,9 @@
               height: 48.0,
               alignment: Alignment.center,
               child: Text(
-                category.name,
+                category!.name,
                 textAlign: TextAlign.center,
-                style: theme.textTheme.subtitle1.copyWith(
+                style: theme.textTheme.subtitle1!.copyWith(
                   fontFamily: 'GoogleSans',
                   color: isDark ? Colors.white : _kFlutterBlue,
                 ),
@@ -97,18 +97,18 @@
 
 class _CategoriesPage extends StatelessWidget {
   const _CategoriesPage({
-    Key key,
+    Key? key,
     this.categories,
     this.onCategoryTap,
   }) : super(key: key);
 
-  final Iterable<GalleryDemoCategory> categories;
-  final ValueChanged<GalleryDemoCategory> onCategoryTap;
+  final Iterable<GalleryDemoCategory>? categories;
+  final ValueChanged<GalleryDemoCategory>? onCategoryTap;
 
   @override
   Widget build(BuildContext context) {
     const double aspectRatio = 160.0 / 180.0;
-    final List<GalleryDemoCategory> categoriesList = categories.toList();
+    final List<GalleryDemoCategory> categoriesList = categories!.toList();
     final int columnCount = (MediaQuery.of(context).orientation == Orientation.portrait) ? 2 : 3;
 
     return Semantics(
@@ -122,7 +122,7 @@
           builder: (BuildContext context, BoxConstraints constraints) {
             final double columnWidth = constraints.biggest.width / columnCount.toDouble();
             final double rowHeight = math.min(225.0, columnWidth * aspectRatio);
-            final int rowCount = (categories.length + columnCount - 1) ~/ columnCount;
+            final int rowCount = (categories!.length + columnCount - 1) ~/ columnCount;
 
             // This repaint boundary prevents the inner contents of the front layer
             // from repainting when the backdrop toggle triggers a repaint on the
@@ -133,7 +133,7 @@
                 crossAxisAlignment: CrossAxisAlignment.stretch,
                 children: List<Widget>.generate(rowCount, (int rowIndex) {
                   final int columnCountForRow = rowIndex == rowCount - 1
-                    ? categories.length - columnCount * math.max<int>(0, rowCount - 1)
+                    ? categories!.length - columnCount * math.max<int>(0, rowCount - 1)
                     : columnCount;
 
                   return Row(
@@ -147,7 +147,7 @@
                         child: _CategoryItem(
                           category: category,
                           onTap: () {
-                            onCategoryTap(category);
+                            onCategoryTap!(category);
                           },
                         ),
                       );
@@ -164,17 +164,17 @@
 }
 
 class _DemoItem extends StatelessWidget {
-  const _DemoItem({ Key key, this.demo }) : super(key: key);
+  const _DemoItem({ Key? key, this.demo }) : super(key: key);
 
-  final GalleryDemo demo;
+  final GalleryDemo? demo;
 
   void _launchDemo(BuildContext context) {
-    if (demo.routeName != null) {
+    if (demo != null) {
       Timeline.instantSync('Start Transition', arguments: <String, String>{
         'from': '/',
-        'to': demo.routeName,
+        'to': demo!.routeName,
       });
-      Navigator.pushNamed(context, demo.routeName);
+      Navigator.pushNamed(context, demo!.routeName);
     }
   }
 
@@ -199,7 +199,7 @@
               height: 56.0,
               alignment: Alignment.center,
               child: Icon(
-                demo.icon,
+                demo!.icon,
                 size: 24.0,
                 color: isDark ? Colors.white : _kFlutterBlue,
               ),
@@ -210,15 +210,15 @@
                 crossAxisAlignment: CrossAxisAlignment.stretch,
                 children: <Widget>[
                   Text(
-                    demo.title,
-                    style: theme.textTheme.subtitle1.copyWith(
+                    demo!.title,
+                    style: theme.textTheme.subtitle1!.copyWith(
                       color: isDark ? Colors.white : const Color(0xFF202124),
                     ),
                   ),
-                  if (demo.subtitle != null)
+                  if (demo!.subtitle != null)
                     Text(
-                      demo.subtitle,
-                      style: theme.textTheme.bodyText2.copyWith(
+                      demo!.subtitle!,
+                      style: theme.textTheme.bodyText2!.copyWith(
                         color: isDark ? Colors.white : const Color(0xFF60646B)
                       ),
                     ),
@@ -236,7 +236,7 @@
 class _DemosPage extends StatelessWidget {
   const _DemosPage(this.category);
 
-  final GalleryDemoCategory category;
+  final GalleryDemoCategory? category;
 
   @override
   Widget build(BuildContext context) {
@@ -248,13 +248,13 @@
       child: Semantics(
         scopesRoute: true,
         namesRoute: true,
-        label: category.name,
+        label: category!.name,
         explicitChildNodes: true,
         child: ListView(
           dragStartBehavior: DragStartBehavior.down,
-          key: PageStorageKey<String>(category.name),
+          key: PageStorageKey<String>(category!.name),
           padding: EdgeInsets.only(top: 8.0, bottom: windowBottomPadding),
-          children: kGalleryCategoryToDemos[category].map<Widget>((GalleryDemo demo) {
+          children: kGalleryCategoryToDemos[category!]!.map<Widget>((GalleryDemo demo) {
             return _DemoItem(demo: demo);
           }).toList(),
         ),
@@ -265,12 +265,12 @@
 
 class GalleryHome extends StatefulWidget {
   const GalleryHome({
-    Key key,
+    Key? key,
     this.testMode = false,
     this.optionsPage,
   }) : super(key: key);
 
-  final Widget optionsPage;
+  final Widget? optionsPage;
   final bool testMode;
 
   // In checked mode our MaterialApp will show the default "debug" banner.
@@ -283,10 +283,10 @@
 
 class _GalleryHomeState extends State<GalleryHome> with SingleTickerProviderStateMixin {
   static final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
-  AnimationController _controller;
-  GalleryDemoCategory _category;
+  late AnimationController _controller;
+  GalleryDemoCategory? _category;
 
-  static Widget _topHomeLayout(Widget currentChild, List<Widget> previousChildren) {
+  static Widget _topHomeLayout(Widget? currentChild, List<Widget> previousChildren) {
     return Stack(
       children: <Widget>[
         ...previousChildren,
@@ -357,7 +357,7 @@
               duration: _kFrontLayerSwitchDuration,
               child: _category == null
                 ? const Text('Flutter gallery')
-                : Text(_category.name),
+                : Text(_category!.name),
             ),
             frontHeading: widget.testMode ? null : Container(height: 24.0),
             frontLayer: AnimatedSwitcher(
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/options.dart b/dev/integration_tests/flutter_gallery/lib/gallery/options.dart
index b7ca9d9..6e7220d 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/options.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/options.dart
@@ -21,26 +21,26 @@
     this.showPerformanceOverlay = false,
   });
 
-  final ThemeMode themeMode;
-  final GalleryTextScaleValue textScaleFactor;
-  final GalleryVisualDensityValue visualDensity;
+  final ThemeMode? themeMode;
+  final GalleryTextScaleValue? textScaleFactor;
+  final GalleryVisualDensityValue? visualDensity;
   final TextDirection textDirection;
   final double timeDilation;
-  final TargetPlatform platform;
+  final TargetPlatform? platform;
   final bool showPerformanceOverlay;
   final bool showRasterCacheImagesCheckerboard;
   final bool showOffscreenLayersCheckerboard;
 
   GalleryOptions copyWith({
-    ThemeMode themeMode,
-    GalleryTextScaleValue textScaleFactor,
-    GalleryVisualDensityValue visualDensity,
-    TextDirection textDirection,
-    double timeDilation,
-    TargetPlatform platform,
-    bool showPerformanceOverlay,
-    bool showRasterCacheImagesCheckerboard,
-    bool showOffscreenLayersCheckerboard,
+    ThemeMode? themeMode,
+    GalleryTextScaleValue? textScaleFactor,
+    GalleryVisualDensityValue? visualDensity,
+    TextDirection? textDirection,
+    double? timeDilation,
+    TargetPlatform? platform,
+    bool? showPerformanceOverlay,
+    bool? showRasterCacheImagesCheckerboard,
+    bool? showOffscreenLayersCheckerboard,
   }) {
     return GalleryOptions(
       themeMode: themeMode ?? this.themeMode,
@@ -93,9 +93,9 @@
 const EdgeInsetsDirectional _kItemPadding = EdgeInsetsDirectional.only(start: 56.0);
 
 class _OptionsItem extends StatelessWidget {
-  const _OptionsItem({ Key key, this.child }) : super(key: key);
+  const _OptionsItem({ Key? key, this.child }) : super(key: key);
 
-  final Widget child;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -112,7 +112,7 @@
           overflow: TextOverflow.fade,
           child: IconTheme(
             data: Theme.of(context).primaryIconTheme,
-            child: child,
+            child: child!,
           ),
         ),
       ),
@@ -127,7 +127,7 @@
   final bool value;
   final ValueChanged<bool> onChanged;
   // [switchKey] is used for accessing the switch from driver tests.
-  final Key switchKey;
+  final Key? switchKey;
 
   @override
   Widget build(BuildContext context) {
@@ -153,7 +153,7 @@
   const _ActionItem(this.text, this.onTap);
 
   final String text;
-  final VoidCallback onTap;
+  final VoidCallback? onTap;
 
   @override
   Widget build(BuildContext context) {
@@ -167,10 +167,10 @@
 }
 
 class _TextButton extends StatelessWidget {
-  const _TextButton({ Key key, this.onPressed, this.child }) : super(key: key);
+  const _TextButton({ Key? key, this.onPressed, this.child }) : super(key: key);
 
-  final VoidCallback onPressed;
-  final Widget child;
+  final VoidCallback? onPressed;
+  final Widget? child;
 
   @override
   Widget build(BuildContext context) {
@@ -182,7 +182,7 @@
         padding: EdgeInsets.zero,
       ),
       onPressed: onPressed,
-      child: child,
+      child: child!,
     );
   }
 }
@@ -197,7 +197,7 @@
     final ThemeData theme = Theme.of(context);
     return _OptionsItem(
       child: DefaultTextStyle(
-        style: theme.textTheme.headline6.copyWith(
+        style: theme.textTheme.headline6!.copyWith(
           fontFamily: 'GoogleSans',
           color: theme.colorScheme.onPrimary,
           fontWeight: FontWeight.w700,
@@ -214,8 +214,8 @@
 class _ThemeModeItem extends StatelessWidget {
   const _ThemeModeItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
   static final Map<ThemeMode, String> modeLabels = <ThemeMode, String>{
     ThemeMode.system: 'System Default',
@@ -234,7 +234,7 @@
               children: <Widget>[
                 const Text('Theme'),
                 Text(
-                  modeLabels[options.themeMode],
+                  modeLabels[options!.themeMode!]!,
                   style: Theme.of(context).primaryTextTheme.bodyText2,
                 ),
               ],
@@ -243,18 +243,18 @@
           PopupMenuButton<ThemeMode>(
             padding: const EdgeInsetsDirectional.only(end: 16.0),
             icon: const Icon(Icons.arrow_drop_down),
-            initialValue: options.themeMode,
+            initialValue: options!.themeMode,
             itemBuilder: (BuildContext context) {
               return ThemeMode.values.map<PopupMenuItem<ThemeMode>>((ThemeMode mode) {
                 return PopupMenuItem<ThemeMode>(
                   value: mode,
-                  child: Text(modeLabels[mode]),
+                  child: Text(modeLabels[mode]!),
                 );
               }).toList();
             },
             onSelected: (ThemeMode mode) {
-              onOptionsChanged(
-                options.copyWith(themeMode: mode),
+              onOptionsChanged!(
+                options!.copyWith(themeMode: mode),
               );
             },
           ),
@@ -267,8 +267,8 @@
 class _TextScaleFactorItem extends StatelessWidget {
   const _TextScaleFactorItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
   @override
   Widget build(BuildContext context) {
@@ -281,7 +281,7 @@
               children: <Widget>[
                 const Text('Text size'),
                 Text(
-                  options.textScaleFactor.label,
+                  options!.textScaleFactor!.label,
                   style: Theme.of(context).primaryTextTheme.bodyText2,
                 ),
               ],
@@ -299,8 +299,8 @@
               }).toList();
             },
             onSelected: (GalleryTextScaleValue scaleValue) {
-              onOptionsChanged(
-                options.copyWith(textScaleFactor: scaleValue),
+              onOptionsChanged!(
+                options!.copyWith(textScaleFactor: scaleValue),
               );
             },
           ),
@@ -313,8 +313,8 @@
 class _VisualDensityItem extends StatelessWidget {
   const _VisualDensityItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
   @override
   Widget build(BuildContext context) {
@@ -327,7 +327,7 @@
               children: <Widget>[
                 const Text('Visual density'),
                 Text(
-                  options.visualDensity.label,
+                  options!.visualDensity!.label,
                   style: Theme.of(context).primaryTextTheme.bodyText2,
                 ),
               ],
@@ -345,8 +345,8 @@
               }).toList();
             },
             onSelected: (GalleryVisualDensityValue densityValue) {
-              onOptionsChanged(
-                options.copyWith(visualDensity: densityValue),
+              onOptionsChanged!(
+                options!.copyWith(visualDensity: densityValue),
               );
             },
           ),
@@ -359,17 +359,17 @@
 class _TextDirectionItem extends StatelessWidget {
   const _TextDirectionItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
   @override
   Widget build(BuildContext context) {
     return _BooleanItem(
       'Force RTL',
-      options.textDirection == TextDirection.rtl,
+      options!.textDirection == TextDirection.rtl,
       (bool value) {
-        onOptionsChanged(
-          options.copyWith(
+        onOptionsChanged!(
+          options!.copyWith(
             textDirection: value ? TextDirection.rtl : TextDirection.ltr,
           ),
         );
@@ -382,17 +382,17 @@
 class _TimeDilationItem extends StatelessWidget {
   const _TimeDilationItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
   @override
   Widget build(BuildContext context) {
     return _BooleanItem(
       'Slow motion',
-      options.timeDilation != 1.0,
+      options!.timeDilation != 1.0,
       (bool value) {
-        onOptionsChanged(
-          options.copyWith(
+        onOptionsChanged!(
+          options!.copyWith(
             timeDilation: value ? 20.0 : 1.0,
           ),
         );
@@ -405,10 +405,10 @@
 class _PlatformItem extends StatelessWidget {
   const _PlatformItem(this.options, this.onOptionsChanged);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
 
-  String _platformLabel(TargetPlatform platform) {
+  String? _platformLabel(TargetPlatform? platform) {
     switch(platform) {
       case TargetPlatform.android:
         return 'Mountain View';
@@ -422,9 +422,10 @@
         return 'Material Desktop (macOS)';
       case TargetPlatform.windows:
         return 'Material Desktop (Windows)';
+      default:
+        assert(false);
+        return null;
     }
-    assert(false);
-    return null;
   }
 
   @override
@@ -438,7 +439,7 @@
               children: <Widget>[
                 const Text('Platform mechanics'),
                  Text(
-                   _platformLabel(options.platform),
+                   _platformLabel(options!.platform)!,
                    style: Theme.of(context).primaryTextTheme.bodyText2,
                  ),
               ],
@@ -451,13 +452,13 @@
               return TargetPlatform.values.map((TargetPlatform platform) {
                 return PopupMenuItem<TargetPlatform>(
                   value: platform,
-                  child: Text(_platformLabel(platform)),
+                  child: Text(_platformLabel(platform)!),
                 );
               }).toList();
             },
             onSelected: (TargetPlatform platform) {
-              onOptionsChanged(
-                options.copyWith(platform: platform),
+              onOptionsChanged!(
+                options!.copyWith(platform: platform),
               );
             },
           ),
@@ -469,51 +470,46 @@
 
 class GalleryOptionsPage extends StatelessWidget {
   const GalleryOptionsPage({
-    Key key,
+    Key? key,
     this.options,
     this.onOptionsChanged,
     this.onSendFeedback,
   }) : super(key: key);
 
-  final GalleryOptions options;
-  final ValueChanged<GalleryOptions> onOptionsChanged;
-  final VoidCallback onSendFeedback;
+  final GalleryOptions? options;
+  final ValueChanged<GalleryOptions>? onOptionsChanged;
+  final VoidCallback? onSendFeedback;
 
   List<Widget> _enabledDiagnosticItems() {
     // Boolean showFoo options with a value of null: don't display
     // the showFoo option at all.
-    if (options.showOffscreenLayersCheckerboard == null &&
-        options.showRasterCacheImagesCheckerboard == null &&
-        options.showPerformanceOverlay == null)
+    if (options == null)
       return const <Widget>[];
 
     return <Widget>[
       const Divider(),
       const _Heading('Diagnostics'),
-      if (options.showOffscreenLayersCheckerboard != null)
-        _BooleanItem(
-          'Highlight offscreen layers',
-          options.showOffscreenLayersCheckerboard,
-          (bool value) {
-            onOptionsChanged(options.copyWith(showOffscreenLayersCheckerboard: value));
-          },
-        ),
-      if (options.showRasterCacheImagesCheckerboard != null)
-        _BooleanItem(
-          'Highlight raster cache images',
-          options.showRasterCacheImagesCheckerboard,
-          (bool value) {
-            onOptionsChanged(options.copyWith(showRasterCacheImagesCheckerboard: value));
-          },
-        ),
-      if (options.showPerformanceOverlay != null)
-        _BooleanItem(
-          'Show performance overlay',
-          options.showPerformanceOverlay,
-          (bool value) {
-            onOptionsChanged(options.copyWith(showPerformanceOverlay: value));
-          },
-        ),
+      _BooleanItem(
+        'Highlight offscreen layers',
+        options!.showOffscreenLayersCheckerboard,
+        (bool value) {
+          onOptionsChanged!(options!.copyWith(showOffscreenLayersCheckerboard: value));
+        },
+      ),
+      _BooleanItem(
+        'Highlight raster cache images',
+        options!.showRasterCacheImagesCheckerboard,
+        (bool value) {
+          onOptionsChanged!(options!.copyWith(showRasterCacheImagesCheckerboard: value));
+        },
+      ),
+      _BooleanItem(
+        'Show performance overlay',
+        options!.showPerformanceOverlay,
+        (bool value) {
+          onOptionsChanged!(options!.copyWith(showPerformanceOverlay: value));
+        },
+      ),
     ];
   }
 
@@ -522,7 +518,7 @@
     final ThemeData theme = Theme.of(context);
 
     return DefaultTextStyle(
-      style: theme.primaryTextTheme.subtitle1,
+      style: theme.primaryTextTheme.subtitle1!,
       child: ListView(
         padding: const EdgeInsets.only(bottom: 124.0),
         children: <Widget>[
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/scales.dart b/dev/integration_tests/flutter_gallery/lib/gallery/scales.dart
index bf32601..93163f8 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/scales.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/scales.dart
@@ -8,7 +8,7 @@
 class GalleryTextScaleValue {
   const GalleryTextScaleValue(this.scale, this.label);
 
-  final double scale;
+  final double? scale;
   final String label;
 
   @override
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/syntax_highlighter.dart b/dev/integration_tests/flutter_gallery/lib/gallery/syntax_highlighter.dart
index a2023b2..dea3bf6 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/syntax_highlighter.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/syntax_highlighter.dart
@@ -43,14 +43,14 @@
     );
   }
 
-  final TextStyle baseStyle;
-  final TextStyle numberStyle;
-  final TextStyle commentStyle;
-  final TextStyle keywordStyle;
-  final TextStyle stringStyle;
-  final TextStyle punctuationStyle;
-  final TextStyle classStyle;
-  final TextStyle constantStyle;
+  final TextStyle? baseStyle;
+  final TextStyle? numberStyle;
+  final TextStyle? commentStyle;
+  final TextStyle? keywordStyle;
+  final TextStyle? stringStyle;
+  final TextStyle? punctuationStyle;
+  final TextStyle? classStyle;
+  final TextStyle? constantStyle;
 }
 
 abstract class SyntaxHighlighter {
@@ -63,7 +63,7 @@
     _style ??= SyntaxHighlighterStyle.darkThemeStyle();
   }
 
-  SyntaxHighlighterStyle _style;
+  SyntaxHighlighterStyle? _style;
 
   static const List<String> _keywords = <String>[
     'abstract', 'as', 'assert', 'async', 'await', 'break', 'case', 'catch',
@@ -79,15 +79,15 @@
     'int', 'double', 'num', 'bool',
   ];
 
-  String _src;
-  StringScanner _scanner;
+  String? _src;
+  late StringScanner _scanner;
 
-  List<_HighlightSpan> _spans;
+  late List<_HighlightSpan> _spans;
 
   @override
-  TextSpan format(String src) {
+  TextSpan format(String? src) {
     _src = src;
-    _scanner = StringScanner(_src);
+    _scanner = StringScanner(_src!);
 
     if (_generateSpans()) {
       // Successfully parsed the code
@@ -96,20 +96,20 @@
 
       for (final _HighlightSpan span in _spans) {
         if (currentPosition != span.start)
-          formattedText.add(TextSpan(text: _src.substring(currentPosition, span.start)));
+          formattedText.add(TextSpan(text: _src!.substring(currentPosition, span.start)));
 
-        formattedText.add(TextSpan(style: span.textStyle(_style), text: span.textForSpan(_src)));
+        formattedText.add(TextSpan(style: span.textStyle(_style), text: span.textForSpan(_src!)));
 
         currentPosition = span.end;
       }
 
-      if (currentPosition != _src.length)
-        formattedText.add(TextSpan(text: _src.substring(currentPosition, _src.length)));
+      if (currentPosition != _src!.length)
+        formattedText.add(TextSpan(text: _src!.substring(currentPosition, _src!.length)));
 
-      return TextSpan(style: _style.baseStyle, children: formattedText);
+      return TextSpan(style: _style!.baseStyle, children: formattedText);
     } else {
       // Parsing failed, return with only basic formatting
-      return TextSpan(style: _style.baseStyle, text: src);
+      return TextSpan(style: _style!.baseStyle, text: src);
     }
   }
 
@@ -124,23 +124,23 @@
       if (_scanner.scan(RegExp(r'/\*(.|\n)*\*/'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.comment,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
 
       // Line comments
       if (_scanner.scan('//')) {
-        final int startComment = _scanner.lastMatch.start;
+        final int startComment = _scanner.lastMatch!.start;
 
         bool eof = false;
         int endComment;
         if (_scanner.scan(RegExp(r'.*\n'))) {
-          endComment = _scanner.lastMatch.end - 1;
+          endComment = _scanner.lastMatch!.end - 1;
         } else {
           eof = true;
-          endComment = _src.length;
+          endComment = _src!.length;
         }
 
         _spans.add(_HighlightSpan(
@@ -159,8 +159,8 @@
       if (_scanner.scan(RegExp(r'r".*"'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -169,8 +169,8 @@
       if (_scanner.scan(RegExp(r"r'.*'"))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -179,8 +179,8 @@
       if (_scanner.scan(RegExp(r'"""(?:[^"\\]|\\(.|\n))*"""'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -189,8 +189,8 @@
       if (_scanner.scan(RegExp(r"'''(?:[^'\\]|\\(.|\n))*'''"))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -199,8 +199,8 @@
       if (_scanner.scan(RegExp(r'"(?:[^"\\]|\\.)*"'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -209,8 +209,8 @@
       if (_scanner.scan(RegExp(r"'(?:[^'\\]|\\.)*'"))) {
         _spans.add(_HighlightSpan(
           _HighlightType.string,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -219,8 +219,8 @@
       if (_scanner.scan(RegExp(r'\d+\.\d+'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.number,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -229,8 +229,8 @@
       if (_scanner.scan(RegExp(r'\d+'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.number,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end)
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end)
         );
         continue;
       }
@@ -239,8 +239,8 @@
       if (_scanner.scan(RegExp(r'[\[\]{}().!=<>&\|\?\+\-\*/%\^~;:,]'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.punctuation,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
@@ -249,17 +249,17 @@
       if (_scanner.scan(RegExp(r'@\w+'))) {
         _spans.add(_HighlightSpan(
           _HighlightType.keyword,
-          _scanner.lastMatch.start,
-          _scanner.lastMatch.end,
+          _scanner.lastMatch!.start,
+          _scanner.lastMatch!.end,
         ));
         continue;
       }
 
       // Words
       if (_scanner.scan(RegExp(r'\w+'))) {
-        _HighlightType type;
+        _HighlightType? type;
 
-        String word = _scanner.lastMatch[0];
+        String word = _scanner.lastMatch![0]!;
         if (word.startsWith('_'))
           word = word.substring(1);
 
@@ -275,8 +275,8 @@
         if (type != null) {
           _spans.add(_HighlightSpan(
             type,
-            _scanner.lastMatch.start,
-            _scanner.lastMatch.end,
+            _scanner.lastMatch!.start,
+            _scanner.lastMatch!.end,
           ));
         }
       }
@@ -335,22 +335,22 @@
     return src.substring(start, end);
   }
 
-  TextStyle textStyle(SyntaxHighlighterStyle style) {
+  TextStyle? textStyle(SyntaxHighlighterStyle? style) {
     if (type == _HighlightType.number)
-      return style.numberStyle;
+      return style!.numberStyle;
     else if (type == _HighlightType.comment)
-      return style.commentStyle;
+      return style!.commentStyle;
     else if (type == _HighlightType.keyword)
-      return style.keywordStyle;
+      return style!.keywordStyle;
     else if (type == _HighlightType.string)
-      return style.stringStyle;
+      return style!.stringStyle;
     else if (type == _HighlightType.punctuation)
-      return style.punctuationStyle;
+      return style!.punctuationStyle;
     else if (type == _HighlightType.klass)
-      return style.classStyle;
+      return style!.classStyle;
     else if (type == _HighlightType.constant)
-      return style.constantStyle;
+      return style!.constantStyle;
     else
-      return style.baseStyle;
+      return style!.baseStyle;
   }
 }
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/themes.dart b/dev/integration_tests/flutter_gallery/lib/gallery/themes.dart
index ac4c41e..8d7163e 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/themes.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/themes.dart
@@ -9,7 +9,7 @@
 
 TextTheme _buildTextTheme(TextTheme base) {
   return base.copyWith(
-    headline6: base.headline6.copyWith(
+    headline6: base.headline6!.copyWith(
       fontFamily: 'GoogleSans',
     ),
   );
diff --git a/dev/integration_tests/flutter_gallery/lib/gallery/updater.dart b/dev/integration_tests/flutter_gallery/lib/gallery/updater.dart
index 02d4e22..ce15012 100644
--- a/dev/integration_tests/flutter_gallery/lib/gallery/updater.dart
+++ b/dev/integration_tests/flutter_gallery/lib/gallery/updater.dart
@@ -9,12 +9,11 @@
 typedef UpdateUrlFetcher = Future<String> Function();
 
 class Updater extends StatefulWidget {
-  const Updater({ @required this.updateUrlFetcher, this.child, Key key })
-    : assert(updateUrlFetcher != null),
-      super(key: key);
+  const Updater({ required this.updateUrlFetcher, this.child, Key? key })
+    : super(key: key);
 
   final UpdateUrlFetcher updateUrlFetcher;
-  final Widget child;
+  final Widget? child;
 
   @override
   State createState() => UpdaterState();
@@ -27,27 +26,25 @@
     _checkForUpdates();
   }
 
-  static DateTime _lastUpdateCheck;
+  static DateTime? _lastUpdateCheck;
   Future<void> _checkForUpdates() async {
     // Only prompt once a day
     if (_lastUpdateCheck != null &&
-        DateTime.now().difference(_lastUpdateCheck) < const Duration(days: 1)) {
+        DateTime.now().difference(_lastUpdateCheck!) < const Duration(days: 1)) {
       return; // We already checked for updates recently
     }
     _lastUpdateCheck = DateTime.now();
 
     final String updateUrl = await widget.updateUrlFetcher();
-    if (updateUrl != null) {
-      final bool wantsUpdate = await showDialog<bool>(context: context, builder: _buildDialog);
-      if (wantsUpdate != null && wantsUpdate)
-        launch(updateUrl);
-    }
+    final bool? wantsUpdate = await showDialog<bool>(context: context, builder: _buildDialog);
+    if (wantsUpdate != null && wantsUpdate)
+      launch(updateUrl);
   }
 
   Widget _buildDialog(BuildContext context) {
     final ThemeData theme = Theme.of(context);
     final TextStyle dialogTextStyle =
-        theme.textTheme.subtitle1.copyWith(color: theme.textTheme.caption.color);
+        theme.textTheme.subtitle1!.copyWith(color: theme.textTheme.caption!.color);
     return AlertDialog(
       title: const Text('Update Flutter Gallery?'),
       content: Text('A newer version is available.', style: dialogTextStyle),
@@ -69,5 +66,5 @@
   }
 
   @override
-  Widget build(BuildContext context) => widget.child;
+  Widget build(BuildContext context) => widget.child!;
 }
diff --git a/dev/integration_tests/flutter_gallery/pubspec.yaml b/dev/integration_tests/flutter_gallery/pubspec.yaml
index 36d12d7..bdca1ed 100644
--- a/dev/integration_tests/flutter_gallery/pubspec.yaml
+++ b/dev/integration_tests/flutter_gallery/pubspec.yaml
@@ -2,20 +2,23 @@
 
 environment:
   # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
-  sdk: ">=2.2.2 <3.0.0"
+  sdk: ">=2.12.0-0 <3.0.0"
 
 dependencies:
   flutter:
     sdk: flutter
   collection: 1.15.0-nullsafety.5
   device_info: 2.0.0-nullsafety.1
-  intl: 0.16.1
+  intl: 0.17.0-nullsafety.2
   connectivity: 3.0.0-nullsafety.1
   string_scanner: 1.1.0-nullsafety.3
   url_launcher: 6.0.0-nullsafety.1
   cupertino_icons: 1.0.1
   video_player: 2.0.0-nullsafety.2
-  scoped_model: 1.1.0
+  scoped_model:
+    git:
+      url: https://github.com/kevmoo/scoped_model.git
+      ref: null_safety
   shrine_images: 1.1.2
 
   # Also update dev/benchmarks/complex_layout/pubspec.yaml
@@ -24,6 +27,7 @@
 
   characters: 1.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   connectivity_macos: 0.1.0+7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   connectivity_platform_interface: 2.0.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   device_info_platform_interface: 2.0.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -60,7 +64,6 @@
   async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   cli_util: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   coverage: 0.14.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -273,4 +276,4 @@
       - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
       - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
 
-# PUBSPEC CHECKSUM: 178a
+# PUBSPEC CHECKSUM: a678
diff --git a/dev/integration_tests/flutter_gallery/test/calculator/logic.dart b/dev/integration_tests/flutter_gallery/test/calculator/logic.dart
index ebfd095..d8b07fd 100644
--- a/dev/integration_tests/flutter_gallery/test/calculator/logic.dart
+++ b/dev/integration_tests/flutter_gallery/test/calculator/logic.dart
@@ -10,80 +10,80 @@
 void main() {
   test('Test order of operations: 12 + 3 * 4 = 24', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendDigit(1);
-    expression = expression.appendDigit(2);
-    expression = expression.appendOperation(Operation.Addition);
-    expression = expression.appendDigit(3);
-    expression = expression.appendOperation(Operation.Multiplication);
-    expression = expression.appendDigit(4);
-    expression = expression.computeResult();
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendDigit(2)!;
+    expression = expression.appendOperation(Operation.Addition)!;
+    expression = expression.appendDigit(3)!;
+    expression = expression.appendOperation(Operation.Multiplication)!;
+    expression = expression.appendDigit(4)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('24'));
   });
 
   test('Test floating point 0.1 + 0.2 = 0.3', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendDigit(0);
-    expression = expression.appendPoint();
-    expression = expression.appendDigit(1);
-    expression = expression.appendOperation(Operation.Addition);
-    expression = expression.appendDigit(0);
-    expression = expression.appendPoint();
-    expression = expression.appendDigit(2);
-    expression = expression.computeResult();
+    expression = expression.appendDigit(0)!;
+    expression = expression.appendPoint()!;
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendOperation(Operation.Addition)!;
+    expression = expression.appendDigit(0)!;
+    expression = expression.appendPoint()!;
+    expression = expression.appendDigit(2)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('0.3'));
   });
 
   test('Test floating point 1.0/10.0 = 0.1', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendDigit(1);
-    expression = expression.appendPoint();
-    expression = expression.appendDigit(0);
-    expression = expression.appendOperation(Operation.Division);
-    expression = expression.appendDigit(1);
-    expression = expression.appendDigit(0);
-    expression = expression.appendPoint();
-    expression = expression.appendDigit(0);
-    expression = expression.computeResult();
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendPoint()!;
+    expression = expression.appendDigit(0)!;
+    expression = expression.appendOperation(Operation.Division)!;
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendDigit(0)!;
+    expression = expression.appendPoint()!;
+    expression = expression.appendDigit(0)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('0.1'));
   });
 
   test('Test 1/0 = Infinity', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendDigit(1);
-    expression = expression.appendOperation(Operation.Division);
-    expression = expression.appendDigit(0);
-    expression = expression.computeResult();
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendOperation(Operation.Division)!;
+    expression = expression.appendDigit(0)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('Infinity'));
   });
 
   test('Test use result in next calculation: 1 + 1 = 2 + 1 = 3 + 1 = 4', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendDigit(1);
-    expression = expression.appendOperation(Operation.Addition);
-    expression = expression.appendDigit(1);
-    expression = expression.computeResult();
-    expression = expression.appendOperation(Operation.Addition);
-    expression = expression.appendDigit(1);
-    expression = expression.computeResult();
-    expression = expression.appendOperation(Operation.Addition);
-    expression = expression.appendDigit(1);
-    expression = expression.computeResult();
+    expression = expression.appendDigit(1)!;
+    expression = expression.appendOperation(Operation.Addition)!;
+    expression = expression.appendDigit(1)!;
+    expression = expression.computeResult()!;
+    expression = expression.appendOperation(Operation.Addition)!;
+    expression = expression.appendDigit(1)!;
+    expression = expression.computeResult()!;
+    expression = expression.appendOperation(Operation.Addition)!;
+    expression = expression.appendDigit(1)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('4'));
   });
 
   test('Test minus -3 - -2 = -1', () {
     CalcExpression expression = CalcExpression.empty();
-    expression = expression.appendMinus();
-    expression = expression.appendDigit(3);
-    expression = expression.appendMinus();
-    expression = expression.appendMinus();
-    expression = expression.appendDigit(2);
-    expression = expression.computeResult();
+    expression = expression.appendMinus()!;
+    expression = expression.appendDigit(3)!;
+    expression = expression.appendMinus()!;
+    expression = expression.appendMinus()!;
+    expression = expression.appendDigit(2)!;
+    expression = expression.computeResult()!;
     expect(expression.state, equals(ExpressionState.Result));
     expect(expression.toString(), equals('-1'));
   });
diff --git a/dev/integration_tests/flutter_gallery/test/demo/cupertino/cupertino_navigation_demo_test.dart b/dev/integration_tests/flutter_gallery/test/demo/cupertino/cupertino_navigation_demo_test.dart
index e1698fb..2202a32 100644
--- a/dev/integration_tests/flutter_gallery/test/demo/cupertino/cupertino_navigation_demo_test.dart
+++ b/dev/integration_tests/flutter_gallery/test/demo/cupertino/cupertino_navigation_demo_test.dart
@@ -37,5 +37,7 @@
       find.byType(CupertinoNavigationDemo),
       matchesGoldenFile('cupertino_navigation_demo.screen.2.png'),
     );
-  });
+  },
+  // TODO(egarciad): https://github.com/flutter/flutter/issues/69994
+  skip: true);
 }
diff --git a/dev/integration_tests/flutter_gallery/test/drawer_test.dart b/dev/integration_tests/flutter_gallery/test/drawer_test.dart
index d45c975..54efbd8 100644
--- a/dev/integration_tests/flutter_gallery/test/drawer_test.dart
+++ b/dev/integration_tests/flutter_gallery/test/drawer_test.dart
@@ -32,8 +32,8 @@
 
     // Verify theme settings
     MaterialApp app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
-    expect(app.theme.brightness, equals(Brightness.light));
-    expect(app.darkTheme.brightness, equals(Brightness.dark));
+    expect(app.theme!.brightness, equals(Brightness.light));
+    expect(app.darkTheme!.brightness, equals(Brightness.dark));
 
     // Switch to the dark theme: first menu button, choose 'Dark'
     await tester.tap(find.byIcon(Icons.arrow_drop_down).first);
@@ -63,7 +63,7 @@
     expect(app.themeMode, ThemeMode.system);
 
     // Verify density settings
-    expect(app.theme.visualDensity, equals(const VisualDensity()));
+    expect(app.theme!.visualDensity, equals(const VisualDensity()));
 
     // Popup the density menu: third menu button, choose 'Compact'
     await tester.tap(find.byIcon(Icons.arrow_drop_down).at(2));
@@ -71,7 +71,7 @@
     await tester.tap(find.text('Compact'));
     await tester.pumpAndSettle();
     app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
-    expect(app.theme.visualDensity, equals(VisualDensity.compact));
+    expect(app.theme!.visualDensity, equals(VisualDensity.compact));
 
     await tester.tap(find.byIcon(Icons.arrow_drop_down).at(2));
     await tester.pumpAndSettle();
@@ -81,10 +81,10 @@
     ));
     await tester.pumpAndSettle();
     app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
-    expect(app.theme.visualDensity, equals(const VisualDensity()));
+    expect(app.theme!.visualDensity, equals(const VisualDensity()));
 
     // Verify platform settings
-    expect(app.theme.platform, equals(TargetPlatform.android));
+    expect(app.theme!.platform, equals(TargetPlatform.android));
 
     // Popup the platform menu: fourth menu button, choose 'Cupertino'
     await tester.tap(find.byIcon(Icons.arrow_drop_down).at(3));
@@ -92,7 +92,7 @@
     await tester.tap(find.text('Cupertino').at(1));
     await tester.pumpAndSettle();
     app = find.byType(MaterialApp).evaluate().first.widget as MaterialApp;
-    expect(app.theme.platform, equals(TargetPlatform.iOS));
+    expect(app.theme!.platform, equals(TargetPlatform.iOS));
 
     // Verify the font scale.
     final Size origTextSize = tester.getSize(find.text('Text size'));
diff --git a/dev/integration_tests/flutter_gallery/test/example_code_parser_test.dart b/dev/integration_tests/flutter_gallery/test/example_code_parser_test.dart
index 0af4796..ef4ec9c 100644
--- a/dev/integration_tests/flutter_gallery/test/example_code_parser_test.dart
+++ b/dev/integration_tests/flutter_gallery/test/example_code_parser_test.dart
@@ -12,13 +12,13 @@
   test('Flutter gallery example code parser test', () async {
     final TestAssetBundle bundle = TestAssetBundle();
 
-    final String codeSnippet0 = await getExampleCode('test_0', bundle);
+    final String? codeSnippet0 = await getExampleCode('test_0', bundle);
     expect(codeSnippet0, 'test 0 0\ntest 0 1');
 
-    final String codeSnippet1 = await getExampleCode('test_1', bundle);
+    final String? codeSnippet1 = await getExampleCode('test_1', bundle);
     expect(codeSnippet1, 'test 1 0\ntest 1 1');
 
-    final String codeSnippet3 = await getExampleCode('test_2_windows_breaks', bundle);
+    final String? codeSnippet3 = await getExampleCode('test_2_windows_breaks', bundle);
     expect(codeSnippet3, 'windows test 2 0\nwindows test 2 1');
   });
 }
@@ -41,13 +41,15 @@
 
 class TestAssetBundle extends AssetBundle {
   @override
-  Future<ByteData> load(String key) async => null;
+  Future<ByteData> load(String key) async {
+    return ByteData.sublistView(Uint8List(0));
+  }
 
   @override
   Future<String> loadString(String key, { bool cache = true }) async {
     if (key == 'lib/gallery/example_code.dart')
       return testCodeFile;
-    return null;
+    return '';
   }
 
   @override
diff --git a/dev/integration_tests/flutter_gallery/test/live_smoketest.dart b/dev/integration_tests/flutter_gallery/test/live_smoketest.dart
index a7e5bcf..f7118bc 100644
--- a/dev/integration_tests/flutter_gallery/test/live_smoketest.dart
+++ b/dev/integration_tests/flutter_gallery/test/live_smoketest.dart
@@ -60,11 +60,11 @@
 
     print('Starting app...');
     runApp(const GalleryApp(testMode: true));
-    final _LiveWidgetController controller = _LiveWidgetController(WidgetsBinding.instance);
+    final _LiveWidgetController controller = _LiveWidgetController(WidgetsBinding.instance!);
     for (final GalleryDemoCategory category in kAllGalleryDemoCategories) {
       print('Tapping "${category.name}" section...');
       await controller.tap(find.text(category.name));
-      for (final GalleryDemo demo in kGalleryCategoryToDemos[category]) {
+      for (final GalleryDemo demo in kGalleryCategoryToDemos[category]!) {
         final Finder demoItem = find.text(demo.title);
         print('Scrolling to "${demo.title}"...');
         await controller.scrollIntoView(demoItem, alignment: 0.5);
@@ -110,10 +110,10 @@
   bool frameSync = true;
 
   /// Waits until at the end of a frame the provided [condition] is [true].
-  Future<void> _waitUntilFrame(bool condition(), [Completer<void> completer]) {
+  Future<void> _waitUntilFrame(bool condition(), [Completer<void>? completer]) {
     completer ??= Completer<void>();
     if (!condition()) {
-      SchedulerBinding.instance.addPostFrameCallback((Duration timestamp) {
+      SchedulerBinding.instance!.addPostFrameCallback((Duration timestamp) {
         _waitUntilFrame(condition, completer);
       });
     } else {
@@ -133,11 +133,11 @@
   }
 
   @override
-  Future<void> tap(Finder finder, { int pointer, int buttons = kPrimaryButton }) async {
+  Future<void> tap(Finder finder, { int? pointer, int buttons = kPrimaryButton }) async {
     await super.tap(await _waitForElement(finder), pointer: pointer, buttons: buttons);
   }
 
-  Future<void> scrollIntoView(Finder finder, {double alignment}) async {
+  Future<void> scrollIntoView(Finder finder, {required double alignment}) async {
     final Finder target = await _waitForElement(finder);
     await Scrollable.ensureVisible(target.evaluate().single, duration: const Duration(milliseconds: 100), alignment: alignment);
   }
diff --git a/dev/integration_tests/flutter_gallery/test/smoke_test.dart b/dev/integration_tests/flutter_gallery/test/smoke_test.dart
index 2e01ab9..49db183 100644
--- a/dev/integration_tests/flutter_gallery/test/smoke_test.dart
+++ b/dev/integration_tests/flutter_gallery/test/smoke_test.dart
@@ -77,9 +77,9 @@
 
   // Verify that the dumps are pretty.
   final String routeName = demo.routeName;
-  verifyToStringOutput('debugDumpApp', routeName, WidgetsBinding.instance.renderViewElement.toStringDeep());
-  verifyToStringOutput('debugDumpRenderTree', routeName, RendererBinding.instance?.renderView?.toStringDeep());
-  verifyToStringOutput('debugDumpLayerTree', routeName, RendererBinding.instance?.renderView?.debugLayer?.toStringDeep());
+  verifyToStringOutput('debugDumpApp', routeName, WidgetsBinding.instance!.renderViewElement!.toStringDeep());
+  verifyToStringOutput('debugDumpRenderTree', routeName, RendererBinding.instance?.renderView.toStringDeep() ?? '');
+  verifyToStringOutput('debugDumpLayerTree', routeName, RendererBinding.instance?.renderView.debugLayer?.toStringDeep() ?? '');
 
   // Scroll the demo around a bit more.
   await tester.flingFrom(const Offset(400.0, 300.0), const Offset(0.0, 400.0), 1000.0);
@@ -161,7 +161,7 @@
     await Scrollable.ensureVisible(tester.element(find.text(category.name)), alignment: 0.5);
     await tester.tap(find.text(category.name));
     await tester.pumpAndSettle();
-    for (final GalleryDemo demo in kGalleryCategoryToDemos[category]) {
+    for (final GalleryDemo demo in kGalleryCategoryToDemos[category]!) {
       await Scrollable.ensureVisible(tester.element(find.text(demo.title)), alignment: 0.0);
       await smokeDemo(tester, demo);
       tester.binding.debugAssertNoTransientCallbacks('A transient callback was still active after running $demo');
@@ -179,8 +179,8 @@
   testWidgets('Flutter Gallery app smoke test', smokeGallery);
 
   testWidgets('Flutter Gallery app smoke test with semantics', (WidgetTester tester) async {
-    RendererBinding.instance.setSemanticsEnabled(true);
+    RendererBinding.instance!.setSemanticsEnabled(true);
     await smokeGallery(tester);
-    RendererBinding.instance.setSemanticsEnabled(false);
+    RendererBinding.instance!.setSemanticsEnabled(false);
   });
 }
diff --git a/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_test.dart b/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_test.dart
index 9e6c1e2..f009c17 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_test.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // @dart = 2.9
+
 import 'package:flutter_driver/flutter_driver.dart';
 import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
 
diff --git a/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_web_test.dart b/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_web_test.dart
index 528f334..70234e7 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_web_test.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/scroll_perf_web_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // @dart = 2.9
+
 import 'package:flutter_driver/flutter_driver.dart';
 import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
 
diff --git a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf.dart b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf.dart
index ae88a38..09f8a3c 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf.dart
@@ -47,7 +47,7 @@
 }
 
 void main() {
-  enableFlutterDriverExtension(handler: _MessageHandler());
+  enableFlutterDriverExtension(handler: _MessageHandler().call);
   // As in lib/main.dart: overriding https://github.com/flutter/flutter/issues/13736
   // for better visual effect at the cost of performance.
   runApp(const GalleryApp(testMode: true));
diff --git a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_e2e_test.dart b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_e2e_test.dart
index 1d2eeec..f0a9277 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_e2e_test.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_e2e_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // @dart = 2.9
+
 import 'package:integration_test/integration_test_driver.dart' as driver;
 
 Future<void> main() => driver.integrationDriver(
diff --git a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_hybrid_test.dart b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_hybrid_test.dart
index 572a03b..8b758d8 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_hybrid_test.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_hybrid_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // @dart = 2.9
+
 import 'transitions_perf_test.dart' as transitions_perf_test;
 
 void main([List<String> args = const <String>[]]) => transitions_perf_test.main(
diff --git a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_test.dart b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_test.dart
index ea97a6f..0a89c92 100644
--- a/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_test.dart
+++ b/dev/integration_tests/flutter_gallery/test_driver/transitions_perf_test.dart
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // @dart = 2.9
+
 import 'dart:convert' show JsonEncoder, json;
 
 import 'package:file/file.dart';
diff --git a/dev/tools/pubspec.yaml b/dev/tools/pubspec.yaml
index eca1627..6d8515e 100644
--- a/dev/tools/pubspec.yaml
+++ b/dev/tools/pubspec.yaml
@@ -11,7 +11,7 @@
   flutter_tools:
     path: '../../packages/flutter_tools'
   http: 0.12.2
-  intl: 0.16.1
+  intl: 0.17.0-nullsafety.2
   meta: 1.3.0-nullsafety.6
   path: 1.8.0-nullsafety.3
   process: 4.0.0-nullsafety.4
@@ -34,9 +34,9 @@
   crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   dds: 1.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  devtools: 0.9.3+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  devtools_server: 0.9.3+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  devtools_shared: 0.9.3+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  devtools: 0.9.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  devtools_server: 0.9.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  devtools_shared: 0.9.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   dwds: 7.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   fake_async: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   file: 6.0.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -99,4 +99,4 @@
 
   node_preamble: 1.4.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
 
-# PUBSPEC CHECKSUM: 2704
+# PUBSPEC CHECKSUM: e6c1
diff --git a/packages/flutter_localizations/pubspec.yaml b/packages/flutter_localizations/pubspec.yaml
index a6d39ea..38891cb 100644
--- a/packages/flutter_localizations/pubspec.yaml
+++ b/packages/flutter_localizations/pubspec.yaml
@@ -9,9 +9,10 @@
 
   flutter:
     sdk: flutter
-  intl: 0.16.1
+  intl: 0.17.0-nullsafety.2
 
   characters: 1.1.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   collection: 1.15.0-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   meta: 1.3.0-nullsafety.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   path: 1.8.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -26,7 +27,6 @@
   async: 2.5.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   boolean_selector: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   charcode: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   fake_async: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   matcher: 0.12.10-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   source_span: 1.8.0-nullsafety.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -36,4 +36,4 @@
   term_glyph: 1.2.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   test_api: 0.2.19-nullsafety.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
 
-# PUBSPEC CHECKSUM: db22
+# PUBSPEC CHECKSUM: 82fa
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index 76c1932..c0a3160 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -36,6 +36,7 @@
   'charcode': '1.2.0-nullsafety.3',
   'clock': '1.1.0-nullsafety.3',
   'collection': '1.15.0-nullsafety.5',
+  'intl': '0.17.0-nullsafety.2',
   'fake_async': '1.2.0-nullsafety.3',
   'js': '0.6.3-nullsafety.3',
   'matcher': '0.12.10-nullsafety.3',
diff --git a/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart b/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart
index 0a6cfc7..239b5fd 100644
--- a/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart
+++ b/packages/flutter_tools/lib/src/localizations/gen_l10n_templates.dart
@@ -47,7 +47,7 @@
 ///   # Internationalization support.
 ///   flutter_localizations:
 ///     sdk: flutter
-///   intl: 0.16.1
+///   intl: 0.17.0-nullsafety.2
 ///
 ///   # rest of dependencies
 /// ```
diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml
index 8bd1996..c0ccca4 100644
--- a/packages/flutter_tools/pubspec.yaml
+++ b/packages/flutter_tools/pubspec.yaml
@@ -20,7 +20,7 @@
   flutter_template_images: 1.0.1
   html: 0.14.0+4
   http: 0.12.2
-  intl: 0.16.1
+  intl: 0.17.0-nullsafety.2
   meta: 1.3.0-nullsafety.6
   multicast_dns: 0.2.2
   mustache_template: 1.0.0+1
@@ -49,7 +49,7 @@
   mime: 0.9.7
   logging: 0.11.4
   http_multi_server: 2.2.0
-  devtools_server: 0.9.3+4
+  devtools_server: 0.9.4
   convert: 2.1.1
   async: 2.5.0-nullsafety.3
 
@@ -71,8 +71,8 @@
   cli_util: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   clock: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  devtools: 0.9.3+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-  devtools_shared: 0.9.3+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  devtools: 0.9.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+  devtools_shared: 0.9.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   fixnum: 0.10.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
   http_parser: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -113,4 +113,4 @@
   # Exclude this package from the hosted API docs.
   nodoc: true
 
-# PUBSPEC CHECKSUM: 47dc
+# PUBSPEC CHECKSUM: 359a
diff --git a/packages/flutter_tools/test/integration.shard/test_data/gen_l10n_project.dart b/packages/flutter_tools/test/integration.shard/test_data/gen_l10n_project.dart
index 1b5f01b..eed76cd 100644
--- a/packages/flutter_tools/test/integration.shard/test_data/gen_l10n_project.dart
+++ b/packages/flutter_tools/test/integration.shard/test_data/gen_l10n_project.dart
@@ -42,7 +42,7 @@
     sdk: flutter
   flutter_localizations:
     sdk: flutter
-  intl: 0.16.1
+  intl: 0.17.0-nullsafety.2
 ''';
 
   @override