Prefer void to null (#22977)

* Future<void> main

* Future<void>.delayed

* prefer_void_to_Null

* address review comments
diff --git a/examples/catalog/bin/screenshot_test.dart.template b/examples/catalog/bin/screenshot_test.dart.template
index 6492439..63fb285 100644
--- a/examples/catalog/bin/screenshot_test.dart.template
+++ b/examples/catalog/bin/screenshot_test.dart.template
@@ -26,7 +26,7 @@
       for (String path in paths) {
         await driver.waitUntilNoTransientCallbacks();
         // TBD: when #11021 has been resolved, this shouldn't be necessary.
-        await new Future<Null>.delayed(const Duration(milliseconds: 500));
+        await new Future<void>.delayed(const Duration(milliseconds: 500));
         final List<int> pixels = await driver.screenshot();
         final File file = new File(path);
         await file.writeAsBytes(pixels);
diff --git a/examples/catalog/test/expansion_tile_sample_test.dart b/examples/catalog/test/expansion_tile_sample_test.dart
index 2a6bcde..619a0ba 100644
--- a/examples/catalog/test/expansion_tile_sample_test.dart
+++ b/examples/catalog/test/expansion_tile_sample_test.dart
@@ -22,12 +22,12 @@
       }
     }
 
-    Future<Null> scrollUpOneEntry() async {
+    Future<void> scrollUpOneEntry() async {
       await tester.dragFrom(const Offset(200.0, 200.0), const Offset(0.0, -88.00));
       await tester.pumpAndSettle();
     }
 
-    Future<Null> tapEntry(String title) async {
+    Future<void> tapEntry(String title) async {
       await tester.tap(find.text(title));
       await tester.pumpAndSettle();
     }
diff --git a/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart b/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
index bf327f0..0b1a272 100644
--- a/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/bottom_app_bar_demo.dart
@@ -351,7 +351,7 @@
       IconButton(
         icon: const Icon(Icons.menu),
         onPressed: () {
-          showModalBottomSheet<Null>(
+          showModalBottomSheet<void>(
             context: context,
             builder: (BuildContext context) => const _DemoDrawer(),
           );
diff --git a/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart b/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
index 64701fe..ab9763e 100644
--- a/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/date_and_time_picker_demo.dart
@@ -64,7 +64,7 @@
   final ValueChanged<DateTime> selectDate;
   final ValueChanged<TimeOfDay> selectTime;
 
-  Future<Null> _selectDate(BuildContext context) async {
+  Future<void> _selectDate(BuildContext context) async {
     final DateTime picked = await showDatePicker(
       context: context,
       initialDate: selectedDate,
@@ -75,7 +75,7 @@
       selectDate(picked);
   }
 
-  Future<Null> _selectTime(BuildContext context) async {
+  Future<void> _selectTime(BuildContext context) async {
     final TimeOfDay picked = await showTimePicker(
       context: context,
       initialTime: selectedTime
diff --git a/examples/flutter_gallery/lib/demo/material/dialog_demo.dart b/examples/flutter_gallery/lib/demo/material/dialog_demo.dart
index 27c7bff..73c5e83 100644
--- a/examples/flutter_gallery/lib/demo/material/dialog_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/dialog_demo.dart
@@ -180,7 +180,7 @@
                 context: context,
                 initialTime: _selectedTime
               )
-              .then<Null>((TimeOfDay value) {
+              .then<void>((TimeOfDay value) {
                 if (value != null && value != _selectedTime) {
                   _selectedTime = value;
                   _scaffoldKey.currentState.showSnackBar(SnackBar(
diff --git a/examples/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart b/examples/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
index 9d268fe..9c5fc2c 100644
--- a/examples/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/full_screen_dialog_demo.dart
@@ -49,7 +49,7 @@
                     firstDate: date.subtract(const Duration(days: 30)),
                     lastDate: date.add(const Duration(days: 30))
                   )
-                  .then<Null>((DateTime value) {
+                  .then<void>((DateTime value) {
                     if (value != null)
                       onChanged(DateTime(value.year, value.month, value.day, time.hour, time.minute));
                   });
@@ -76,7 +76,7 @@
                   context: context,
                   initialTime: time
                 )
-                .then<Null>((TimeOfDay value) {
+                .then<void>((TimeOfDay value) {
                   if (value != null)
                     onChanged(DateTime(date.year, date.month, date.day, value.hour, value.minute));
                 });
diff --git a/examples/flutter_gallery/lib/demo/material/list_demo.dart b/examples/flutter_gallery/lib/demo/material/list_demo.dart
index 0f35f96..d47c226 100644
--- a/examples/flutter_gallery/lib/demo/material/list_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/list_demo.dart
@@ -32,7 +32,7 @@
 class _ListDemoState extends State<ListDemo> {
   static final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
 
-  PersistentBottomSheetController<Null> _bottomSheet;
+  PersistentBottomSheetController<void> _bottomSheet;
   _MaterialListType _itemType = _MaterialListType.threeLine;
   bool _dense = false;
   bool _showAvatars = true;
@@ -51,7 +51,7 @@
   }
 
   void _showConfigurationSheet() {
-    final PersistentBottomSheetController<Null> bottomSheet = scaffoldKey.currentState.showBottomSheet((BuildContext bottomSheetContext) {
+    final PersistentBottomSheetController<void> bottomSheet = scaffoldKey.currentState.showBottomSheet<void>((BuildContext bottomSheetContext) {
       return Container(
         decoration: const BoxDecoration(
           border: Border(top: BorderSide(color: Colors.black26)),
diff --git a/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart b/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart
index 5863444..028b1fc 100644
--- a/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/overscroll_demo.dart
@@ -26,10 +26,10 @@
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'
   ];
 
-  Future<Null> _handleRefresh() {
-    final Completer<Null> completer = Completer<Null>();
-    Timer(const Duration(seconds: 3), () { completer.complete(null); });
-    return completer.future.then<Null>((_) {
+  Future<void> _handleRefresh() {
+    final Completer<void> completer = Completer<void>();
+    Timer(const Duration(seconds: 3), () { completer.complete(); });
+    return completer.future.then<void>((_) {
        _scaffoldKey.currentState?.showSnackBar(SnackBar(
          content: const Text('Refresh complete'),
          action: SnackBarAction(
diff --git a/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart b/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
index b244989..40ac589 100644
--- a/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/persistent_bottom_sheet_demo.dart
@@ -28,7 +28,7 @@
     setState(() { // disable the button
       _showBottomSheetCallback = null;
     });
-    _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       final ThemeData themeData = Theme.of(context);
       return Container(
         decoration: BoxDecoration(
diff --git a/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart b/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
index 4cda720..f296128 100644
--- a/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/reorderable_list_demo.dart
@@ -39,7 +39,7 @@
 class _ListDemoState extends State<ReorderableListDemo> {
   static final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
 
-  PersistentBottomSheetController<Null> _bottomSheet;
+  PersistentBottomSheetController<void> _bottomSheet;
   _ReorderableListType _itemType = _ReorderableListType.threeLine;
   bool _reverseSort = false;
   final List<_ListItem> _items = <String>[
@@ -58,7 +58,7 @@
 
   void _showConfigurationSheet() {
     setState(() {
-      _bottomSheet = scaffoldKey.currentState.showBottomSheet((BuildContext bottomSheetContext) {
+      _bottomSheet = scaffoldKey.currentState.showBottomSheet<void>((BuildContext bottomSheetContext) {
         return DecoratedBox(
           decoration: const BoxDecoration(
             border: Border(top: BorderSide(color: Colors.black26)),
diff --git a/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart b/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
index 0ebb592..6f09cb8 100644
--- a/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/tabs_fab_demo.dart
@@ -69,7 +69,7 @@
   }
 
   void _showExplanatoryText() {
-    _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       return Container(
         decoration: BoxDecoration(
           border: Border(top: BorderSide(color: Theme.of(context).dividerColor))
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart
index 9382df9..a7aa943 100644
--- a/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart
@@ -362,7 +362,7 @@
   static final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(debugLabel: 'Shrine Home');
   static final _ShrineGridDelegate gridDelegate = _ShrineGridDelegate();
 
-  Future<Null> _showOrderPage(Product product) async {
+  Future<void> _showOrderPage(Product product) async {
     final Order order = _shoppingCart[product] ?? Order(product: product);
     final Order completedOrder = await Navigator.push(context, ShrineOrderRoute(
       order: order,
diff --git a/examples/flutter_gallery/lib/demo/video_demo.dart b/examples/flutter_gallery/lib/demo/video_demo.dart
index a100591..b4851bd 100644
--- a/examples/flutter_gallery/lib/demo/video_demo.dart
+++ b/examples/flutter_gallery/lib/demo/video_demo.dart
@@ -66,7 +66,7 @@
         pageBuilder: fullScreenRoutePageBuilder,
       );
 
-      route.completed.then((void result) {
+      route.completed.then((void value) {
         controller.setVolume(0.0);
       });
 
@@ -272,7 +272,7 @@
   });
 
   final Widget child;
-  final Completer<Null> connectedCompleter;
+  final Completer<void> connectedCompleter;
   final GlobalKey<ScaffoldState> scaffoldKey;
 
   @override
@@ -362,14 +362,14 @@
   );
 
   final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
-  final Completer<Null> connectedCompleter = Completer<Null>();
+  final Completer<void> connectedCompleter = Completer<void>();
   bool isSupported = true;
 
   @override
   void initState() {
     super.initState();
 
-    Future<Null> initController(VideoPlayerController controller) async {
+    Future<void> initController(VideoPlayerController controller) async {
       controller.setLooping(true);
       controller.setVolume(0.0);
       controller.play();
diff --git a/examples/flutter_gallery/lib/gallery/demo.dart b/examples/flutter_gallery/lib/gallery/demo.dart
index c6a5eda..12afd7d 100644
--- a/examples/flutter_gallery/lib/gallery/demo.dart
+++ b/examples/flutter_gallery/lib/gallery/demo.dart
@@ -138,7 +138,7 @@
 
   @override
   void didChangeDependencies() {
-    getExampleCode(widget.exampleCodeTag, DefaultAssetBundle.of(context)).then<Null>((String code) {
+    getExampleCode(widget.exampleCodeTag, DefaultAssetBundle.of(context)).then<void>((String code) {
       if (mounted) {
         setState(() {
           _exampleCode = code ?? 'Example code not found';
diff --git a/examples/flutter_gallery/lib/gallery/example_code_parser.dart b/examples/flutter_gallery/lib/gallery/example_code_parser.dart
index 6a834bc..7f50292 100644
--- a/examples/flutter_gallery/lib/gallery/example_code_parser.dart
+++ b/examples/flutter_gallery/lib/gallery/example_code_parser.dart
@@ -17,7 +17,7 @@
   return _exampleCode[tag];
 }
 
-Future<Null> _parseExampleCode(AssetBundle bundle) async {
+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>{};
diff --git a/examples/flutter_gallery/test/live_smoketest.dart b/examples/flutter_gallery/test/live_smoketest.dart
index 8bab93d..c64be04 100644
--- a/examples/flutter_gallery/test/live_smoketest.dart
+++ b/examples/flutter_gallery/test/live_smoketest.dart
@@ -39,7 +39,7 @@
   'Video',
 ];
 
-Future<Null> main() async {
+Future<void> main() async {
   try {
     // Verify that _kUnsynchronizedDemos and _kSkippedDemos identify
     // demos that actually exist.
@@ -89,8 +89,8 @@
   bool frameSync = true;
 
   /// Waits until at the end of a frame the provided [condition] is [true].
-  Future<Null> _waitUntilFrame(bool condition(), [Completer<Null> completer]) {
-    completer ??= Completer<Null>();
+  Future<void> _waitUntilFrame(bool condition(), [Completer<void> completer]) {
+    completer ??= Completer<void>();
     if (!condition()) {
       SchedulerBinding.instance.addPostFrameCallback((Duration timestamp) {
         _waitUntilFrame(condition, completer);
@@ -112,11 +112,11 @@
   }
 
   @override
-  Future<Null> tap(Finder finder, { int pointer }) async {
+  Future<void> tap(Finder finder, { int pointer }) async {
     await super.tap(await _waitForElement(finder), pointer: pointer);
   }
 
-  Future<Null> scrollIntoView(Finder finder, {double alignment}) async {
+  Future<void> scrollIntoView(Finder finder, {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/examples/flutter_gallery/test/smoke_test.dart b/examples/flutter_gallery/test/smoke_test.dart
index df480fc..9eb65f5 100644
--- a/examples/flutter_gallery/test/smoke_test.dart
+++ b/examples/flutter_gallery/test/smoke_test.dart
@@ -46,7 +46,7 @@
   }
 }
 
-Future<Null> smokeDemo(WidgetTester tester, GalleryDemo demo) async {
+Future<void> smokeDemo(WidgetTester tester, GalleryDemo demo) async {
   // Don't use pumpUntilNoTransientCallbacks in this function, because some of
   // the smoketests have infinitely-running animations (e.g. the progress
   // indicators demo).
@@ -94,7 +94,7 @@
   await tester.pump(const Duration(milliseconds: 400)); // Wait until it has finished.
 }
 
-Future<Null> smokeOptionsPage(WidgetTester tester) async {
+Future<void> smokeOptionsPage(WidgetTester tester) async {
   final Finder showOptionsPageButton = find.byTooltip('Toggle options page');
 
   // Show the options page
@@ -133,7 +133,7 @@
   await tester.pumpAndSettle();
 }
 
-Future<Null> smokeGallery(WidgetTester tester) async {
+Future<void> smokeGallery(WidgetTester tester) async {
   bool sendFeedbackButtonPressed = false;
 
   await tester.pumpWidget(
diff --git a/examples/flutter_gallery/test_driver/scroll_perf_test.dart b/examples/flutter_gallery/test_driver/scroll_perf_test.dart
index 07a0b7f..0f1f2cb 100644
--- a/examples/flutter_gallery/test_driver/scroll_perf_test.dart
+++ b/examples/flutter_gallery/test_driver/scroll_perf_test.dart
@@ -31,13 +31,13 @@
         // Scroll down
         for (int i = 0; i < 5; i++) {
           await driver.scroll(demoList, 0.0, -300.0, const Duration(milliseconds: 300));
-          await Future<Null>.delayed(const Duration(milliseconds: 500));
+          await Future<void>.delayed(const Duration(milliseconds: 500));
         }
 
         // Scroll up
         for (int i = 0; i < 5; i++) {
           await driver.scroll(demoList, 0.0, 300.0, const Duration(milliseconds: 300));
-          await Future<Null>.delayed(const Duration(milliseconds: 500));
+          await Future<void>.delayed(const Duration(milliseconds: 500));
         }
       });
 
diff --git a/examples/flutter_gallery/test_driver/transitions_perf_test.dart b/examples/flutter_gallery/test_driver/transitions_perf_test.dart
index 9e6da3b..440e332 100644
--- a/examples/flutter_gallery/test_driver/transitions_perf_test.dart
+++ b/examples/flutter_gallery/test_driver/transitions_perf_test.dart
@@ -55,7 +55,7 @@
 
 /// Extracts event data from [events] recorded by timeline, validates it, turns
 /// it into a histogram, and saves to a JSON file.
-Future<Null> saveDurationsHistogram(List<Map<String, dynamic>> events, String outputPath) async {
+Future<void> saveDurationsHistogram(List<Map<String, dynamic>> events, String outputPath) async {
   final Map<String, List<int>> durations = <String, List<int>>{};
   Map<String, dynamic> startEvent;
 
@@ -121,7 +121,7 @@
 
 /// Scrolls each demo menu item into view, launches it, then returns to the
 /// home screen twice.
-Future<Null> runDemos(List<String> demos, FlutterDriver driver) async {
+Future<void> runDemos(List<String> demos, FlutterDriver driver) async {
   final SerializableFinder demoList = find.byValueKey('GalleryDemoList');
   String currentDemoCategory;
 
diff --git a/examples/flutter_gallery/test_memory/back_button.dart b/examples/flutter_gallery/test_memory/back_button.dart
index c8f2e11..9efc776 100644
--- a/examples/flutter_gallery/test_memory/back_button.dart
+++ b/examples/flutter_gallery/test_memory/back_button.dart
@@ -30,7 +30,7 @@
 Future<void> main() async {
   runApp(const GalleryApp());
   await endOfAnimation();
-  await Future<Null>.delayed(const Duration(milliseconds: 50));
+  await Future<void>.delayed(const Duration(milliseconds: 50));
   debugPrint('==== MEMORY BENCHMARK ==== READY ====');
   WidgetsBinding.instance.addObserver(LifecycleObserver());
 }
diff --git a/examples/flutter_gallery/test_memory/memory_nav.dart b/examples/flutter_gallery/test_memory/memory_nav.dart
index fc64fda..b5aad66 100644
--- a/examples/flutter_gallery/test_memory/memory_nav.dart
+++ b/examples/flutter_gallery/test_memory/memory_nav.dart
@@ -36,7 +36,7 @@
     ),
   ));
   await SchedulerBinding.instance.endOfFrame;
-  await Future<Null>.delayed(const Duration(milliseconds: 50));
+  await Future<void>.delayed(const Duration(milliseconds: 50));
   debugPrint('==== MEMORY BENCHMARK ==== READY ====');
 
   await ready.future;
@@ -55,12 +55,12 @@
 
   debugPrint('Navigating...');
   await controller.tap(find.text('Material'));
-  await Future<Null>.delayed(const Duration(milliseconds: 150));
+  await Future<void>.delayed(const Duration(milliseconds: 150));
   final Finder demoList = find.byKey(const Key('GalleryDemoList'));
   final Finder demoItem = find.text('Text fields');
   do {
     await controller.drag(demoList, const Offset(0.0, -300.0));
-    await Future<Null>.delayed(const Duration(milliseconds: 20));
+    await Future<void>.delayed(const Duration(milliseconds: 20));
   } while (!demoItem.precache());
 
   // Ensure that the center of the "Text fields" item is visible
diff --git a/examples/layers/services/isolate.dart b/examples/layers/services/isolate.dart
index d7bfae7..5c689d6 100644
--- a/examples/layers/services/isolate.dart
+++ b/examples/layers/services/isolate.dart
@@ -136,12 +136,12 @@
     // isolates do not have access to the root bundle. However, the loading
     // process is asynchronous, so the UI will not block while the file is
     // loaded.
-    rootBundle.loadString('services/data.json').then<Null>((String data) {
+    rootBundle.loadString('services/data.json').then<void>((String data) {
       if (isRunning) {
         final CalculationMessage message = CalculationMessage(data, _receivePort.sendPort);
         // Spawn an isolate to JSON-parse the file contents. The JSON parsing
         // is synchronous, so if done in the main isolate, the UI would block.
-        Isolate.spawn<CalculationMessage>(_calculate, message).then<Null>((Isolate isolate) {
+        Isolate.spawn<CalculationMessage>(_calculate, message).then<void>((Isolate isolate) {
           if (!isRunning) {
             isolate.kill(priority: Isolate.immediate);
           } else {
diff --git a/examples/layers/test/gestures_test.dart b/examples/layers/test/gestures_test.dart
index c37b1d2..1b09663 100644
--- a/examples/layers/test/gestures_test.dart
+++ b/examples/layers/test/gestures_test.dart
@@ -16,7 +16,7 @@
     final Finder finder = find.byType(GestureDemo);
 
     MaterialColor getSwatch() => tester.state<GestureDemoState>(finder).swatch;
-    Future<Null> tap() async {
+    Future<void> tap() async {
       final Offset topLeft = tester.getTopLeft(finder);
       await tester.tapAt(tester.getSize(finder).center(topLeft));
       await tester.pump(const Duration(seconds: 1));
diff --git a/examples/platform_channel/lib/main.dart b/examples/platform_channel/lib/main.dart
index 8739a01..48eddc8 100644
--- a/examples/platform_channel/lib/main.dart
+++ b/examples/platform_channel/lib/main.dart
@@ -21,7 +21,7 @@
   String _batteryLevel = 'Battery level: unknown.';
   String _chargingStatus = 'Battery status: unknown.';
 
-  Future<Null> _getBatteryLevel() async {
+  Future<void> _getBatteryLevel() async {
     String batteryLevel;
     try {
       final int result = await methodChannel.invokeMethod('getBatteryLevel');
diff --git a/examples/platform_channel_swift/lib/main.dart b/examples/platform_channel_swift/lib/main.dart
index 8739a01..48eddc8 100644
--- a/examples/platform_channel_swift/lib/main.dart
+++ b/examples/platform_channel_swift/lib/main.dart
@@ -21,7 +21,7 @@
   String _batteryLevel = 'Battery level: unknown.';
   String _chargingStatus = 'Battery status: unknown.';
 
-  Future<Null> _getBatteryLevel() async {
+  Future<void> _getBatteryLevel() async {
     String batteryLevel;
     try {
       final int result = await methodChannel.invokeMethod('getBatteryLevel');
diff --git a/examples/platform_view/lib/main.dart b/examples/platform_view/lib/main.dart
index 9a66c01..4778d68 100644
--- a/examples/platform_view/lib/main.dart
+++ b/examples/platform_view/lib/main.dart
@@ -45,7 +45,7 @@
     });
   }
 
-  Future<Null> _launchPlatformCount() async {
+  Future<void> _launchPlatformCount() async {
     final int platformCounter =
         await _methodChannel.invokeMethod('switchView', _counter);
     setState(() {
diff --git a/examples/stocks/lib/stock_data.dart b/examples/stocks/lib/stock_data.dart
index e8d98db..3e08482 100644
--- a/examples/stocks/lib/stock_data.dart
+++ b/examples/stocks/lib/stock_data.dart
@@ -77,7 +77,7 @@
   static bool actuallyFetchData = true;
 
   void _fetchNextChunk() {
-    _httpClient.get(_urlToFetch(_nextChunk++)).then<Null>((http.Response response) {
+    _httpClient.get(_urlToFetch(_nextChunk++)).then<void>((http.Response response) {
       final String json = response.body;
       if (json == null) {
         debugPrint('Failed to load stock data chunk ${_nextChunk - 1}');
diff --git a/examples/stocks/lib/stock_home.dart b/examples/stocks/lib/stock_home.dart
index 323850d..c77134e 100644
--- a/examples/stocks/lib/stock_home.dart
+++ b/examples/stocks/lib/stock_home.dart
@@ -263,7 +263,7 @@
         Navigator.pushNamed(context, '/stock:${stock.symbol}');
       },
       onShow: (Stock stock) {
-        _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) => StockSymbolBottomSheet(stock: stock));
+        _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) => StockSymbolBottomSheet(stock: stock));
       },
     );
   }
diff --git a/examples/stocks/test_driver/scroll_perf_test.dart b/examples/stocks/test_driver/scroll_perf_test.dart
index e8a8591..eb5a23c 100644
--- a/examples/stocks/test_driver/scroll_perf_test.dart
+++ b/examples/stocks/test_driver/scroll_perf_test.dart
@@ -29,13 +29,13 @@
         // Scroll down
         for (int i = 0; i < 5; i++) {
           await driver.scroll(stockList, 0.0, -300.0, const Duration(milliseconds: 300));
-          await Future<Null>.delayed(const Duration(milliseconds: 500));
+          await Future<void>.delayed(const Duration(milliseconds: 500));
         }
 
         // Scroll up
         for (int i = 0; i < 5; i++) {
           await driver.scroll(stockList, 0.0, 300.0, const Duration(milliseconds: 300));
-          await Future<Null>.delayed(const Duration(milliseconds: 500));
+          await Future<void>.delayed(const Duration(milliseconds: 500));
         }
       });
 
diff --git a/packages/flutter/lib/src/animation/animation_controller.dart b/packages/flutter/lib/src/animation/animation_controller.dart
index f418065..587a541 100644
--- a/packages/flutter/lib/src/animation/animation_controller.dart
+++ b/packages/flutter/lib/src/animation/animation_controller.dart
@@ -615,7 +615,7 @@
     _simulation = simulation;
     _lastElapsedDuration = Duration.zero;
     _value = simulation.x(0.0).clamp(lowerBound, upperBound);
-    final Future<Null> result = _ticker.start();
+    final TickerFuture result = _ticker.start();
     _status = (_direction == _AnimationDirection.forward) ?
       AnimationStatus.forward :
       AnimationStatus.reverse;
diff --git a/packages/flutter/lib/src/cupertino/button.dart b/packages/flutter/lib/src/cupertino/button.dart
index 323d2c6..912f4af 100644
--- a/packages/flutter/lib/src/cupertino/button.dart
+++ b/packages/flutter/lib/src/cupertino/button.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 'dart:async';
-
 import 'package:flutter/foundation.dart';
 import 'package:flutter/widgets.dart';
 
@@ -188,10 +186,10 @@
     if (_animationController.isAnimating)
       return;
     final bool wasHeldDown = _buttonHeldDown;
-    final Future<Null> ticker = _buttonHeldDown
+    final TickerFuture ticker = _buttonHeldDown
         ? _animationController.animateTo(1.0, duration: kFadeOutDuration)
         : _animationController.animateTo(0.0, duration: kFadeInDuration);
-    ticker.then<void>((Null value) {
+    ticker.then<void>((void value) {
       if (mounted && wasHeldDown != _buttonHeldDown)
         _animate();
     });
diff --git a/packages/flutter/lib/src/foundation/basic_types.dart b/packages/flutter/lib/src/foundation/basic_types.dart
index 285e40a..73637cd 100644
--- a/packages/flutter/lib/src/foundation/basic_types.dart
+++ b/packages/flutter/lib/src/foundation/basic_types.dart
@@ -47,7 +47,7 @@
 ///  * [VoidCallback], a synchronous version of this signature.
 ///  * [AsyncValueGetter], a signature for asynchronous getters.
 ///  * [AsyncValueSetter], a signature for asynchronous setters.
-typedef AsyncCallback = Future<Null> Function();
+typedef AsyncCallback = Future<void> Function();
 
 /// Signature for callbacks that report that a value has been set and return a
 /// [Future] that completes when the value has been saved.
@@ -56,7 +56,7 @@
 ///
 ///  * [ValueSetter], a synchronous version of this signature.
 ///  * [AsyncValueGetter], the getter equivalent of this signature.
-typedef AsyncValueSetter<T> = Future<Null> Function(T value);
+typedef AsyncValueSetter<T> = Future<void> Function(T value);
 
 /// Signature for callbacks that are to asynchronously report a value on demand.
 ///
diff --git a/packages/flutter/lib/src/foundation/binding.dart b/packages/flutter/lib/src/foundation/binding.dart
index e08df20..56555d3 100644
--- a/packages/flutter/lib/src/foundation/binding.dart
+++ b/packages/flutter/lib/src/foundation/binding.dart
@@ -172,12 +172,12 @@
   ///
   /// The [Future] returned by the `callback` argument is returned by [lockEvents].
   @protected
-  Future<Null> lockEvents(Future<Null> callback()) {
+  Future<void> lockEvents(Future<void> callback()) {
     developer.Timeline.startSync('Lock events');
 
     assert(callback != null);
     _lockCount += 1;
-    final Future<Null> future = callback();
+    final Future<void> future = callback();
     assert(future != null, 'The lockEvents() callback returned null; it should return a Future<Null> that completes when the lock is to expire.');
     future.whenComplete(() {
       _lockCount -= 1;
@@ -216,7 +216,7 @@
   ///
   /// Subclasses (binding classes) should override [performReassemble] to react
   /// to this method being called. This method itself should not be overridden.
-  Future<Null> reassembleApplication() {
+  Future<void> reassembleApplication() {
     return lockEvents(performReassemble);
   }
 
@@ -232,9 +232,9 @@
   /// Do not call this method directly. Instead, use [reassembleApplication].
   @mustCallSuper
   @protected
-  Future<Null> performReassemble() {
+  Future<void> performReassemble() {
     FlutterError.resetErrorCount();
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   /// Registers a service extension method with the given name (full
@@ -467,6 +467,6 @@
 }
 
 /// Terminate the Flutter application.
-Future<Null> _exitApplication() async {
+Future<void> _exitApplication() async {
   exit(0);
 }
diff --git a/packages/flutter/lib/src/foundation/diagnostics.dart b/packages/flutter/lib/src/foundation/diagnostics.dart
index 4f90f82..a996103 100644
--- a/packages/flutter/lib/src/foundation/diagnostics.dart
+++ b/packages/flutter/lib/src/foundation/diagnostics.dart
@@ -664,7 +664,7 @@
   }) {
     assert(style != null);
     assert(level != null);
-    return DiagnosticsProperty<Null>(
+    return DiagnosticsProperty<void>(
       '',
       null,
       description: message,
@@ -1033,7 +1033,7 @@
 ///  * [DiagnosticsNode.message], which serves the same role for messages
 ///    without a clear property name.
 ///  * [StringProperty], which is a better fit for properties with string values.
-class MessageProperty extends DiagnosticsProperty<Null> {
+class MessageProperty extends DiagnosticsProperty<void> {
   /// Create a diagnostics property that displays a message.
   ///
   /// Messages have no concrete [value] (so [value] will return null). The
diff --git a/packages/flutter/lib/src/foundation/print.dart b/packages/flutter/lib/src/foundation/print.dart
index 434dbb2..5b15e4e 100644
--- a/packages/flutter/lib/src/foundation/print.dart
+++ b/packages/flutter/lib/src/foundation/print.dart
@@ -54,7 +54,7 @@
 const Duration _kDebugPrintPauseTime = Duration(seconds: 1);
 final Queue<String> _debugPrintBuffer = Queue<String>();
 final Stopwatch _debugPrintStopwatch = Stopwatch();
-Completer<Null> _debugPrintCompleter;
+Completer<void> _debugPrintCompleter;
 bool _debugPrintScheduled = false;
 void _debugPrintTask() {
   _debugPrintScheduled = false;
@@ -72,7 +72,7 @@
     _debugPrintScheduled = true;
     _debugPrintedCharacters = 0;
     Timer(_kDebugPrintPauseTime, _debugPrintTask);
-    _debugPrintCompleter ??= Completer<Null>();
+    _debugPrintCompleter ??= Completer<void>();
   } else {
     _debugPrintStopwatch.start();
     _debugPrintCompleter?.complete();
@@ -83,7 +83,7 @@
 /// A Future that resolves when there is no longer any buffered content being
 /// printed by [debugPrintThrottled] (which is the default implementation for
 /// [debugPrint], which is used to report errors to the console).
-Future<Null> get debugPrintDone => _debugPrintCompleter?.future ?? Future<Null>.value();
+Future<void> get debugPrintDone => _debugPrintCompleter?.future ?? Future<void>.value();
 
 final RegExp _indentPattern = RegExp('^ *(?:[-+*] |[0-9]+[.):] )?');
 enum _WordWrapParseMode { inSpace, inWord, atBreak }
diff --git a/packages/flutter/lib/src/material/about.dart b/packages/flutter/lib/src/material/about.dart
index 3348ee0..59f078d 100644
--- a/packages/flutter/lib/src/material/about.dart
+++ b/packages/flutter/lib/src/material/about.dart
@@ -379,7 +379,7 @@
   final List<Widget> _licenses = <Widget>[];
   bool _loaded = false;
 
-  Future<Null> _initLicenses() async {
+  Future<void> _initLicenses() async {
     final Flow flow = Flow.begin();
     Timeline.timeSync('_initLicenses()', () { }, flow: flow);
     await for (LicenseEntry license in LicenseRegistry.licenses) {
diff --git a/packages/flutter/lib/src/material/feedback.dart b/packages/flutter/lib/src/material/feedback.dart
index 0576e4a..5dbe0a4 100644
--- a/packages/flutter/lib/src/material/feedback.dart
+++ b/packages/flutter/lib/src/material/feedback.dart
@@ -87,14 +87,14 @@
   ///
   ///  * [wrapForTap] to trigger platform-specific feedback before executing a
   ///    [GestureTapCallback].
-  static Future<Null> forTap(BuildContext context) async {
+  static Future<void> forTap(BuildContext context) async {
     context.findRenderObject().sendSemanticsEvent(const TapSemanticEvent());
     switch (_platform(context)) {
       case TargetPlatform.android:
       case TargetPlatform.fuchsia:
         return SystemSound.play(SystemSoundType.click);
       default:
-        return Future<Null>.value();
+        return Future<void>.value();
     }
   }
 
@@ -126,14 +126,14 @@
   ///
   ///  * [wrapForLongPress] to trigger platform-specific feedback before
   ///    executing a [GestureLongPressCallback].
-  static Future<Null> forLongPress(BuildContext context) {
+  static Future<void> forLongPress(BuildContext context) {
     context.findRenderObject().sendSemanticsEvent(const LongPressSemanticsEvent());
     switch (_platform(context)) {
       case TargetPlatform.android:
       case TargetPlatform.fuchsia:
         return HapticFeedback.vibrate();
       default:
-        return Future<Null>.value();
+        return Future<void>.value();
     }
   }
 
diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart
index 84eb5dd..4c6ef4c 100644
--- a/packages/flutter/lib/src/material/ink_well.dart
+++ b/packages/flutter/lib/src/material/ink_well.dart
@@ -405,7 +405,7 @@
   }
 }
 
-class _InkResponseState<T extends InkResponse> extends State<T> with AutomaticKeepAliveClientMixin {
+class _InkResponseState<T extends InkResponse> extends State<T> with AutomaticKeepAliveClientMixin<T> {
   Set<InteractiveInkFeature> _splashes;
   InteractiveInkFeature _currentSplash;
   InkHighlight _lastHighlight;
diff --git a/packages/flutter/lib/src/material/popup_menu.dart b/packages/flutter/lib/src/material/popup_menu.dart
index 74bfb99..9685f55 100644
--- a/packages/flutter/lib/src/material/popup_menu.dart
+++ b/packages/flutter/lib/src/material/popup_menu.dart
@@ -106,7 +106,7 @@
   final double height;
 
   @override
-  bool represents(dynamic value) => false;
+  bool represents(Null value) => false;
 
   @override
   _PopupMenuDividerState createState() => _PopupMenuDividerState();
diff --git a/packages/flutter/lib/src/material/refresh_indicator.dart b/packages/flutter/lib/src/material/refresh_indicator.dart
index 3a3602b..17a211f 100644
--- a/packages/flutter/lib/src/material/refresh_indicator.dart
+++ b/packages/flutter/lib/src/material/refresh_indicator.dart
@@ -137,7 +137,7 @@
 
 /// Contains the state for a [RefreshIndicator]. This class can be used to
 /// programmatically show the refresh indicator, see the [show] method.
-class RefreshIndicatorState extends State<RefreshIndicator> with TickerProviderStateMixin {
+class RefreshIndicatorState extends State<RefreshIndicator> with TickerProviderStateMixin<RefreshIndicator> {
   AnimationController _positionController;
   AnimationController _scaleController;
   Animation<double> _positionFactor;
@@ -328,7 +328,7 @@
     _mode = _RefreshIndicatorMode.snap;
     _positionController
       .animateTo(1.0 / _kDragSizeFactorLimit, duration: _kIndicatorSnapDuration)
-      .then<void>((Null value) {
+      .then<void>((void value) {
         if (mounted && _mode == _RefreshIndicatorMode.snap) {
           assert(widget.onRefresh != null);
           setState(() {
diff --git a/packages/flutter/lib/src/material/reorderable_list.dart b/packages/flutter/lib/src/material/reorderable_list.dart
index 68d2ca7..67503af 100644
--- a/packages/flutter/lib/src/material/reorderable_list.dart
+++ b/packages/flutter/lib/src/material/reorderable_list.dart
@@ -159,7 +159,7 @@
   _ReorderableListContentState createState() => _ReorderableListContentState();
 }
 
-class _ReorderableListContentState extends State<_ReorderableListContent> with TickerProviderStateMixin {
+class _ReorderableListContentState extends State<_ReorderableListContent> with TickerProviderStateMixin<_ReorderableListContent> {
 
   // The extent along the [widget.scrollDirection] axis to allow a child to
   // drop into when the user reorders list children.
@@ -301,7 +301,7 @@
         scrollOffset < bottomOffset ? bottomOffset : topOffset,
         duration: _scrollAnimationDuration,
         curve: Curves.easeInOut,
-      ).then((Null none) {
+      ).then((void value) {
         setState(() {
           _scrolling = false;
         });
diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart
index 1bffd4c..d655425 100644
--- a/packages/flutter/lib/src/material/scaffold.dart
+++ b/packages/flutter/lib/src/material/scaffold.dart
@@ -1192,7 +1192,7 @@
       _snackBarController.value = 0.0;
       completer.complete(reason);
     } else {
-      _snackBarController.reverse().then<void>((Null _) {
+      _snackBarController.reverse().then<void>((void value) {
         assert(mounted);
         if (!completer.isCompleted)
           completer.complete(reason);
diff --git a/packages/flutter/lib/src/material/tabs.dart b/packages/flutter/lib/src/material/tabs.dart
index 0669315..c2ef5cb 100644
--- a/packages/flutter/lib/src/material/tabs.dart
+++ b/packages/flutter/lib/src/material/tabs.dart
@@ -1118,12 +1118,12 @@
     }
   }
 
-  Future<Null> _warpToCurrentIndex() async {
+  Future<void> _warpToCurrentIndex() async {
     if (!mounted)
-      return Future<Null>.value();
+      return Future<void>.value();
 
     if (_pageController.page == _currentIndex.toDouble())
-      return Future<Null>.value();
+      return Future<void>.value();
 
     final int previousIndex = _controller.previousIndex;
     if ((_currentIndex - previousIndex).abs() == 1)
@@ -1147,7 +1147,7 @@
 
     await _pageController.animateToPage(_currentIndex, duration: kTabScrollDuration, curve: Curves.ease);
     if (!mounted)
-      return Future<Null>.value();
+      return Future<void>.value();
 
     setState(() {
       _warpUnderwayCount -= 1;
diff --git a/packages/flutter/lib/src/painting/image_stream.dart b/packages/flutter/lib/src/painting/image_stream.dart
index 57dd522..4c0b0c4 100644
--- a/packages/flutter/lib/src/painting/image_stream.dart
+++ b/packages/flutter/lib/src/painting/image_stream.dart
@@ -493,7 +493,7 @@
     return timestamp - _shownTimestamp >= _frameDuration;
   }
 
-  Future<Null> _decodeNextFrameAndSchedule() async {
+  Future<void> _decodeNextFrameAndSchedule() async {
     try {
       _nextFrame = await _codec.getNextFrame();
     } catch (exception, stack) {
diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart
index 5f8bef1..c67eb26a 100644
--- a/packages/flutter/lib/src/rendering/binding.dart
+++ b/packages/flutter/lib/src/rendering/binding.dart
@@ -61,7 +61,7 @@
         getter: () async => debugPaintSizeEnabled,
         setter: (bool value) {
           if (debugPaintSizeEnabled == value)
-            return Future<Null>.value();
+            return Future<void>.value();
           debugPaintSizeEnabled = value;
           return _forceRepaint();
         },
@@ -71,7 +71,7 @@
         getter: () async => debugPaintBaselinesEnabled,
         setter: (bool value) {
           if (debugPaintBaselinesEnabled == value)
-            return Future<Null>.value();
+            return Future<void>.value();
           debugPaintBaselinesEnabled = value;
           return _forceRepaint();
         },
@@ -84,7 +84,7 @@
           debugRepaintRainbowEnabled = value;
           if (repaint)
             return _forceRepaint();
-          return Future<Null>.value();
+          return Future<void>.value();
         },
       );
       registerSignalServiceExtension(
@@ -290,7 +290,7 @@
   }
 
   @override
-  Future<Null> performReassemble() async {
+  Future<void> performReassemble() async {
     await super.performReassemble();
     Timeline.startSync('Dirty Render Tree', arguments: timelineWhitelistArguments);
     try {
@@ -310,7 +310,7 @@
     super.hitTest(result, position); // ignore: abstract_super_member_reference
   }
 
-  Future<Null> _forceRepaint() {
+  Future<void> _forceRepaint() {
     RenderObjectVisitor visitor;
     visitor = (RenderObject child) {
       child.markNeedsPaint();
diff --git a/packages/flutter/lib/src/rendering/platform_view.dart b/packages/flutter/lib/src/rendering/platform_view.dart
index d1af55b..93f6e12 100644
--- a/packages/flutter/lib/src/rendering/platform_view.dart
+++ b/packages/flutter/lib/src/rendering/platform_view.dart
@@ -151,7 +151,7 @@
 
   Size _currentAndroidViewSize;
 
-  Future<Null> _sizePlatformView() async {
+  Future<void> _sizePlatformView() async {
     // Android virtual displays cannot have a zero size.
     // Trying to size it to 0 crashes the app, which was happening when starting the app
     // with a locked screen (see: https://github.com/flutter/flutter/issues/20456).
diff --git a/packages/flutter/lib/src/rendering/viewport_offset.dart b/packages/flutter/lib/src/rendering/viewport_offset.dart
index 60cb227..341a1ac 100644
--- a/packages/flutter/lib/src/rendering/viewport_offset.dart
+++ b/packages/flutter/lib/src/rendering/viewport_offset.dart
@@ -176,7 +176,7 @@
   ///
   /// The duration must not be zero. To jump to a particular value without an
   /// animation, use [jumpTo].
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
   });
@@ -252,10 +252,10 @@
   }
 
   @override
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
-  }) async => null;
+  }) async { }
 
   @override
   ScrollDirection get userScrollDirection => ScrollDirection.idle;
diff --git a/packages/flutter/lib/src/scheduler/binding.dart b/packages/flutter/lib/src/scheduler/binding.dart
index 98a6c2a..0fe49d0 100644
--- a/packages/flutter/lib/src/scheduler/binding.dart
+++ b/packages/flutter/lib/src/scheduler/binding.dart
@@ -579,7 +579,7 @@
     _postFrameCallbacks.add(callback);
   }
 
-  Completer<Null> _nextFrameCompleter;
+  Completer<void> _nextFrameCompleter;
 
   /// Returns a Future that completes after the frame completes.
   ///
@@ -590,11 +590,11 @@
   /// If the device's screen is currently turned off, this may wait a very long
   /// time, since frames are not scheduled while the device's screen is turned
   /// off.
-  Future<Null> get endOfFrame {
+  Future<void> get endOfFrame {
     if (_nextFrameCompleter == null) {
       if (schedulerPhase == SchedulerPhase.idle)
         scheduleFrame();
-      _nextFrameCompleter = Completer<Null>();
+      _nextFrameCompleter = Completer<void>();
       addPostFrameCallback((Duration timeStamp) {
         _nextFrameCompleter.complete();
         _nextFrameCompleter = null;
diff --git a/packages/flutter/lib/src/scheduler/ticker.dart b/packages/flutter/lib/src/scheduler/ticker.dart
index cd4d77b..4ebc1cf 100644
--- a/packages/flutter/lib/src/scheduler/ticker.dart
+++ b/packages/flutter/lib/src/scheduler/ticker.dart
@@ -347,7 +347,7 @@
 ///
 /// To run a callback when either this future resolves or when the ticker is
 /// canceled, use [whenCompleteOrCancel].
-class TickerFuture implements Future<Null> {
+class TickerFuture implements Future<void> {
   TickerFuture._();
 
   /// Creates a [TickerFuture] instance that represents an already-complete
@@ -361,8 +361,8 @@
     _complete();
   }
 
-  final Completer<Null> _primaryCompleter = Completer<Null>();
-  Completer<Null> _secondaryCompleter;
+  final Completer<void> _primaryCompleter = Completer<void>();
+  Completer<void> _secondaryCompleter;
   bool _completed; // null means unresolved, true means complete, false means canceled
 
   void _complete() {
@@ -385,11 +385,10 @@
   /// future, so even if the [orCancel] property is accessed, canceling the
   /// ticker will not cause an uncaught exception in the current zone.
   void whenCompleteOrCancel(VoidCallback callback) {
-    Null thunk(dynamic value) {
+    void thunk(dynamic value) {
       callback();
-      return null;
     }
-    orCancel.then<Null>(thunk, onError: thunk);
+    orCancel.then<void>(thunk, onError: thunk);
   }
 
   /// A future that resolves when this future resolves or throws when the ticker
@@ -400,12 +399,12 @@
   /// corresponding ticker is canceled, then the [Future] returned by this
   /// getter will complete with an error, and if that error is not caught, there
   /// will be an uncaught exception in the current zone.
-  Future<Null> get orCancel {
+  Future<void> get orCancel {
     if (_secondaryCompleter == null) {
-      _secondaryCompleter = Completer<Null>();
+      _secondaryCompleter = Completer<void>();
       if (_completed != null) {
         if (_completed) {
-          _secondaryCompleter.complete(null);
+          _secondaryCompleter.complete();
         } else {
           _secondaryCompleter.completeError(const TickerCanceled());
         }
@@ -415,27 +414,27 @@
   }
 
   @override
-  Stream<Null> asStream() {
+  Stream<void> asStream() {
     return _primaryCompleter.future.asStream();
   }
 
   @override
-  Future<Null> catchError(Function onError, { bool test(dynamic error) }) {
+  Future<void> catchError(Function onError, { bool test(dynamic error) }) {
     return _primaryCompleter.future.catchError(onError, test: test);
   }
 
   @override
-  Future<E> then<E>(dynamic f(Null value), { Function onError }) {
+  Future<E> then<E>(dynamic f(void value), { Function onError }) {
     return _primaryCompleter.future.then<E>(f, onError: onError);
   }
 
   @override
-  Future<Null> timeout(Duration timeLimit, { dynamic onTimeout() }) {
+  Future<void> timeout(Duration timeLimit, { dynamic onTimeout() }) {
     return _primaryCompleter.future.timeout(timeLimit, onTimeout: onTimeout);
   }
 
   @override
-  Future<Null> whenComplete(dynamic action()) {
+  Future<void> whenComplete(dynamic action()) {
     return _primaryCompleter.future.whenComplete(action);
   }
 
diff --git a/packages/flutter/lib/src/semantics/semantics_service.dart b/packages/flutter/lib/src/semantics/semantics_service.dart
index 5d6fb25..e2aeaf1 100644
--- a/packages/flutter/lib/src/semantics/semantics_service.dart
+++ b/packages/flutter/lib/src/semantics/semantics_service.dart
@@ -27,7 +27,7 @@
   ///
   /// For example a camera application can use this method to make accessibility
   /// announcements regarding objects in the viewfinder.
-  static Future<Null> announce(String message, TextDirection textDirection) async {
+  static Future<void> announce(String message, TextDirection textDirection) async {
     final AnnounceSemanticsEvent event = AnnounceSemanticsEvent(message, textDirection);
     await SystemChannels.accessibility.send(event.toMap());
   }
@@ -36,7 +36,7 @@
   ///
   /// Currently only honored on Android. The contents of [message] will be
   /// read by TalkBack.
-  static Future<Null> tooltip(String message) async {
+  static Future<void> tooltip(String message) async {
     final TooltipSemanticsEvent event = TooltipSemanticsEvent(message);
     await SystemChannels.accessibility.send(event.toMap());
   }
diff --git a/packages/flutter/lib/src/services/clipboard.dart b/packages/flutter/lib/src/services/clipboard.dart
index 13bc929..aba3761 100644
--- a/packages/flutter/lib/src/services/clipboard.dart
+++ b/packages/flutter/lib/src/services/clipboard.dart
@@ -33,7 +33,7 @@
   static const String kTextPlain = 'text/plain';
 
   /// Stores the given clipboard data on the clipboard.
-  static Future<Null> setData(ClipboardData data) async {
+  static Future<void> setData(ClipboardData data) async {
     await SystemChannels.platform.invokeMethod(
       'Clipboard.setData',
       <String, dynamic>{
diff --git a/packages/flutter/lib/src/services/haptic_feedback.dart b/packages/flutter/lib/src/services/haptic_feedback.dart
index 067781d..f2759ae 100644
--- a/packages/flutter/lib/src/services/haptic_feedback.dart
+++ b/packages/flutter/lib/src/services/haptic_feedback.dart
@@ -20,7 +20,7 @@
   ///
   /// On Android, this uses the platform haptic feedback API to simulate a
   /// response to a long press (`HapticFeedbackConstants.LONG_PRESS`).
-  static Future<Null> vibrate() async {
+  static Future<void> vibrate() async {
     await SystemChannels.platform.invokeMethod('HapticFeedback.vibrate');
   }
 
@@ -31,7 +31,7 @@
   /// below 10.
   ///
   /// On Android, this uses `HapticFeedbackConstants.VIRTUAL_KEY`.
-  static Future<Null> lightImpact() async {
+  static Future<void> lightImpact() async {
     await SystemChannels.platform.invokeMethod(
       'HapticFeedback.vibrate',
       'HapticFeedbackType.lightImpact',
@@ -45,7 +45,7 @@
   /// below 10.
   ///
   /// On Android, this uses `HapticFeedbackConstants.KEYBOARD_TAP`.
-  static Future<Null> mediumImpact() async {
+  static Future<void> mediumImpact() async {
     await SystemChannels.platform.invokeMethod(
       'HapticFeedback.vibrate',
       'HapticFeedbackType.mediumImpact',
@@ -60,7 +60,7 @@
   ///
   /// On Android, this uses `HapticFeedbackConstants.CONTEXT_CLICK` on API levels
   /// 23 and above. This call has no effects on Android API levels below 23.
-  static Future<Null> heavyImpact() async {
+  static Future<void> heavyImpact() async {
     await SystemChannels.platform.invokeMethod(
       'HapticFeedback.vibrate',
       'HapticFeedbackType.heavyImpact',
@@ -73,7 +73,7 @@
   /// This call has no effects on iOS versions below 10.
   ///
   /// On Android, this uses `HapticFeedbackConstants.CLOCK_TICK`.
-  static Future<Null> selectionClick() async {
+  static Future<void> selectionClick() async {
     await SystemChannels.platform.invokeMethod(
       'HapticFeedback.vibrate',
       'HapticFeedbackType.selectionClick',
diff --git a/packages/flutter/lib/src/services/platform_messages.dart b/packages/flutter/lib/src/services/platform_messages.dart
index ef26456..c05d9ac 100644
--- a/packages/flutter/lib/src/services/platform_messages.dart
+++ b/packages/flutter/lib/src/services/platform_messages.dart
@@ -58,7 +58,7 @@
   /// from [Window.onPlatformMessage].
   ///
   /// To register a handler for a given message channel, see [setMessageHandler].
-  static Future<Null> handlePlatformMessage(
+  static Future<void> handlePlatformMessage(
         String channel, ByteData data, ui.PlatformMessageResponseCallback callback) async {
     ByteData response;
     try {
diff --git a/packages/flutter/lib/src/services/system_navigator.dart b/packages/flutter/lib/src/services/system_navigator.dart
index 036601e..a938673 100644
--- a/packages/flutter/lib/src/services/system_navigator.dart
+++ b/packages/flutter/lib/src/services/system_navigator.dart
@@ -19,7 +19,7 @@
   /// This method should be preferred over calling `dart:io`'s [exit] method, as
   /// the latter may cause the underlying platform to act as if the application
   /// had crashed.
-  static Future<Null> pop() async {
+  static Future<void> pop() async {
     await SystemChannels.platform.invokeMethod('SystemNavigator.pop');
   }
 }
diff --git a/packages/flutter/lib/src/services/system_sound.dart b/packages/flutter/lib/src/services/system_sound.dart
index 80b833b..528964a 100644
--- a/packages/flutter/lib/src/services/system_sound.dart
+++ b/packages/flutter/lib/src/services/system_sound.dart
@@ -19,7 +19,7 @@
 
   /// Play the specified system sound. If that sound is not present on the
   /// system, the call is ignored.
-  static Future<Null> play(SystemSoundType type) async {
+  static Future<void> play(SystemSoundType type) async {
     await SystemChannels.platform.invokeMethod(
       'SystemSound.play',
       type.toString(),
diff --git a/packages/flutter/lib/src/widgets/animated_list.dart b/packages/flutter/lib/src/widgets/animated_list.dart
index b44f471..037f358 100644
--- a/packages/flutter/lib/src/widgets/animated_list.dart
+++ b/packages/flutter/lib/src/widgets/animated_list.dart
@@ -205,7 +205,7 @@
 ///
 /// [AnimatedList] item input handlers can also refer to their [AnimatedListState]
 /// with the static [AnimatedList.of] method.
-class AnimatedListState extends State<AnimatedList> with TickerProviderStateMixin {
+class AnimatedListState extends State<AnimatedList> with TickerProviderStateMixin<AnimatedList> {
   final List<_ActiveItem> _incomingItems = <_ActiveItem>[];
   final List<_ActiveItem> _outgoingItems = <_ActiveItem>[];
   int _itemsCount = 0;
@@ -297,7 +297,7 @@
       _itemsCount += 1;
     });
 
-    controller.forward().then<void>((Null value) {
+    controller.forward().then<void>((_) {
       _removeActiveItemAt(_incomingItems, incomingItem.itemIndex).controller.dispose();
     });
   }
@@ -332,7 +332,7 @@
         ..sort();
     });
 
-    controller.reverse().then<void>((Null value) {
+    controller.reverse().then<void>((void value) {
       _removeActiveItemAt(_outgoingItems, outgoingItem.itemIndex).controller.dispose();
 
       // Decrement the incoming and outgoing item indices to account
diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart
index 463909f..0a5a141 100644
--- a/packages/flutter/lib/src/widgets/binding.dart
+++ b/packages/flutter/lib/src/widgets/binding.dart
@@ -283,7 +283,7 @@
         Future<bool>.value(WidgetsApp.showPerformanceOverlayOverride),
         setter: (bool value) {
           if (WidgetsApp.showPerformanceOverlayOverride == value)
-            return Future<Null>.value();
+            return Future<void>.value();
           WidgetsApp.showPerformanceOverlayOverride = value;
           return _forceRebuild();
         },
@@ -296,7 +296,7 @@
         getter: () => Future<bool>.value(WidgetsApp.debugAllowBannerOverride),
         setter: (bool value) {
           if (WidgetsApp.debugAllowBannerOverride == value)
-            return Future<Null>.value();
+            return Future<void>.value();
           WidgetsApp.debugAllowBannerOverride = value;
           return _forceRebuild();
         },
@@ -318,12 +318,12 @@
     }());
   }
 
-  Future<Null> _forceRebuild() {
+  Future<void> _forceRebuild() {
     if (renderViewElement != null) {
       buildOwner.reassemble(renderViewElement);
       return endOfFrame;
     }
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   /// The [BuildOwner] in charge of executing the build pipeline for the
@@ -443,7 +443,7 @@
   /// This method exposes the `popRoute` notification from
   /// [SystemChannels.navigation].
   @protected
-  Future<Null> handlePopRoute() async {
+  Future<void> handlePopRoute() async {
     for (WidgetsBindingObserver observer in List<WidgetsBindingObserver>.from(_observers)) {
       if (await observer.didPopRoute())
         return;
@@ -463,7 +463,7 @@
   /// [SystemChannels.navigation].
   @protected
   @mustCallSuper
-  Future<Null> handlePushRoute(String route) async {
+  Future<void> handlePushRoute(String route) async {
     for (WidgetsBindingObserver observer in List<WidgetsBindingObserver>.from(_observers)) {
       if (await observer.didPushRoute(route))
         return;
@@ -477,7 +477,7 @@
       case 'pushRoute':
         return handlePushRoute(methodCall.arguments);
     }
-    return Future<Null>.value();
+    return Future<dynamic>.value();
   }
 
   @override
@@ -500,7 +500,7 @@
       observer.didHaveMemoryPressure();
   }
 
-  Future<Null> _handleSystemMessage(Object systemMessage) async {
+  Future<void> _handleSystemMessage(Object systemMessage) async {
     final Map<String, dynamic> message = systemMessage;
     final String type = message['type'];
     switch (type) {
@@ -508,7 +508,7 @@
         handleMemoryPressure();
         break;
     }
-    return null;
+    return;
   }
 
   bool _needToReportFirstFrame = true;
@@ -699,11 +699,11 @@
   }
 
   @override
-  Future<Null> performReassemble() {
+  Future<void> performReassemble() {
     deferFirstFrameReport();
     if (renderViewElement != null)
       buildOwner.reassemble(renderViewElement);
-    return super.performReassemble().then((Null value) {
+    return super.performReassemble().then((void value) {
       allowFirstFrameReport();
     });
   }
diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart
index ba289f5..6c3be3e 100644
--- a/packages/flutter/lib/src/widgets/drag_target.dart
+++ b/packages/flutter/lib/src/widgets/drag_target.dart
@@ -593,14 +593,12 @@
         _enteredTargets.add(target);
         return target.didEnter(this);
       },
-      orElse: _null
+      orElse: () => null
     );
 
     _activeTarget = newTarget;
   }
 
-  static Null _null() => null;
-
   Iterable<_DragTargetState<T>> _getDragTargets(List<HitTestEntry> path) sync* {
     // Look for the RenderBoxes that corresponds to the hit target (the hit target
     // widgets build RenderMetaData boxes for us for this purpose).
diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart
index 3c79cc6..96785c0 100644
--- a/packages/flutter/lib/src/widgets/editable_text.dart
+++ b/packages/flutter/lib/src/widgets/editable_text.dart
@@ -427,7 +427,7 @@
 }
 
 /// State for a [EditableText].
-class EditableTextState extends State<EditableText> with AutomaticKeepAliveClientMixin, WidgetsBindingObserver implements TextInputClient, TextSelectionDelegate {
+class EditableTextState extends State<EditableText> with AutomaticKeepAliveClientMixin<EditableText>, WidgetsBindingObserver implements TextInputClient, TextSelectionDelegate {
   Timer _cursorTimer;
   final ValueNotifier<bool> _showCursor = ValueNotifier<bool>(false);
   final GlobalKey _editableKey = GlobalKey();
diff --git a/packages/flutter/lib/src/widgets/image.dart b/packages/flutter/lib/src/widgets/image.dart
index 91e87ef..6901b7e 100644
--- a/packages/flutter/lib/src/widgets/image.dart
+++ b/packages/flutter/lib/src/widgets/image.dart
@@ -71,14 +71,14 @@
 /// See also:
 ///
 ///   * [ImageCache], which holds images that may be reused.
-Future<Null> precacheImage(
+Future<void> precacheImage(
   ImageProvider provider,
   BuildContext context, {
   Size size,
   ImageErrorListener onError,
 }) {
   final ImageConfiguration config = createLocalImageConfiguration(context, size: size);
-  final Completer<Null> completer = Completer<Null>();
+  final Completer<void> completer = Completer<void>();
   final ImageStream stream = provider.resolve(config);
   void listener(ImageInfo image, bool sync) {
     completer.complete();
@@ -98,7 +98,7 @@
     }
   }
   stream.addListener(listener, onError: errorListener);
-  completer.future.then<void>((Null _) { stream.removeListener(listener); });
+  completer.future.then<void>((void value) { stream.removeListener(listener); });
   return completer.future;
 }
 
diff --git a/packages/flutter/lib/src/widgets/implicit_animations.dart b/packages/flutter/lib/src/widgets/implicit_animations.dart
index 7332c88..768ae34 100644
--- a/packages/flutter/lib/src/widgets/implicit_animations.dart
+++ b/packages/flutter/lib/src/widgets/implicit_animations.dart
@@ -257,7 +257,7 @@
 /// Subclasses must implement the [forEachTween] method to allow
 /// [ImplicitlyAnimatedWidgetState] to iterate through the subclasses' widget's
 /// fields and animate them.
-abstract class ImplicitlyAnimatedWidgetState<T extends ImplicitlyAnimatedWidget> extends State<T> with SingleTickerProviderStateMixin {
+abstract class ImplicitlyAnimatedWidgetState<T extends ImplicitlyAnimatedWidget> extends State<T> with SingleTickerProviderStateMixin<T> {
   /// The animation controller driving this widget's implicit animations.
   @protected
   AnimationController get controller => _controller;
diff --git a/packages/flutter/lib/src/widgets/nested_scroll_view.dart b/packages/flutter/lib/src/widgets/nested_scroll_view.dart
index 9d7d98e..fe60582 100644
--- a/packages/flutter/lib/src/widgets/nested_scroll_view.dart
+++ b/packages/flutter/lib/src/widgets/nested_scroll_view.dart
@@ -704,7 +704,7 @@
     _outerPosition.updateCanDrag(maxInnerExtent);
   }
 
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
   }) async {
@@ -713,7 +713,7 @@
       duration,
       curve,
     );
-    final List<Future<Null>> resultFutures = <Future<Null>>[outerActivity.done];
+    final List<Future<void>> resultFutures = <Future<void>>[outerActivity.done];
     beginActivity(
       outerActivity,
       (_NestedScrollPosition position) {
@@ -726,7 +726,7 @@
         return innerActivity;
       },
     );
-    await Future.wait<Null>(resultFutures);
+    await Future.wait<void>(resultFutures);
   }
 
   void jumpTo(double to) {
@@ -1070,7 +1070,7 @@
   }
 
   @override
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
   }) {
diff --git a/packages/flutter/lib/src/widgets/page_view.dart b/packages/flutter/lib/src/widgets/page_view.dart
index 6629a80..371cd58 100644
--- a/packages/flutter/lib/src/widgets/page_view.dart
+++ b/packages/flutter/lib/src/widgets/page_view.dart
@@ -111,7 +111,7 @@
   /// The returned [Future] resolves when the animation completes.
   ///
   /// The `duration` and `curve` arguments must not be null.
-  Future<Null> animateToPage(int page, {
+  Future<void> animateToPage(int page, {
     @required Duration duration,
     @required Curve curve,
   }) {
@@ -138,7 +138,7 @@
   /// The returned [Future] resolves when the animation completes.
   ///
   /// The `duration` and `curve` arguments must not be null.
-  Future<Null> nextPage({ @required Duration duration, @required Curve curve }) {
+  Future<void> nextPage({ @required Duration duration, @required Curve curve }) {
     return animateToPage(page.round() + 1, duration: duration, curve: curve);
   }
 
@@ -148,7 +148,7 @@
   /// The returned [Future] resolves when the animation completes.
   ///
   /// The `duration` and `curve` arguments must not be null.
-  Future<Null> previousPage({ @required Duration duration, @required Curve curve }) {
+  Future<void> previousPage({ @required Duration duration, @required Curve curve }) {
     return animateToPage(page.round() - 1, duration: duration, curve: curve);
   }
 
diff --git a/packages/flutter/lib/src/widgets/scroll_activity.dart b/packages/flutter/lib/src/widgets/scroll_activity.dart
index 4fbb9b9..eb56302 100644
--- a/packages/flutter/lib/src/widgets/scroll_activity.dart
+++ b/packages/flutter/lib/src/widgets/scroll_activity.dart
@@ -601,7 +601,7 @@
        assert(duration > Duration.zero),
        assert(curve != null),
        super(delegate) {
-    _completer = Completer<Null>();
+    _completer = Completer<void>();
     _controller = AnimationController.unbounded(
       value: from,
       debugLabel: '$runtimeType',
@@ -612,7 +612,7 @@
        .whenComplete(_end); // won't trigger if we dispose _controller first
   }
 
-  Completer<Null> _completer;
+  Completer<void> _completer;
   AnimationController _controller;
 
   /// A [Future] that completes when the activity stops.
@@ -620,7 +620,7 @@
   /// For example, this [Future] will complete if the animation reaches the end
   /// or if the user interacts with the scroll view in way that causes the
   /// animation to stop before it reaches the end.
-  Future<Null> get done => _completer.future;
+  Future<void> get done => _completer.future;
 
   @override
   double get velocity => _controller.velocity;
diff --git a/packages/flutter/lib/src/widgets/scroll_controller.dart b/packages/flutter/lib/src/widgets/scroll_controller.dart
index abaf543..b862cf1 100644
--- a/packages/flutter/lib/src/widgets/scroll_controller.dart
+++ b/packages/flutter/lib/src/widgets/scroll_controller.dart
@@ -142,15 +142,15 @@
   ///
   /// The duration must not be zero. To jump to a particular value without an
   /// animation, use [jumpTo].
-  Future<Null> animateTo(double offset, {
+  Future<void> animateTo(double offset, {
     @required Duration duration,
     @required Curve curve,
   }) {
     assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
-    final List<Future<Null>> animations = List<Future<Null>>(_positions.length);
+    final List<Future<void>> animations = List<Future<void>>(_positions.length);
     for (int i = 0; i < _positions.length; i += 1)
       animations[i] = _positions[i].animateTo(offset, duration: duration, curve: curve);
-    return Future.wait<Null>(animations).then<Null>((List<Null> _) => null);
+    return Future.wait<void>(animations).then<void>((List<void> _) => null);
   }
 
   /// Jumps the scroll position from its current value to the given value,
diff --git a/packages/flutter/lib/src/widgets/scroll_position.dart b/packages/flutter/lib/src/widgets/scroll_position.dart
index 9048442..b550e15 100644
--- a/packages/flutter/lib/src/widgets/scroll_position.dart
+++ b/packages/flutter/lib/src/widgets/scroll_position.dart
@@ -488,7 +488,7 @@
 
   /// Animates the position such that the given object is as visible as possible
   /// by just scrolling this position.
-  Future<Null> ensureVisible(RenderObject object, {
+  Future<void> ensureVisible(RenderObject object, {
     double alignment = 0.0,
     Duration duration = Duration.zero,
     Curve curve = Curves.ease,
@@ -500,11 +500,11 @@
     final double target = viewport.getOffsetToReveal(object, alignment).offset.clamp(minScrollExtent, maxScrollExtent);
 
     if (target == pixels)
-      return Future<Null>.value();
+      return Future<void>.value();
 
     if (duration == Duration.zero) {
       jumpTo(target);
-      return Future<Null>.value();
+      return Future<void>.value();
     }
 
     return animateTo(target, duration: duration, curve: curve);
@@ -545,7 +545,7 @@
   ///
   /// The animation is typically handled by an [DrivenScrollActivity].
   @override
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
   });
diff --git a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
index bd7ab34..2b691fd 100644
--- a/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
+++ b/packages/flutter/lib/src/widgets/scroll_position_with_single_context.dart
@@ -169,14 +169,14 @@
   }
 
   @override
-  Future<Null> animateTo(double to, {
+  Future<void> animateTo(double to, {
     @required Duration duration,
     @required Curve curve,
   }) {
     if (nearEqual(to, pixels, physics.tolerance.distance)) {
       // Skip the animation, go straight to the position as we are already close.
       jumpTo(to);
-      return Future<Null>.value();
+      return Future<void>.value();
     }
 
     final DrivenScrollActivity activity = DrivenScrollActivity(
diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart
index 0f019bc..e5fb058 100644
--- a/packages/flutter/lib/src/widgets/scrollable.dart
+++ b/packages/flutter/lib/src/widgets/scrollable.dart
@@ -209,12 +209,12 @@
 
   /// Scrolls the scrollables that enclose the given context so as to make the
   /// given context visible.
-  static Future<Null> ensureVisible(BuildContext context, {
+  static Future<void> ensureVisible(BuildContext context, {
     double alignment = 0.0,
     Duration duration = Duration.zero,
     Curve curve = Curves.ease,
   }) {
-    final List<Future<Null>> futures = <Future<Null>>[];
+    final List<Future<void>> futures = <Future<void>>[];
 
     ScrollableState scrollable = Scrollable.of(context);
     while (scrollable != null) {
@@ -229,10 +229,10 @@
     }
 
     if (futures.isEmpty || duration == Duration.zero)
-      return Future<Null>.value();
+      return Future<void>.value();
     if (futures.length == 1)
       return futures.single;
-    return Future.wait<Null>(futures).then<Null>((List<Null> _) => null);
+    return Future.wait<void>(futures).then<void>((List<void> _) => null);
   }
 }
 
diff --git a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
index 9719280..d87857c 100644
--- a/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
+++ b/packages/flutter/lib/src/widgets/sliver_persistent_header.dart
@@ -207,13 +207,13 @@
   }
 
   @override
-  void insertChildRenderObject(covariant RenderObject child, Null slot) {
+  void insertChildRenderObject(covariant RenderObject child, dynamic slot) {
     assert(renderObject.debugValidateChild(child));
     renderObject.child = child;
   }
 
   @override
-  void moveChildRenderObject(covariant RenderObject child, Null slot) {
+  void moveChildRenderObject(covariant RenderObject child, dynamic slot) {
     assert(false);
   }
 
diff --git a/packages/flutter/lib/src/widgets/text_selection.dart b/packages/flutter/lib/src/widgets/text_selection.dart
index f2019c2..7e2a85f 100644
--- a/packages/flutter/lib/src/widgets/text_selection.dart
+++ b/packages/flutter/lib/src/widgets/text_selection.dart
@@ -176,7 +176,7 @@
   /// asynchronous. Race conditions may exist with this API as currently
   /// implemented.
   // TODO(ianh): https://github.com/flutter/flutter/issues/11427
-  Future<Null> handlePaste(TextSelectionDelegate delegate) async {
+  Future<void> handlePaste(TextSelectionDelegate delegate) async {
     final TextEditingValue value = delegate.textEditingValue; // Snapshot the input before using `await`.
     final ClipboardData data = await Clipboard.getData(Clipboard.kTextPlain);
     if (data != null) {
diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart
index 3ea2f6f..dc8b442 100644
--- a/packages/flutter/lib/src/widgets/widget_inspector.dart
+++ b/packages/flutter/lib/src/widgets/widget_inspector.dart
@@ -910,13 +910,13 @@
   ///
   /// This is expensive and should not be called except during development.
   @protected
-  Future<Null> forceRebuild() {
+  Future<void> forceRebuild() {
     final WidgetsBinding binding = WidgetsBinding.instance;
     if (binding.renderViewElement != null) {
       binding.buildOwner.reassemble(binding.renderViewElement);
       return binding.endOfFrame;
     }
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   /// Called to register service extensions.
@@ -937,7 +937,7 @@
       getter: () async => WidgetsApp.debugShowWidgetInspectorOverride,
       setter: (bool value) {
         if (WidgetsApp.debugShowWidgetInspectorOverride == value) {
-          return Future<Null>.value();
+          return Future<void>.value();
         }
         WidgetsApp.debugShowWidgetInspectorOverride = value;
         return forceRebuild();
diff --git a/packages/flutter/test/animation/futures_test.dart b/packages/flutter/test/animation/futures_test.dart
index 2e552f9..23eb35a 100644
--- a/packages/flutter/test/animation/futures_test.dart
+++ b/packages/flutter/test/animation/futures_test.dart
@@ -22,7 +22,7 @@
       vsync: const TestVSync(),
     );
     final List<String> log = <String>[];
-    Future<Null> runTest() async {
+    Future<void> runTest() async {
       log.add('a'); // t=0
       await controller1.forward(); // starts at t=0 again
       log.add('b'); // wants to end at t=100 but missed frames until t=150
@@ -32,7 +32,7 @@
       log.add('d'); // wants to end at t=1099 but missed frames until t=1200
     }
     log.add('start');
-    runTest().then((Null value) {
+    runTest().then((void value) {
       log.add('end');
     });
     await tester.pump(); // t=0
@@ -71,7 +71,7 @@
       vsync: const TestVSync(),
     );
     final List<String> log = <String>[];
-    Future<Null> runTest() async {
+    Future<void> runTest() async {
       log.add('a'); // t=0
       await controller1.forward().orCancel; // starts at t=0 again
       log.add('b'); // wants to end at t=100 but missed frames until t=150
@@ -81,7 +81,7 @@
       log.add('d'); // wants to end at t=1099 but missed frames until t=1200
     }
     log.add('start');
-    runTest().then((Null value) {
+    runTest().then((void value) {
       log.add('end');
     });
     await tester.pump(); // t=0
@@ -112,7 +112,7 @@
       vsync: const TestVSync(),
     );
     final List<String> log = <String>[];
-    Future<Null> runTest() async {
+    Future<void> runTest() async {
       try {
         log.add('start');
         await controller1.forward().orCancel;
@@ -121,7 +121,7 @@
         log.add('caught');
       }
     }
-    runTest().then((Null value) {
+    runTest().then((void value) {
       log.add('end');
     });
     await tester.pump(); // start ticker
@@ -172,10 +172,10 @@
     final TickerFuture f = controller1.forward();
     await tester.pump(); // start ticker
     await tester.pump(const Duration(milliseconds: 200)); // end ticker
-    expect(await f.asStream().single, isNull);
+    expect(f.asStream().single, isInstanceOf<Future<void>>());
     await f.catchError((dynamic e) { throw 'do not reach'; });
-    expect(await f.then<bool>((Null value) => true), isTrue);
-    expect(await f.whenComplete(() => false), isNull);
-    expect(await f.timeout(const Duration(seconds: 5)), isNull);
+    expect(await f.then<bool>((_) => true), isTrue);
+    expect(f.whenComplete(() => false), isInstanceOf<Future<void>>());
+    expect(f.timeout(const Duration(seconds: 5)), isInstanceOf<Future<void>>());
   });
 }
diff --git a/packages/flutter/test/cupertino/bottom_tab_bar_test.dart b/packages/flutter/test/cupertino/bottom_tab_bar_test.dart
index 54dc0b9..ca54528 100644
--- a/packages/flutter/test/cupertino/bottom_tab_bar_test.dart
+++ b/packages/flutter/test/cupertino/bottom_tab_bar_test.dart
@@ -8,7 +8,7 @@
 import '../painting/mocks_for_image_cache.dart';
 import '../widgets/semantics_tester.dart';
 
-Future<Null> pumpWidgetWithBoilerplate(WidgetTester tester, Widget widget) async {
+Future<void> pumpWidgetWithBoilerplate(WidgetTester tester, Widget widget) async {
   await tester.pumpWidget(
     Directionality(
       textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/engine/task_order_test.dart b/packages/flutter/test/engine/task_order_test.dart
index f29acf6..eef26fc 100644
--- a/packages/flutter/test/engine/task_order_test.dart
+++ b/packages/flutter/test/engine/task_order_test.dart
@@ -13,7 +13,7 @@
     tasks.add(1);
 
     // Flush 0 microtasks.
-    await Future<Null>.delayed(Duration.zero);
+    await Future<void>.delayed(Duration.zero);
 
     scheduleMicrotask(() {
       tasks.add(3);
@@ -25,7 +25,7 @@
     tasks.add(2);
 
     // Flush 2 microtasks.
-    await Future<Null>.delayed(Duration.zero);
+    await Future<void>.delayed(Duration.zero);
 
     scheduleMicrotask(() {
       tasks.add(6);
@@ -40,7 +40,7 @@
     tasks.add(5);
 
     // Flush 3 microtasks.
-    await Future<Null>.delayed(Duration.zero);
+    await Future<void>.delayed(Duration.zero);
 
     tasks.add(9);
 
diff --git a/packages/flutter/test/foundation/error_reporting_test.dart b/packages/flutter/test/foundation/error_reporting_test.dart
index 28dab80..db224bf 100644
--- a/packages/flutter/test/foundation/error_reporting_test.dart
+++ b/packages/flutter/test/foundation/error_reporting_test.dart
@@ -38,7 +38,7 @@
   return await Future<StackTrace>.sync(() => StackTrace.current);
 }
 
-Future<Null> main() async {
+Future<void> main() async {
   final List<String> console = <String>[];
 
   final StackTrace sampleStack = await getSampleStack();
diff --git a/packages/flutter/test/foundation/reassemble_test.dart b/packages/flutter/test/foundation/reassemble_test.dart
index f686ba3..1808b6c 100644
--- a/packages/flutter/test/foundation/reassemble_test.dart
+++ b/packages/flutter/test/foundation/reassemble_test.dart
@@ -11,7 +11,7 @@
   bool wasLocked;
 
   @override
-  Future<Null> performReassemble() async {
+  Future<void> performReassemble() async {
     wasLocked = locked;
     return super.performReassemble();
   }
diff --git a/packages/flutter/test/foundation/service_extensions_test.dart b/packages/flutter/test/foundation/service_extensions_test.dart
index e2ca5b9..b5d4b5c 100644
--- a/packages/flutter/test/foundation/service_extensions_test.dart
+++ b/packages/flutter/test/foundation/service_extensions_test.dart
@@ -43,7 +43,7 @@
   int reassembled = 0;
   bool pendingReassemble = false;
   @override
-  Future<Null> performReassemble() {
+  Future<void> performReassemble() {
     reassembled += 1;
     pendingReassemble = true;
     return super.performReassemble();
@@ -54,7 +54,7 @@
   void scheduleFrame() {
     frameScheduled = true;
   }
-  Future<Null> doFrame() async {
+  Future<void> doFrame() async {
     frameScheduled = false;
     if (ui.window.onBeginFrame != null)
       ui.window.onBeginFrame(Duration.zero);
@@ -74,8 +74,8 @@
     pendingReassemble = false;
   }
 
-  Future<Null> flushMicrotasks() {
-    final Completer<Null> completer = Completer<Null>();
+  Future<void> flushMicrotasks() {
+    final Completer<void> completer = Completer<void>();
     Timer.run(completer.complete);
     return completer.future;
   }
diff --git a/packages/flutter/test/foundation/synchronous_future_test.dart b/packages/flutter/test/foundation/synchronous_future_test.dart
index a768a21..d69546b 100644
--- a/packages/flutter/test/foundation/synchronous_future_test.dart
+++ b/packages/flutter/test/foundation/synchronous_future_test.dart
@@ -12,13 +12,13 @@
     final Future<int> future = SynchronousFuture<int>(42);
 
     int result;
-    future.then<Null>((int value) { result = value; });
+    future.then<void>((int value) { result = value; });
 
     expect(result, equals(42));
     result = null;
 
     final Future<int> futureWithTimeout = future.timeout(const Duration(milliseconds: 1));
-    futureWithTimeout.then<Null>((int value) { result = value; });
+    futureWithTimeout.then<void>((int value) { result = value; });
     expect(result, isNull);
     await futureWithTimeout;
     expect(result, equals(42));
diff --git a/packages/flutter/test/gestures/locking_test.dart b/packages/flutter/test/gestures/locking_test.dart
index 8bb75b5..3de144a 100644
--- a/packages/flutter/test/gestures/locking_test.dart
+++ b/packages/flutter/test/gestures/locking_test.dart
@@ -29,7 +29,7 @@
     ]
   );
 
-  Future<Null> test(VoidCallback callback) {
+  Future<void> test(VoidCallback callback) {
     assert(callback != null);
     return _binding.lockEvents(() async {
       ui.window.onPointerDataPacket(packet);
diff --git a/packages/flutter/test/material/chip_test.dart b/packages/flutter/test/material/chip_test.dart
index 8870443..f73e2fd 100644
--- a/packages/flutter/test/material/chip_test.dart
+++ b/packages/flutter/test/material/chip_test.dart
@@ -81,7 +81,7 @@
 /// further constraining the size of its child, the label widget.
 /// Optionally, adding an avatar or delete icon to the chip should not
 /// cause the chip or label to exceed its constrained height.
-Future<Null> _testConstrainedLabel(
+Future<void> _testConstrainedLabel(
   WidgetTester tester, {
   CircleAvatar avatar,
   VoidCallback onDeleted,
diff --git a/packages/flutter/test/material/date_picker_test.dart b/packages/flutter/test/material/date_picker_test.dart
index 920449a..ca5f19b 100644
--- a/packages/flutter/test/material/date_picker_test.dart
+++ b/packages/flutter/test/material/date_picker_test.dart
@@ -127,7 +127,7 @@
     await tester.pump(const Duration(seconds: 5));
   });
 
-  Future<Null> preparePicker(WidgetTester tester, Future<Null> callback(Future<DateTime> date)) async {
+  Future<void> preparePicker(WidgetTester tester, Future<void> callback(Future<DateTime> date)) async {
     BuildContext buttonContext;
     await tester.pumpWidget(MaterialApp(
       home: Material(
diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart
index 4c2bf8f..486ce20 100644
--- a/packages/flutter/test/material/dropdown_test.dart
+++ b/packages/flutter/test/material/dropdown_test.dart
@@ -585,7 +585,7 @@
     Rect buttonRect;
     Rect menuRect;
 
-    Future<Null> popUpAndDown(Widget frame) async {
+    Future<void> popUpAndDown(Widget frame) async {
       await tester.pumpWidget(frame);
       await tester.tap(find.byType(dropdownButtonType));
       await tester.pumpAndSettle();
diff --git a/packages/flutter/test/material/flexible_space_bar_collapse_mode_test.dart b/packages/flutter/test/material/flexible_space_bar_collapse_mode_test.dart
index 8786e03..6ba8384 100644
--- a/packages/flutter/test/material/flexible_space_bar_collapse_mode_test.dart
+++ b/packages/flutter/test/material/flexible_space_bar_collapse_mode_test.dart
@@ -243,7 +243,7 @@
   });
 }
 
-Future<Null> slowDrag(WidgetTester tester, Key widget, Offset offset) async {
+Future<void> slowDrag(WidgetTester tester, Key widget, Offset offset) async {
   final Offset target = tester.getCenter(find.byKey(widget));
   final TestGesture gesture = await tester.startGesture(target);
   await gesture.moveBy(offset);
diff --git a/packages/flutter/test/material/ink_well_test.dart b/packages/flutter/test/material/ink_well_test.dart
index 89ba576..0ae9410 100644
--- a/packages/flutter/test/material/ink_well_test.dart
+++ b/packages/flutter/test/material/ink_well_test.dart
@@ -155,7 +155,7 @@
   });
 
   testWidgets('splashing survives scrolling when keep-alive is enabled', (WidgetTester tester) async {
-    Future<Null> runTest(bool keepAlive) async {
+    Future<void> runTest(bool keepAlive) async {
       await tester.pumpWidget(
         Directionality(
           textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/material/modal_bottom_sheet_test.dart b/packages/flutter/test/material/modal_bottom_sheet_test.dart
index e9594e2..8123958 100644
--- a/packages/flutter/test/material/modal_bottom_sheet_test.dart
+++ b/packages/flutter/test/material/modal_bottom_sheet_test.dart
@@ -26,11 +26,10 @@
     expect(find.text('BottomSheet'), findsNothing);
 
     bool showBottomSheetThenCalled = false;
-    showModalBottomSheet<Null>(
+    showModalBottomSheet<void>(
       context: savedContext,
       builder: (BuildContext context) => const Text('BottomSheet')
-    ).then<void>((Null result) {
-      expectSync(result, isNull);
+    ).then<void>((void value) {
       showBottomSheetThenCalled = true;
     });
 
@@ -48,11 +47,10 @@
     expect(find.text('BottomSheet'), findsNothing);
 
     showBottomSheetThenCalled = false;
-    showModalBottomSheet<Null>(
+    showModalBottomSheet<void>(
       context: savedContext,
       builder: (BuildContext context) => const Text('BottomSheet'),
-    ).then<void>((Null result) {
-      expectSync(result, isNull);
+    ).then<void>((void value) {
       showBottomSheetThenCalled = true;
     });
     await tester.pump(); // bottom sheet show animation starts
@@ -83,7 +81,7 @@
     expect(showBottomSheetThenCalled, isFalse);
     expect(find.text('BottomSheet'), findsNothing);
 
-    scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       return Container(
         margin: const EdgeInsets.all(40.0),
         child: const Text('BottomSheet')
@@ -137,7 +135,7 @@
       )
     ));
 
-    scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       return Container(
         margin: const EdgeInsets.all(40.0),
         child: const Text('BottomSheet')
diff --git a/packages/flutter/test/material/persistent_bottom_sheet_test.dart b/packages/flutter/test/material/persistent_bottom_sheet_test.dart
index c880aee..388b5b2 100644
--- a/packages/flutter/test/material/persistent_bottom_sheet_test.dart
+++ b/packages/flutter/test/material/persistent_bottom_sheet_test.dart
@@ -8,7 +8,7 @@
 void main() {
   testWidgets('Verify that a BottomSheet can be rebuilt with ScaffoldFeatureController.setState()', (WidgetTester tester) async {
     final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
-    PersistentBottomSheetController<Null> bottomSheet;
+    PersistentBottomSheetController<void> bottomSheet;
     int buildCount = 0;
 
     await tester.pumpWidget(MaterialApp(
@@ -18,7 +18,7 @@
       )
     ));
 
-    bottomSheet = scaffoldKey.currentState.showBottomSheet<Null>((_) {
+    bottomSheet = scaffoldKey.currentState.showBottomSheet<void>((_) {
       return Builder(
         builder: (BuildContext context) {
           buildCount += 1;
@@ -45,7 +45,7 @@
       )
     ));
 
-    scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       return ListView(
         shrinkWrap: true,
         primary: false,
@@ -76,7 +76,7 @@
     ));
 
     int buildCount = 0;
-    showBottomSheet<Null>(
+    showBottomSheet<void>(
       context: key.currentContext,
       builder: (BuildContext context) {
         return Builder(
@@ -114,7 +114,7 @@
 
     await tester.pump();
 
-    showBottomSheet<Null>(
+    showBottomSheet<void>(
       context: scaffoldContext,
       builder: (BuildContext context) {
         bottomSheetContext = context;
diff --git a/packages/flutter/test/material/popup_menu_test.dart b/packages/flutter/test/material/popup_menu_test.dart
index 3352a7b..eba243b 100644
--- a/packages/flutter/test/material/popup_menu_test.dart
+++ b/packages/flutter/test/material/popup_menu_test.dart
@@ -224,8 +224,8 @@
           || widgetType == '_PopupMenu'; // for old versions of Dart that don't reify method type arguments
     };
 
-    Future<Null> openMenu(TextDirection textDirection, Alignment alignment) async {
-      return TestAsyncUtils.guard(() async {
+    Future<void> openMenu(TextDirection textDirection, Alignment alignment) async {
+      return TestAsyncUtils.guard<void>(() async {
         await tester.pumpWidget(Container()); // reset in case we had a menu up already
         await tester.pumpWidget(TestApp(
           textDirection: textDirection,
@@ -239,14 +239,14 @@
       });
     }
 
-    Future<Null> testPositioningDown(
+    Future<void> testPositioningDown(
       WidgetTester tester,
       TextDirection textDirection,
       Alignment alignment,
       TextDirection growthDirection,
       Rect startRect,
     ) {
-      return TestAsyncUtils.guard(() async {
+      return TestAsyncUtils.guard<void>(() async {
         await openMenu(textDirection, alignment);
         Rect rect = tester.getRect(find.byWidgetPredicate(popupMenu));
         expect(rect, startRect);
@@ -296,14 +296,14 @@
       });
     }
 
-    Future<Null> testPositioningDownThenUp(
+    Future<void> testPositioningDownThenUp(
       WidgetTester tester,
       TextDirection textDirection,
       Alignment alignment,
       TextDirection growthDirection,
       Rect startRect,
     ) {
-      return TestAsyncUtils.guard(() async {
+      return TestAsyncUtils.guard<void>(() async {
         await openMenu(textDirection, alignment);
         Rect rect = tester.getRect(find.byWidgetPredicate(popupMenu));
         expect(rect, startRect);
diff --git a/packages/flutter/test/material/scaffold_test.dart b/packages/flutter/test/material/scaffold_test.dart
index 4c23e53..aadc34d 100644
--- a/packages/flutter/test/material/scaffold_test.dart
+++ b/packages/flutter/test/material/scaffold_test.dart
@@ -306,7 +306,7 @@
             builder: (BuildContext context) {
               return GestureDetector(
                 onTap: () {
-                  Scaffold.of(context).showBottomSheet<Null>((BuildContext context) {
+                  Scaffold.of(context).showBottomSheet<void>((BuildContext context) {
                     return Container(
                       key: sheetKey,
                       color: Colors.blue[500],
@@ -390,7 +390,7 @@
   });
 
   group('back arrow', () {
-    Future<Null> expectBackIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon) async {
+    Future<void> expectBackIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon) async {
       final GlobalKey rootKey = GlobalKey();
       final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
         '/': (_) => Container(key: rootKey, child: const Text('Home')),
@@ -425,7 +425,7 @@
   });
 
   group('close button', () {
-    Future<Null> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon, PageRoute<void> routeBuilder()) async {
+    Future<void> expectCloseIcon(WidgetTester tester, TargetPlatform platform, IconData expectedIcon, PageRoute<void> routeBuilder()) async {
       await tester.pumpWidget(
         MaterialApp(
           theme: ThemeData(platform: platform),
diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart
index 6db6c61..bf4cec3 100644
--- a/packages/flutter/test/material/slider_test.dart
+++ b/packages/flutter/test/material/slider_test.dart
@@ -1013,7 +1013,7 @@
       );
     }
 
-    Future<Null> testReparenting(bool reparent) async {
+    Future<void> testReparenting(bool reparent) async {
       final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
       final Offset center = tester.getCenter(find.byType(Slider));
       // Move to 0.0.
@@ -1276,7 +1276,7 @@
       );
     }
 
-    Future<Null> expectValueIndicator({
+    Future<void> expectValueIndicator({
       bool isVisible,
       SliderThemeData theme,
       int divisions,
diff --git a/packages/flutter/test/material/snack_bar_test.dart b/packages/flutter/test/material/snack_bar_test.dart
index 1ecbb22..cf1d55d 100644
--- a/packages/flutter/test/material/snack_bar_test.dart
+++ b/packages/flutter/test/material/snack_bar_test.dart
@@ -425,7 +425,7 @@
                       actionPressed = true;
                     }
                   ),
-                )).closed.then<Null>((SnackBarClosedReason reason) {
+                )).closed.then<void>((SnackBarClosedReason reason) {
                   closedReason = reason;
                 });
               },
diff --git a/packages/flutter/test/material/text_field_test.dart b/packages/flutter/test/material/text_field_test.dart
index b12527a..2a32484 100644
--- a/packages/flutter/test/material/text_field_test.dart
+++ b/packages/flutter/test/material/text_field_test.dart
@@ -100,7 +100,7 @@
   );
 }
 
-Future<Null> skipPastScrollingAnimation(WidgetTester tester) async {
+Future<void> skipPastScrollingAnimation(WidgetTester tester) async {
   await tester.pump();
   await tester.pump(const Duration(milliseconds: 200));
 }
@@ -212,7 +212,7 @@
     final RenderBox inputBox = findTextFieldBox();
     final Size emptyInputSize = inputBox.size;
 
-    Future<Null> checkText(String testValue) async {
+    Future<void> checkText(String testValue) async {
       return TestAsyncUtils.guard(() async {
         await tester.enterText(find.byType(TextField), testValue);
         // Check that the onChanged event handler fired.
@@ -246,7 +246,7 @@
     final EditableTextState editableText = tester.state(find.byType(EditableText));
 
     // Check that the cursor visibility toggles after each blink interval.
-    Future<Null> checkCursorToggle() async {
+    Future<void> checkCursorToggle() async {
       final bool initialShowCursor = editableText.cursorCurrentlyVisible;
       await tester.pump(editableText.cursorBlinkInterval);
       expect(editableText.cursorCurrentlyVisible, equals(!initialShowCursor));
@@ -840,7 +840,7 @@
       ),
     );
 
-    Future<Null> checkText(String testValue) {
+    Future<void> checkText(String testValue) {
       return TestAsyncUtils.guard(() async {
         await tester.enterText(find.byType(TextField), testValue);
 
@@ -870,7 +870,7 @@
       ),
     );
 
-    Future<Null> checkText(String testValue) async {
+    Future<void> checkText(String testValue) async {
       return TestAsyncUtils.guard(() async {
         await tester.enterText(find.byType(TextField), testValue);
 
diff --git a/packages/flutter/test/material/time_picker_test.dart b/packages/flutter/test/material/time_picker_test.dart
index daca36d..2167159 100644
--- a/packages/flutter/test/material/time_picker_test.dart
+++ b/packages/flutter/test/material/time_picker_test.dart
@@ -57,7 +57,7 @@
   return tester.getCenter(find.byKey(const ValueKey<String>('time-picker-dial')));
 }
 
-Future<Null> finishPicker(WidgetTester tester) async {
+Future<void> finishPicker(WidgetTester tester) async {
   final MaterialLocalizations materialLocalizations = MaterialLocalizations.of(tester.element(find.byType(RaisedButton)));
   await tester.tap(find.text(materialLocalizations.okButtonLabel));
   await tester.pumpAndSettle(const Duration(seconds: 1));
@@ -223,7 +223,7 @@
   const List<String> labels12To11TwoDigit = <String>['12', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11'];
   const List<String> labels00To23 = <String>['00', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23'];
 
-  Future<Null> mediaQueryBoilerplate(WidgetTester tester, bool alwaysUse24HourFormat,
+  Future<void> mediaQueryBoilerplate(WidgetTester tester, bool alwaysUse24HourFormat,
       { TimeOfDay initialTime = const TimeOfDay(hour: 7, minute: 0) }) async {
     await tester.pumpWidget(
       Localizations(
@@ -397,7 +397,7 @@
   testWidgets('can increment and decrement hours', (WidgetTester tester) async {
     final SemanticsTester semantics = SemanticsTester(tester);
 
-    Future<Null> actAndExpect({ String initialValue, SemanticsAction action, String finalValue }) async {
+    Future<void> actAndExpect({ String initialValue, SemanticsAction action, String finalValue }) async {
       final SemanticsNode elevenHours = semantics.nodesWith(
         value: initialValue,
         ancestor: tester.renderObject(_hourControl).debugSemantics,
@@ -463,7 +463,7 @@
   testWidgets('can increment and decrement minutes', (WidgetTester tester) async {
     final SemanticsTester semantics = SemanticsTester(tester);
 
-    Future<Null> actAndExpect({ String initialValue, SemanticsAction action, String finalValue }) async {
+    Future<void> actAndExpect({ String initialValue, SemanticsAction action, String finalValue }) async {
       final SemanticsNode elevenHours = semantics.nodesWith(
         value: initialValue,
         ancestor: tester.renderObject(_minuteControl).debugSemantics,
diff --git a/packages/flutter/test/material/user_accounts_drawer_header_test.dart b/packages/flutter/test/material/user_accounts_drawer_header_test.dart
index 31fb510..fdd454a 100644
--- a/packages/flutter/test/material/user_accounts_drawer_header_test.dart
+++ b/packages/flutter/test/material/user_accounts_drawer_header_test.dart
@@ -12,7 +12,7 @@
 const Key avatarC = Key('C');
 const Key avatarD = Key('D');
 
-Future<Null> pumpTestWidget(WidgetTester tester, {
+Future<void> pumpTestWidget(WidgetTester tester, {
   bool withName = true,
   bool withEmail = true,
   bool withOnDetailsPressedHandler = true,
diff --git a/packages/flutter/test/material/will_pop_test.dart b/packages/flutter/test/material/will_pop_test.dart
index 5a64acf..0c643b7 100644
--- a/packages/flutter/test/material/will_pop_test.dart
+++ b/packages/flutter/test/material/will_pop_test.dart
@@ -277,7 +277,7 @@
     StateSetter contentsSetState; // call this to rebuild the route's SampleForm contents
     bool contentsEmpty = false; // when true, don't include the SampleForm in the route
 
-    final TestPageRoute<Null> route = TestPageRoute<Null>(
+    final TestPageRoute<void> route = TestPageRoute<void>(
       builder: (BuildContext context) {
         return StatefulBuilder(
           builder: (BuildContext context, StateSetter setState) {
diff --git a/packages/flutter/test/services/fake_platform_views.dart b/packages/flutter/test/services/fake_platform_views.dart
index a532295..8ade917 100644
--- a/packages/flutter/test/services/fake_platform_views.dart
+++ b/packages/flutter/test/services/fake_platform_views.dart
@@ -35,7 +35,7 @@
   Future<dynamic> _onMethodCall(MethodCall call) {
     if (targetPlatform == TargetPlatform.android)
       return _onMethodCallAndroid(call);
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 
   Future<dynamic> _onMethodCallAndroid(MethodCall call) {
@@ -51,7 +51,7 @@
       case 'setDirection':
         return _setDirection(call);
     }
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 
   Future<dynamic> _create(MethodCall call) {
@@ -90,7 +90,7 @@
       );
 
     _views.remove(id);
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 
   Future<dynamic> _resize(MethodCall call) async {
@@ -110,7 +110,7 @@
     }
     _views[id].size = Size(width, height);
 
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 
   Future<dynamic> _touch(MethodCall call) {
@@ -132,7 +132,7 @@
       motionEvents[id] = <FakeMotionEvent> [];
 
     motionEvents[id].add(FakeMotionEvent(action, pointerIds, pointerOffsets));
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 
   Future<dynamic> _setDirection(MethodCall call) async {
@@ -148,7 +148,7 @@
 
     _views[id].layoutDirection = layoutDirection;
 
-    return Future<Null>.sync(() => null);
+    return Future<dynamic>.sync(() => null);
   }
 }
 
diff --git a/packages/flutter/test/services/platform_channel_test.dart b/packages/flutter/test/services/platform_channel_test.dart
index b7cf0dc..572454b 100644
--- a/packages/flutter/test/services/platform_channel_test.dart
+++ b/packages/flutter/test/services/platform_channel_test.dart
@@ -190,7 +190,7 @@
       );
       final List<dynamic> events = await channel.receiveBroadcastStream('hello').toList();
       expect(events, orderedEquals(<String>['hello1', 'hello2']));
-      await Future<Null>.delayed(Duration.zero);
+      await Future<void>.delayed(Duration.zero);
       expect(canceled, isTrue);
     });
     test('can receive error event', () async {
@@ -212,7 +212,7 @@
       final List<dynamic> events = <dynamic>[];
       final List<dynamic> errors = <dynamic>[];
       channel.receiveBroadcastStream('hello').listen(events.add, onError: errors.add);
-      await Future<Null>.delayed(Duration.zero);
+      await Future<void>.delayed(Duration.zero);
       expect(events, isEmpty);
       expect(errors, hasLength(1));
       expect(errors[0], isInstanceOf<PlatformException>());
diff --git a/packages/flutter/test/widgets/align_test.dart b/packages/flutter/test/widgets/align_test.dart
index 9213e77..c8054f7 100644
--- a/packages/flutter/test/widgets/align_test.dart
+++ b/packages/flutter/test/widgets/align_test.dart
@@ -24,20 +24,20 @@
 
     await tester.pumpWidget(
       const Align(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         alignment: Alignment.topLeft,
       ),
     );
     await tester.pumpWidget(const Directionality(
       textDirection: TextDirection.rtl,
       child: Align(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         alignment: AlignmentDirectional.topStart,
       ),
     ));
     await tester.pumpWidget(
       const Align(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         alignment: Alignment.topLeft,
       ),
     );
diff --git a/packages/flutter/test/widgets/animated_size_test.dart b/packages/flutter/test/widgets/animated_size_test.dart
index 5fbab15..3185a4a 100644
--- a/packages/flutter/test/widgets/animated_size_test.dart
+++ b/packages/flutter/test/widgets/animated_size_test.dart
@@ -138,7 +138,7 @@
     });
 
     testWidgets('tracks unstable child, then resumes animation when child stabilizes', (WidgetTester tester) async {
-      Future<Null> pumpMillis(int millis) async {
+      Future<void> pumpMillis(int millis) async {
         await tester.pump(Duration(milliseconds: millis));
       }
 
diff --git a/packages/flutter/test/widgets/app_overrides_test.dart b/packages/flutter/test/widgets/app_overrides_test.dart
index b6319c8..b463b15 100644
--- a/packages/flutter/test/widgets/app_overrides_test.dart
+++ b/packages/flutter/test/widgets/app_overrides_test.dart
@@ -28,12 +28,12 @@
   }
 }
 
-Future<Null> pumpApp(WidgetTester tester) async {
+Future<void> pumpApp(WidgetTester tester) async {
   await tester.pumpWidget(
     WidgetsApp(
       color: const Color(0xFF333333),
       onGenerateRoute: (RouteSettings settings) {
-        return TestRoute<Null>(settings: settings, child: Container());
+        return TestRoute<void>(settings: settings, child: Container());
       },
     ),
   );
diff --git a/packages/flutter/test/widgets/app_title_test.dart b/packages/flutter/test/widgets/app_title_test.dart
index 18b8972..cfe6256 100644
--- a/packages/flutter/test/widgets/app_title_test.dart
+++ b/packages/flutter/test/widgets/app_title_test.dart
@@ -8,7 +8,7 @@
 const Color kTitleColor = Color(0xFF333333);
 const String kTitleString = 'Hello World';
 
-Future<Null> pumpApp(WidgetTester tester, { GenerateAppTitle onGenerateTitle }) async {
+Future<void> pumpApp(WidgetTester tester, { GenerateAppTitle onGenerateTitle }) async {
   await tester.pumpWidget(
     WidgetsApp(
       supportedLocales: const <Locale>[
diff --git a/packages/flutter/test/widgets/async_test.dart b/packages/flutter/test/widgets/async_test.dart
index 099ca98..92bc5a8 100644
--- a/packages/flutter/test/widgets/async_test.dart
+++ b/packages/flutter/test/widgets/async_test.dart
@@ -327,7 +327,7 @@
   });
 }
 
-Future<Null> eventFiring(WidgetTester tester) async {
+Future<void> eventFiring(WidgetTester tester) async {
   await tester.pump(Duration.zero);
 }
 
diff --git a/packages/flutter/test/widgets/box_decoration_test.dart b/packages/flutter/test/widgets/box_decoration_test.dart
index c3d4eaf..f51195e 100644
--- a/packages/flutter/test/widgets/box_decoration_test.dart
+++ b/packages/flutter/test/widgets/box_decoration_test.dart
@@ -18,7 +18,7 @@
 class TestImageProvider extends ImageProvider<TestImageProvider> {
   TestImageProvider(this.future);
 
-  final Future<Null> future;
+  final Future<void> future;
 
   static ui.Image image;
 
@@ -30,17 +30,17 @@
   @override
   ImageStreamCompleter load(TestImageProvider key) {
     return OneFrameImageStreamCompleter(
-      future.then<ImageInfo>((Null value) => ImageInfo(image: image))
+      future.then<ImageInfo>((void value) => ImageInfo(image: image))
     );
   }
 }
 
-Future<Null> main() async {
+Future<void> main() async {
   TestImageProvider.image = await decodeImageFromList(Uint8List.fromList(kTransparentImage));
 
   testWidgets('DecoratedBox handles loading images', (WidgetTester tester) async {
     final GlobalKey key = GlobalKey();
-    final Completer<Null> completer = Completer<Null>();
+    final Completer<void> completer = Completer<void>();
     await tester.pumpWidget(
       KeyedSubtree(
         key: key,
@@ -62,7 +62,7 @@
   });
 
   testWidgets('Moving a DecoratedBox', (WidgetTester tester) async {
-    final Completer<Null> completer = Completer<Null>();
+    final Completer<void> completer = Completer<void>();
     final Widget subtree = KeyedSubtree(
       key: GlobalKey(),
       child: RepaintBoundary(
diff --git a/packages/flutter/test/widgets/custom_painter_test.dart b/packages/flutter/test/widgets/custom_painter_test.dart
index 03455e5..e0cfeaf 100644
--- a/packages/flutter/test/widgets/custom_painter_test.dart
+++ b/packages/flutter/test/widgets/custom_painter_test.dart
@@ -682,7 +682,7 @@
   });
 }
 
-void testDiff(String description, Future<Null> Function(_DiffTester tester) testFunction) {
+void testDiff(String description, Future<void> Function(_DiffTester tester) testFunction) {
   testWidgets(description, (WidgetTester tester) async {
     await testFunction(_DiffTester(tester));
   });
@@ -700,7 +700,7 @@
   ///
   /// - checks that initial and final configurations are in the desired states.
   /// - checks that keyed nodes have stable IDs.
-  Future<Null> diff({List<String> from, List<String> to}) async {
+  Future<void> diff({List<String> from, List<String> to}) async {
     final SemanticsTester semanticsTester = SemanticsTester(tester);
 
     TestSemantics createExpectations(List<String> labels) {
diff --git a/packages/flutter/test/widgets/dismissible_test.dart b/packages/flutter/test/widgets/dismissible_test.dart
index 084de05..420fdcc 100644
--- a/packages/flutter/test/widgets/dismissible_test.dart
+++ b/packages/flutter/test/widgets/dismissible_test.dart
@@ -61,9 +61,9 @@
   );
 }
 
-typedef DismissMethod = Future<Null> Function(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection });
+typedef DismissMethod = Future<void> Function(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection });
 
-Future<Null> dismissElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection }) async {
+Future<void> dismissElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection }) async {
   Offset downLocation;
   Offset upLocation;
   switch (gestureDirection) {
@@ -98,7 +98,7 @@
   await gesture.up();
 }
 
-Future<Null> flingElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection, double initialOffsetFactor = 0.0 }) async {
+Future<void> flingElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection, double initialOffsetFactor = 0.0 }) async {
   Offset delta;
   switch (gestureDirection) {
     case AxisDirection.left:
@@ -119,7 +119,7 @@
   await tester.fling(finder, delta, 1000.0, initialOffset: delta * initialOffsetFactor);
 }
 
-Future<Null> flingElementFromZero(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection }) async {
+Future<void> flingElementFromZero(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection }) async {
   // This is a special case where we drag in one direction, then fling back so
   // that at the point of release, we're at exactly the point at which we
   // started, but with velocity. This is needed to check a boundary condition
@@ -127,7 +127,7 @@
   await flingElement(tester, finder, gestureDirection: gestureDirection, initialOffsetFactor: -1.0);
 }
 
-Future<Null> dismissItem(WidgetTester tester, int item, {
+Future<void> dismissItem(WidgetTester tester, int item, {
   @required AxisDirection gestureDirection,
   DismissMethod mechanism = dismissElement,
 }) async {
@@ -144,7 +144,7 @@
   await tester.pump(); // rebuild after the callback removes the entry
 }
 
-Future<Null> checkFlingItemBeforeMovementEnd(WidgetTester tester, int item, {
+Future<void> checkFlingItemBeforeMovementEnd(WidgetTester tester, int item, {
   @required AxisDirection gestureDirection,
   DismissMethod mechanism = rollbackElement
 }) async {
@@ -158,7 +158,7 @@
   await tester.pump(const Duration(milliseconds: 100));
 }
 
-Future<Null> checkFlingItemAfterMovement(WidgetTester tester, int item, {
+Future<void> checkFlingItemAfterMovement(WidgetTester tester, int item, {
   @required AxisDirection gestureDirection,
   DismissMethod mechanism = rollbackElement
 }) async {
@@ -172,7 +172,7 @@
   await tester.pump(const Duration(milliseconds: 300));
 }
 
-Future<Null> rollbackElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection, double initialOffsetFactor = 0.0 }) async {
+Future<void> rollbackElement(WidgetTester tester, Finder finder, { @required AxisDirection gestureDirection, double initialOffsetFactor = 0.0 }) async {
   Offset delta;
   switch (gestureDirection) {
     case AxisDirection.left:
diff --git a/packages/flutter/test/widgets/draggable_test.dart b/packages/flutter/test/widgets/draggable_test.dart
index 9085dea..dcec8ae 100644
--- a/packages/flutter/test/widgets/draggable_test.dart
+++ b/packages/flutter/test/widgets/draggable_test.dart
@@ -1803,7 +1803,7 @@
 
 }
 
-Future<Null> _testLongPressDraggableHapticFeedback({WidgetTester tester, bool hapticFeedbackOnStart, int expectedHapticFeedbackCount}) async {
+Future<void> _testLongPressDraggableHapticFeedback({WidgetTester tester, bool hapticFeedbackOnStart, int expectedHapticFeedbackCount}) async {
   bool onDragStartedCalled = false;
 
   int hapticFeedbackCalls = 0;
@@ -1845,7 +1845,7 @@
   expect(hapticFeedbackCalls, expectedHapticFeedbackCount);
 }
 
-Future<Null> _testChildAnchorFeedbackPosition({WidgetTester tester, double top = 0.0, double left = 0.0}) async {
+Future<void> _testChildAnchorFeedbackPosition({WidgetTester tester, double top = 0.0, double left = 0.0}) async {
   final List<int> accepted = <int>[];
   int dragStartedCount = 0;
 
diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart
index 31f7d7d..8b502d8 100644
--- a/packages/flutter/test/widgets/editable_text_test.dart
+++ b/packages/flutter/test/widgets/editable_text_test.dart
@@ -30,7 +30,7 @@
   // More technically, when an EditableText is given a particular [action], Flutter
   // requests [serializedActionName] when attaching to the platform's input
   // system.
-  Future<Null> _desiredKeyboardActionIsRequested({
+  Future<void> _desiredKeyboardActionIsRequested({
     WidgetTester tester,
     TextInputAction action,
     String serializedActionName,
diff --git a/packages/flutter/test/widgets/ensure_visible_test.dart b/packages/flutter/test/widgets/ensure_visible_test.dart
index 5da8090..6c65499 100644
--- a/packages/flutter/test/widgets/ensure_visible_test.dart
+++ b/packages/flutter/test/widgets/ensure_visible_test.dart
@@ -227,7 +227,7 @@
   group('ListView', () {
     testWidgets('ListView ensureVisible Axis.vertical', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -263,7 +263,7 @@
 
     testWidgets('ListView ensureVisible Axis.horizontal', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -299,7 +299,7 @@
 
     testWidgets('ListView ensureVisible Axis.vertical reverse', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -335,7 +335,7 @@
 
     testWidgets('ListView ensureVisible Axis.horizontal reverse', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -372,7 +372,7 @@
     // TODO(abarth): Unskip this test. See https://github.com/flutter/flutter/issues/7919
     testWidgets('ListView ensureVisible negative child', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -430,7 +430,7 @@
 
     testWidgets('ListView ensureVisible rotated child', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -483,7 +483,7 @@
   group('ListView shrinkWrap', () {
     testWidgets('ListView ensureVisible Axis.vertical', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -519,7 +519,7 @@
 
     testWidgets('ListView ensureVisible Axis.horizontal', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -555,7 +555,7 @@
 
     testWidgets('ListView ensureVisible Axis.vertical reverse', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -591,7 +591,7 @@
 
     testWidgets('ListView ensureVisible Axis.horizontal reverse', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
@@ -629,7 +629,7 @@
   group('Scrollable with center', () {
     testWidgets('ensureVisible', (WidgetTester tester) async {
       BuildContext findContext(int i) => tester.element(findKey(i));
-      Future<Null> prepare(double offset) async {
+      Future<void> prepare(double offset) async {
         tester.state<ScrollableState>(find.byType(Scrollable)).position.jumpTo(offset);
         await tester.pump();
       }
diff --git a/packages/flutter/test/widgets/fade_in_image_test.dart b/packages/flutter/test/widgets/fade_in_image_test.dart
index 1c74010..55673bc 100644
--- a/packages/flutter/test/widgets/fade_in_image_test.dart
+++ b/packages/flutter/test/widgets/fade_in_image_test.dart
@@ -9,7 +9,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import '../painting/image_test_utils.dart';
 
-Future<Null> main() async {
+Future<void> main() async {
   // These must run outside test zone to complete
   final ui.Image targetImage = await createTestImage();
   final ui.Image placeholderImage = await createTestImage();
diff --git a/packages/flutter/test/widgets/form_test.dart b/packages/flutter/test/widgets/form_test.dart
index fae19d9..02b5cbe 100644
--- a/packages/flutter/test/widgets/form_test.dart
+++ b/packages/flutter/test/widgets/form_test.dart
@@ -30,7 +30,7 @@
 
     expect(fieldValue, isNull);
 
-    Future<Null> checkText(String testValue) async {
+    Future<void> checkText(String testValue) async {
       await tester.enterText(find.byType(TextFormField), testValue);
       formKey.currentState.save();
       // pump'ing is unnecessary because callback happens regardless of frames
@@ -63,7 +63,7 @@
 
     expect(fieldValue, isNull);
 
-    Future<Null> checkText(String testValue) async {
+    Future<void> checkText(String testValue) async {
       await tester.enterText(find.byType(TextField), testValue);
       // pump'ing is unnecessary because callback happens regardless of frames
       expect(fieldValue, equals(testValue));
@@ -97,7 +97,7 @@
     // Start off not autovalidating.
     await tester.pumpWidget(builder(false));
 
-    Future<Null> checkErrorText(String testValue) async {
+    Future<void> checkErrorText(String testValue) async {
       formKey.currentState.reset();
       await tester.pumpWidget(builder(false));
       await tester.enterText(find.byType(TextFormField), testValue);
@@ -154,13 +154,13 @@
 
     await tester.pumpWidget(builder());
 
-    Future<Null> checkErrorText(String testValue) async {
+    Future<void> checkErrorText(String testValue) async {
       await tester.enterText(find.byType(TextFormField).first, testValue);
       await tester.pump();
 
       // Check for a new Text widget with our error text.
       expect(find.text(testValue + '/error'), findsOneWidget);
-      return null;
+      return;
     }
 
     await checkErrorText('Test');
diff --git a/packages/flutter/test/widgets/gesture_detector_test.dart b/packages/flutter/test/widgets/gesture_detector_test.dart
index ac2800f..36fe286 100644
--- a/packages/flutter/test/widgets/gesture_detector_test.dart
+++ b/packages/flutter/test/widgets/gesture_detector_test.dart
@@ -286,7 +286,7 @@
     // Pointer is dragged from the center of the 800x100 gesture detector
     // to a point (400,300) below it. This always causes onTapCancel to be
     // called; onTap should never be called.
-    Future<Null> dragOut(Duration timeout) async {
+    Future<void> dragOut(Duration timeout) async {
       final TestGesture gesture = await tester.startGesture(const Offset(400.0, 50.0));
       // If the timeout is less than kPressTimeout the recognizer will just trigger
       // the onTapCancel callback. If the timeout is greater than kLongPressTimeout
diff --git a/packages/flutter/test/widgets/image_test.dart b/packages/flutter/test/widgets/image_test.dart
index 04fd69e..7c17a95 100644
--- a/packages/flutter/test/widgets/image_test.dart
+++ b/packages/flutter/test/widgets/image_test.dart
@@ -601,7 +601,7 @@
 
   testWidgets('Precache', (WidgetTester tester) async {
     final TestImageProvider provider = TestImageProvider();
-    Future<Null> precache;
+    Future<void> precache;
     await tester.pumpWidget(
       Builder(
         builder: (BuildContext context) {
@@ -632,7 +632,7 @@
     final Exception testException = Exception('cannot resolve host');
     final StackTrace testStack = StackTrace.current;
     final TestImageProvider imageProvider = TestImageProvider();
-    Future<Null> precache;
+    Future<void> precache;
     await tester.pumpWidget(
       Builder(
         builder: (BuildContext context) {
diff --git a/packages/flutter/test/widgets/list_view_test.dart b/packages/flutter/test/widgets/list_view_test.dart
index 8bca4d0..89e4978 100644
--- a/packages/flutter/test/widgets/list_view_test.dart
+++ b/packages/flutter/test/widgets/list_view_test.dart
@@ -176,7 +176,7 @@
   });
 
   testWidgets('ListView large scroll jump and keepAlive first child not keepAlive', (WidgetTester tester) async {
-    Future<Null> checkAndScroll([String zero = '0:false']) async {
+    Future<void> checkAndScroll([String zero = '0:false']) async {
       expect(find.text(zero), findsOneWidget);
       expect(find.text('1:false'), findsOneWidget);
       expect(find.text('2:false'), findsOneWidget);
diff --git a/packages/flutter/test/widgets/obscured_animated_image_test.dart b/packages/flutter/test/widgets/obscured_animated_image_test.dart
index fac8fdc..1af690a 100644
--- a/packages/flutter/test/widgets/obscured_animated_image_test.dart
+++ b/packages/flutter/test/widgets/obscured_animated_image_test.dart
@@ -13,7 +13,7 @@
 import '../painting/fake_image_provider.dart';
 import '../painting/image_data.dart';
 
-Future<Null> main() async {
+Future<void> main() async {
   final FakeCodec fakeCodec = await FakeCodec.fromData(Uint8List.fromList(kAnimatedGif));
   final FakeImageProvider fakeImageProvider = FakeImageProvider(fakeCodec);
 
diff --git a/packages/flutter/test/widgets/overscroll_indicator_test.dart b/packages/flutter/test/widgets/overscroll_indicator_test.dart
index ba60a9c..0857b6e 100644
--- a/packages/flutter/test/widgets/overscroll_indicator_test.dart
+++ b/packages/flutter/test/widgets/overscroll_indicator_test.dart
@@ -12,7 +12,7 @@
 
 final Matcher doesNotOverscroll = isNot(paints..circle());
 
-Future<Null> slowDrag(WidgetTester tester, Offset start, Offset offset) async {
+Future<void> slowDrag(WidgetTester tester, Offset start, Offset offset) async {
   final TestGesture gesture = await tester.startGesture(start);
   for (int index = 0; index < 10; index += 1) {
     await gesture.moveBy(offset);
diff --git a/packages/flutter/test/widgets/page_forward_transitions_test.dart b/packages/flutter/test/widgets/page_forward_transitions_test.dart
index 89a8590..91d0d01 100644
--- a/packages/flutter/test/widgets/page_forward_transitions_test.dart
+++ b/packages/flutter/test/widgets/page_forward_transitions_test.dart
@@ -81,7 +81,7 @@
         onGenerateRoute: (RouteSettings settings) {
           switch (settings.name) {
             case '/':
-              return TestRoute<Null>(
+              return TestRoute<void>(
                 settings: settings,
                 child: Builder(
                   key: insideKey,
@@ -104,9 +104,9 @@
                   }
                 )
               );
-            case '/2': return TestRoute<Null>(settings: settings, child: const Text('E'));
-            case '/3': return TestRoute<Null>(settings: settings, child: const Text('F'));
-            case '/4': return TestRoute<Null>(settings: settings, child: const Text('G'));
+            case '/2': return TestRoute<void>(settings: settings, child: const Text('E'));
+            case '/3': return TestRoute<void>(settings: settings, child: const Text('F'));
+            case '/4': return TestRoute<void>(settings: settings, child: const Text('G'));
           }
           return null;
         }
@@ -190,8 +190,8 @@
       MaterialApp(
         onGenerateRoute: (RouteSettings settings) {
           switch (settings.name) {
-            case '/': return TestRoute<Null>(settings: settings, child: const Text('A'));
-            case '/1': return TestRoute<Null>(settings: settings, barrierColor: const Color(0xFFFFFF00), child: const Text('B'));
+            case '/': return TestRoute<void>(settings: settings, child: const Text('A'));
+            case '/1': return TestRoute<void>(settings: settings, barrierColor: const Color(0xFFFFFF00), child: const Text('B'));
           }
           return null;
         }
diff --git a/packages/flutter/test/widgets/page_transitions_test.dart b/packages/flutter/test/widgets/page_transitions_test.dart
index 23abe76..a910bd9 100644
--- a/packages/flutter/test/widgets/page_transitions_test.dart
+++ b/packages/flutter/test/widgets/page_transitions_test.dart
@@ -27,7 +27,7 @@
   bool setStateCalled = false;
 
   void showBottomSheet() {
-    _scaffoldKey.currentState.showBottomSheet<Null>((BuildContext context) {
+    _scaffoldKey.currentState.showBottomSheet<void>((BuildContext context) {
       return const Text('bottomSheet');
     })
     .closed.whenComplete(() {
diff --git a/packages/flutter/test/widgets/pageable_list_test.dart b/packages/flutter/test/widgets/pageable_list_test.dart
index 79f2dda..c966b5b 100644
--- a/packages/flutter/test/widgets/pageable_list_test.dart
+++ b/packages/flutter/test/widgets/pageable_list_test.dart
@@ -45,7 +45,7 @@
   );
 }
 
-Future<Null> page(WidgetTester tester, Offset offset) {
+Future<void> page(WidgetTester tester, Offset offset) {
   return TestAsyncUtils.guard(() async {
     final String itemText = currentPage != null ? currentPage.toString() : '0';
     await tester.drag(find.text(itemText), offset);
@@ -53,11 +53,11 @@
   });
 }
 
-Future<Null> pageLeft(WidgetTester tester) {
+Future<void> pageLeft(WidgetTester tester) {
   return page(tester, Offset(-pageSize.width, 0.0));
 }
 
-Future<Null> pageRight(WidgetTester tester) {
+Future<void> pageRight(WidgetTester tester) {
   return page(tester, Offset(pageSize.width, 0.0));
 }
 
diff --git a/packages/flutter/test/widgets/positioned_test.dart b/packages/flutter/test/widgets/positioned_test.dart
index a73dfa9..371a828 100644
--- a/packages/flutter/test/widgets/positioned_test.dart
+++ b/packages/flutter/test/widgets/positioned_test.dart
@@ -104,7 +104,7 @@
       ),
     ); // t=0
     recordMetrics();
-    final Completer<Null> completer = Completer<Null>();
+    final Completer<void> completer = Completer<void>();
     controller.forward().whenComplete(completer.complete);
     expect(completer.isCompleted, isFalse);
     await tester.pump(); // t=0 again
diff --git a/packages/flutter/test/widgets/remember_scroll_position_test.dart b/packages/flutter/test/widgets/remember_scroll_position_test.dart
index 8796a1d..36c0aaf 100644
--- a/packages/flutter/test/widgets/remember_scroll_position_test.dart
+++ b/packages/flutter/test/widgets/remember_scroll_position_test.dart
@@ -28,7 +28,7 @@
   }
 }
 
-Future<Null> performTest(WidgetTester tester, bool maintainState) async {
+Future<void> performTest(WidgetTester tester, bool maintainState) async {
   final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
   await tester.pumpWidget(
     Directionality(
diff --git a/packages/flutter/test/widgets/routes_test.dart b/packages/flutter/test/widgets/routes_test.dart
index c28c10d..14d3e11 100644
--- a/packages/flutter/test/widgets/routes_test.dart
+++ b/packages/flutter/test/widgets/routes_test.dart
@@ -89,7 +89,7 @@
 
 }
 
-Future<Null> runNavigatorTest(
+Future<void> runNavigatorTest(
   WidgetTester tester,
   NavigatorState host,
   VoidCallback test,
diff --git a/packages/flutter/test/widgets/rtl_test.dart b/packages/flutter/test/widgets/rtl_test.dart
index b967761..6cdcb5c 100644
--- a/packages/flutter/test/widgets/rtl_test.dart
+++ b/packages/flutter/test/widgets/rtl_test.dart
@@ -24,20 +24,20 @@
 
     await tester.pumpWidget(
       const Padding(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         padding: EdgeInsets.only(left: 1.0),
       ),
     );
     await tester.pumpWidget(const Directionality(
       textDirection: TextDirection.rtl,
       child: Padding(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         padding: EdgeInsetsDirectional.only(start: 1.0),
       ),
     ));
     await tester.pumpWidget(
       const Padding(
-        key: GlobalObjectKey<Null>(null),
+        key: GlobalObjectKey<State<StatefulWidget>>(null),
         padding: EdgeInsets.only(left: 1.0),
       ),
     );
diff --git a/packages/flutter/test/widgets/scroll_events_test.dart b/packages/flutter/test/widgets/scroll_events_test.dart
index 83ba680..5f5bf67 100644
--- a/packages/flutter/test/widgets/scroll_events_test.dart
+++ b/packages/flutter/test/widgets/scroll_events_test.dart
@@ -27,8 +27,8 @@
 }
 
 void main() {
-  Completer<Null> animateTo(WidgetTester tester, double newScrollOffset, { @required Duration duration }) {
-    final Completer<Null> completer = Completer<Null>();
+  Completer<void> animateTo(WidgetTester tester, double newScrollOffset, { @required Duration duration }) {
+    final Completer<void> completer = Completer<void>();
     final ScrollableState scrollable = tester.state(find.byType(Scrollable));
     scrollable.position.animateTo(newScrollOffset, duration: duration, curve: Curves.linear).whenComplete(completer.complete);
     return completer;
@@ -63,7 +63,7 @@
     await tester.pumpWidget(_buildScroller(log: log));
 
     expect(log, equals(<String>[]));
-    final Completer<Null> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
+    final Completer<void> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
     expect(completer.isCompleted, isFalse);
     expect(log, equals(<String>['scroll-start']));
     await tester.pump(const Duration(milliseconds: 100));
@@ -91,7 +91,7 @@
     await tester.pumpWidget(_buildScroller(log: log));
 
     expect(log, equals(<String>[]));
-    final Completer<Null> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
+    final Completer<void> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
     expect(completer.isCompleted, isFalse);
     expect(log, equals(<String>['scroll-start']));
     await tester.pump(const Duration(milliseconds: 100));
@@ -116,7 +116,7 @@
     await tester.pumpWidget(_buildScroller(log: log));
 
     expect(log, equals(<String>[]));
-    Completer<Null> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
+    Completer<void> completer = animateTo(tester, 100.0, duration: const Duration(seconds: 1));
     expect(completer.isCompleted, isFalse);
     expect(log, equals(<String>['scroll-start']));
     await tester.pump(const Duration(milliseconds: 100));
diff --git a/packages/flutter/test/widgets/scrollable_fling_test.dart b/packages/flutter/test/widgets/scrollable_fling_test.dart
index e35bab8..2dd30a0 100644
--- a/packages/flutter/test/widgets/scrollable_fling_test.dart
+++ b/packages/flutter/test/widgets/scrollable_fling_test.dart
@@ -10,7 +10,7 @@
   fontFamily: 'Ahem',
 );
 
-Future<Null> pumpTest(WidgetTester tester, TargetPlatform platform) async {
+Future<void> pumpTest(WidgetTester tester, TargetPlatform platform) async {
   await tester.pumpWidget(Container());
   await tester.pumpWidget(MaterialApp(
     theme: ThemeData(
@@ -25,7 +25,6 @@
       ),
     ),
   ));
-  return null;
 }
 
 const double dragOffset = 213.82;
diff --git a/packages/flutter/test/widgets/scrollable_semantics_test.dart b/packages/flutter/test/widgets/scrollable_semantics_test.dart
index b1892b6..2dcf7e6 100644
--- a/packages/flutter/test/widgets/scrollable_semantics_test.dart
+++ b/packages/flutter/test/widgets/scrollable_semantics_test.dart
@@ -600,15 +600,15 @@
 
 }
 
-Future<Null> flingUp(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(0.0, -200.0), repetitions);
+Future<void> flingUp(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(0.0, -200.0), repetitions);
 
-Future<Null> flingDown(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(0.0, 200.0), repetitions);
+Future<void> flingDown(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(0.0, 200.0), repetitions);
 
-Future<Null> flingRight(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(200.0, 0.0), repetitions);
+Future<void> flingRight(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(200.0, 0.0), repetitions);
 
-Future<Null> flingLeft(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(-200.0, 0.0), repetitions);
+Future<void> flingLeft(WidgetTester tester, { int repetitions = 1 }) => fling(tester, const Offset(-200.0, 0.0), repetitions);
 
-Future<Null> fling(WidgetTester tester, Offset offset, int repetitions) async {
+Future<void> fling(WidgetTester tester, Offset offset, int repetitions) async {
   while (repetitions-- > 0) {
     await tester.fling(find.byType(ListView), offset, 1000.0);
     await tester.pump();
diff --git a/packages/flutter/test/widgets/scrollable_test.dart b/packages/flutter/test/widgets/scrollable_test.dart
index 7370a29..36fce7c 100644
--- a/packages/flutter/test/widgets/scrollable_test.dart
+++ b/packages/flutter/test/widgets/scrollable_test.dart
@@ -6,7 +6,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/rendering.dart';
 
-Future<Null> pumpTest(WidgetTester tester, TargetPlatform platform) async {
+Future<void> pumpTest(WidgetTester tester, TargetPlatform platform) async {
   await tester.pumpWidget(MaterialApp(
     theme: ThemeData(
       platform: platform,
@@ -18,7 +18,6 @@
     ),
   ));
   await tester.pump(const Duration(seconds: 5)); // to let the theme animate
-  return null;
 }
 
 const double dragOffset = 200.0;
diff --git a/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart b/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
index 730d830..1620274 100644
--- a/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
+++ b/packages/flutter/test/widgets/semantics_tester_generateTestSemanticsExpressionForCurrentSemanticsTree_test.dart
@@ -22,7 +22,7 @@
     debugResetSemanticsIdCounter();
   });
 
-  Future<Null> pumpTestWidget(WidgetTester tester) async {
+  Future<void> pumpTestWidget(WidgetTester tester) async {
     await tester.pumpWidget(MaterialApp(
       home: ListView(
         children: <Widget>[
diff --git a/packages/flutter/test/widgets/semantics_traversal_test.dart b/packages/flutter/test/widgets/semantics_traversal_test.dart
index 5a6801c..0c19849 100644
--- a/packages/flutter/test/widgets/semantics_traversal_test.dart
+++ b/packages/flutter/test/widgets/semantics_traversal_test.dart
@@ -14,7 +14,7 @@
 
 import 'semantics_tester.dart';
 
-typedef TraversalTestFunction = Future<Null> Function(TraversalTester tester);
+typedef TraversalTestFunction = Future<void> Function(TraversalTester tester);
 const Size tenByTen = Size(10.0, 10.0);
 
 void main() {
@@ -287,7 +287,7 @@
   final WidgetTester tester;
   final SemanticsTester semantics;
 
-  Future<Null> test({
+  Future<void> test({
     TextDirection textDirection,
     Map<String, Rect> children,
     String expectedTraversal,
diff --git a/packages/flutter/test/widgets/shape_decoration_test.dart b/packages/flutter/test/widgets/shape_decoration_test.dart
index 08dc3a1..1e34c96 100644
--- a/packages/flutter/test/widgets/shape_decoration_test.dart
+++ b/packages/flutter/test/widgets/shape_decoration_test.dart
@@ -12,7 +12,7 @@
 import '../painting/mocks_for_image_cache.dart';
 import '../rendering/mock_canvas.dart';
 
-Future<Null> main() async {
+Future<void> main() async {
   final ui.Image rawImage = await decodeImageFromList(Uint8List.fromList(kTransparentImage));
   final ImageProvider image = TestImageProvider(0, 0, image: rawImage);
   testWidgets('ShapeDecoration.image', (WidgetTester tester) async {
diff --git a/packages/flutter/test/widgets/table_test.dart b/packages/flutter/test/widgets/table_test.dart
index 3a55541..62d3fb7 100644
--- a/packages/flutter/test/widgets/table_test.dart
+++ b/packages/flutter/test/widgets/table_test.dart
@@ -28,7 +28,7 @@
     );
   });
   testWidgets('Table widget - control test', (WidgetTester tester) async {
-    Future<Null> run(TextDirection textDirection) async {
+    Future<void> run(TextDirection textDirection) async {
       await tester.pumpWidget(
         Directionality(
           textDirection: textDirection,
@@ -208,7 +208,7 @@
   });
 
   testWidgets('Table border - smoke test', (WidgetTester tester) async {
-    Future<Null> run(TextDirection textDirection) async {
+    Future<void> run(TextDirection textDirection) async {
       await tester.pumpWidget(
         Directionality(
           textDirection: textDirection,
diff --git a/packages/flutter/test/widgets/widget_inspector_test.dart b/packages/flutter/test/widgets/widget_inspector_test.dart
index e695a16..1f48538 100644
--- a/packages/flutter/test/widgets/widget_inspector_test.dart
+++ b/packages/flutter/test/widgets/widget_inspector_test.dart
@@ -121,9 +121,8 @@
   int rebuildCount = 0;
 
   @override
-  Future<Null> forceRebuild() async {
+  Future<void> forceRebuild() async {
     rebuildCount++;
-    return null;
   }
 
 
diff --git a/packages/flutter_driver/lib/src/common/fuchsia_compat.dart b/packages/flutter_driver/lib/src/common/fuchsia_compat.dart
index 37a3b1b..f84cb5a 100644
--- a/packages/flutter_driver/lib/src/common/fuchsia_compat.dart
+++ b/packages/flutter_driver/lib/src/common/fuchsia_compat.dart
@@ -29,7 +29,7 @@
   int get remotePort => _remotePort;
 
   @override
-  Future<Null> stop() async {}
+  Future<void> stop() async {}
 }
 
 class _DummySshCommandRunner implements SshCommandRunner {
diff --git a/packages/flutter_driver/lib/src/driver/driver.dart b/packages/flutter_driver/lib/src/driver/driver.dart
index 75b3fc1..4037a1a 100644
--- a/packages/flutter_driver/lib/src/driver/driver.dart
+++ b/packages/flutter_driver/lib/src/driver/driver.dart
@@ -242,7 +242,7 @@
         isolate.pauseEvent is! VMPauseExceptionEvent &&
         isolate.pauseEvent is! VMPauseInterruptedEvent &&
         isolate.pauseEvent is! VMResumeEvent) {
-      await Future<Null>.delayed(_kShortTimeout ~/ 10);
+      await Future<void>.delayed(_kShortTimeout ~/ 10);
       isolate = await isolateRef.loadRunnable();
     }
 
@@ -288,7 +288,7 @@
     /// results in lost events.
     ///
     /// Details: https://github.com/dart-lang/vm_service_client/issues/17
-    Future<Null> enableIsolateStreams() async {
+    Future<void> enableIsolateStreams() async {
       await connection.peer.sendRequest('streamListen', <String, String>{
         'streamId': 'Isolate',
       });
@@ -427,30 +427,26 @@
   }
 
   /// Taps at the center of the widget located by [finder].
-  Future<Null> tap(SerializableFinder finder, {Duration timeout}) async {
+  Future<void> tap(SerializableFinder finder, {Duration timeout}) async {
     await _sendCommand(Tap(finder, timeout: timeout));
-    return null;
   }
 
   /// Waits until [finder] locates the target.
-  Future<Null> waitFor(SerializableFinder finder, {Duration timeout}) async {
+  Future<void> waitFor(SerializableFinder finder, {Duration timeout}) async {
     await _sendCommand(WaitFor(finder, timeout: timeout));
-    return null;
   }
 
   /// Waits until [finder] can no longer locate the target.
-  Future<Null> waitForAbsent(SerializableFinder finder, {Duration timeout}) async {
+  Future<void> waitForAbsent(SerializableFinder finder, {Duration timeout}) async {
     await _sendCommand(WaitForAbsent(finder, timeout: timeout));
-    return null;
   }
 
   /// Waits until there are no more transient callbacks in the queue.
   ///
   /// Use this method when you need to wait for the moment when the application
   /// becomes "stable", for example, prior to taking a [screenshot].
-  Future<Null> waitUntilNoTransientCallbacks({Duration timeout}) async {
+  Future<void> waitUntilNoTransientCallbacks({Duration timeout}) async {
     await _sendCommand(WaitUntilNoTransientCallbacks(timeout: timeout));
-    return null;
   }
 
   /// Tell the driver to perform a scrolling action.
@@ -466,8 +462,8 @@
   ///
   /// The move events are generated at a given [frequency] in Hz (or events per
   /// second). It defaults to 60Hz.
-  Future<Null> scroll(SerializableFinder finder, double dx, double dy, Duration duration, { int frequency = 60, Duration timeout }) async {
-    return await _sendCommand(Scroll(finder, dx, dy, duration, frequency, timeout: timeout)).then<Null>((Map<String, dynamic> _) => null);
+  Future<void> scroll(SerializableFinder finder, double dx, double dy, Duration duration, { int frequency = 60, Duration timeout }) async {
+    await _sendCommand(Scroll(finder, dx, dy, duration, frequency, timeout: timeout));
   }
 
   /// Scrolls the Scrollable ancestor of the widget located by [finder]
@@ -477,8 +473,8 @@
   /// that lazily creates its children, like [ListView] or [CustomScrollView],
   /// then this method may fail because [finder] doesn't actually exist.
   /// The [scrollUntilVisible] method can be used in this case.
-  Future<Null> scrollIntoView(SerializableFinder finder, { double alignment = 0.0, Duration timeout }) async {
-    return await _sendCommand(ScrollIntoView(finder, alignment: alignment, timeout: timeout)).then<Null>((Map<String, dynamic> _) => null);
+  Future<void> scrollIntoView(SerializableFinder finder, { double alignment = 0.0, Duration timeout }) async {
+    await _sendCommand(ScrollIntoView(finder, alignment: alignment, timeout: timeout));
   }
 
   /// Repeatedly [scroll] the widget located by [scrollable] by [dxScroll] and
@@ -503,7 +499,7 @@
   ///
   /// The [timeout] value should be long enough to accommodate as many scrolls
   /// as needed to bring an item into view. The default is 10 seconds.
-  Future<Null> scrollUntilVisible(SerializableFinder scrollable, SerializableFinder item, {
+  Future<void> scrollUntilVisible(SerializableFinder scrollable, SerializableFinder item, {
     double alignment = 0.0,
     double dxScroll = 0.0,
     double dyScroll = 0.0,
@@ -522,11 +518,11 @@
     // the chance to complete if the item is already onscreen; if not, scroll
     // repeatedly until we either find the item or time out.
     bool isVisible = false;
-    waitFor(item, timeout: timeout).then<void>((Null value) { isVisible = true; });
-    await Future<Null>.delayed(const Duration(milliseconds: 500));
+    waitFor(item, timeout: timeout).then<void>((_) { isVisible = true; });
+    await Future<void>.delayed(const Duration(milliseconds: 500));
     while (!isVisible) {
       await scroll(scrollable, dxScroll, dyScroll, const Duration(milliseconds: 100));
-      await Future<Null>.delayed(const Duration(milliseconds: 500));
+      await Future<void>.delayed(const Duration(milliseconds: 500));
     }
 
     return scrollIntoView(item, alignment: alignment);
@@ -569,7 +565,7 @@
   ///  await driver.waitFor(find.text('World!'));  // verify new text appears
   /// });
   /// ```
-  Future<Null> enterText(String text, { Duration timeout }) async {
+  Future<void> enterText(String text, { Duration timeout }) async {
     await _sendCommand(EnterText(text, timeout: timeout));
   }
 
@@ -586,7 +582,7 @@
   /// When enabled, the operating system's configured keyboard will not be
   /// invoked when the widget is focused, as the [SystemChannels.textInput]
   /// channel will be mocked out.
-  Future<Null> setTextEntryEmulation({ @required bool enabled, Duration timeout }) async {
+  Future<void> setTextEntryEmulation({ @required bool enabled, Duration timeout }) async {
     assert(enabled != null);
     await _sendCommand(SetTextEntryEmulation(enabled, timeout: timeout));
   }
@@ -661,7 +657,7 @@
     //       The two-second gap should be long enough for the GPU thread to
     //       finish rasterizing the frame, but not longer than necessary to keep
     //       driver tests as fast a possible.
-    await Future<Null>.delayed(const Duration(seconds: 2));
+    await Future<void>.delayed(const Duration(seconds: 2));
 
     final Map<String, dynamic> result = await _peer.sendRequest('_flutter.screenshot').timeout(timeout);
     return base64.decode(result['screenshot']);
@@ -692,7 +688,7 @@
   }
 
   /// Starts recording performance traces.
-  Future<Null> startTracing({
+  Future<void> startTracing({
     List<TimelineStream> streams = _defaultStreams,
     Duration timeout = _kShortTimeout,
   }) async {
@@ -701,7 +697,6 @@
       await _peer.sendRequest(_setVMTimelineFlagsMethodName, <String, String>{
         'recordedStreams': _timelineStreamsToString(streams)
       }).timeout(timeout);
-      return null;
     } catch (error, stackTrace) {
       throw DriverError(
         'Failed to start tracing due to remote error',
@@ -755,7 +750,7 @@
   }
 
   /// Clears all timeline events recorded up until now.
-  Future<Null> clearTimeline({ Duration timeout = _kShortTimeout }) async {
+  Future<void> clearTimeline({ Duration timeout = _kShortTimeout }) async {
     try {
       await _peer
           .sendRequest(_clearVMTimelineMethodName, <String, String>{})
@@ -799,7 +794,7 @@
   /// Closes the underlying connection to the VM service.
   ///
   /// Returns a [Future] that fires once the connection has been closed.
-  Future<Null> close() async {
+  Future<void> close() async {
     // Don't leak vm_service_client-specific objects, if any
     await _serviceClient.close();
     await _peer.close();
@@ -863,7 +858,7 @@
 
       if (timer.elapsed < _kLongTimeout * 2) {
         _log.info('Waiting for application to start');
-        await Future<Null>.delayed(_kPauseBetweenReconnectAttempts);
+        await Future<void>.delayed(_kPauseBetweenReconnectAttempts);
         return attemptConnection();
       } else {
         _log.critical(
diff --git a/packages/flutter_driver/lib/src/driver/timeline_summary.dart b/packages/flutter_driver/lib/src/driver/timeline_summary.dart
index 85322c2..5a4bd8d 100644
--- a/packages/flutter_driver/lib/src/driver/timeline_summary.dart
+++ b/packages/flutter_driver/lib/src/driver/timeline_summary.dart
@@ -107,7 +107,7 @@
   }
 
   /// Writes all of the recorded timeline data to a file.
-  Future<Null> writeTimelineToFile(
+  Future<void> writeTimelineToFile(
     String traceName, {
     String destinationDirectory,
     bool pretty = false,
@@ -119,7 +119,7 @@
   }
 
   /// Writes [summaryJson] to a file.
-  Future<Null> writeSummaryToFile(
+  Future<void> writeSummaryToFile(
     String traceName, {
     String destinationDirectory,
     bool pretty = false,
diff --git a/packages/flutter_driver/lib/src/extension/extension.dart b/packages/flutter_driver/lib/src/extension/extension.dart
index cc3f0a8..98afd4e 100644
--- a/packages/flutter_driver/lib/src/extension/extension.dart
+++ b/packages/flutter_driver/lib/src/extension/extension.dart
@@ -205,8 +205,8 @@
   }
 
   // Waits until at the end of a frame the provided [condition] is [true].
-  Future<Null> _waitUntilFrame(bool condition(), [Completer<Null> completer]) {
-    completer ??= Completer<Null>();
+  Future<void> _waitUntilFrame(bool condition(), [Completer<void> completer]) {
+    completer ??= Completer<void>();
     if (!condition()) {
       SchedulerBinding.instance.addPostFrameCallback((Duration timestamp) {
         _waitUntilFrame(condition, completer);
@@ -317,9 +317,10 @@
     return WaitForAbsentResult();
   }
 
-  Future<Null> _waitUntilNoTransientCallbacks(Command command) async {
+  Future<Result> _waitUntilNoTransientCallbacks(Command command) async {
     if (SchedulerBinding.instance.transientCallbackCount != 0)
       await _waitUntilFrame(() => SchedulerBinding.instance.transientCallbackCount == 0);
+    return null;
   }
 
   Future<GetSemanticsIdResult> _getSemanticsId(Command command) async {
@@ -350,11 +351,11 @@
 
     _prober.binding.hitTest(hitTest, startLocation);
     _prober.binding.dispatchEvent(pointer.down(startLocation), hitTest);
-    await Future<Null>.value(); // so that down and move don't happen in the same microtask
+    await Future<void>.value(); // so that down and move don't happen in the same microtask
     for (int moves = 0; moves < totalMoves; moves += 1) {
       currentLocation = currentLocation + delta;
       _prober.binding.dispatchEvent(pointer.move(currentLocation), hitTest);
-      await Future<Null>.delayed(pause);
+      await Future<void>.delayed(pause);
     }
     _prober.binding.dispatchEvent(pointer.up(), hitTest);
 
@@ -417,7 +418,7 @@
       _semantics = RendererBinding.instance.pipelineOwner.ensureSemantics();
       if (!semanticsWasEnabled) {
         // wait for the first frame where semantics is enabled.
-        final Completer<Null> completer = Completer<Null>();
+        final Completer<void> completer = Completer<void>();
         SchedulerBinding.instance.addPostFrameCallback((Duration d) {
           completer.complete();
         });
diff --git a/packages/flutter_driver/test/flutter_driver_test.dart b/packages/flutter_driver/test/flutter_driver_test.dart
index eed263a..fb0318ae 100644
--- a/packages/flutter_driver/test/flutter_driver_test.dart
+++ b/packages/flutter_driver/test/flutter_driver_test.dart
@@ -64,7 +64,7 @@
       when(mockIsolate.pauseEvent).thenReturn(MockVMPauseStartEvent());
       when(mockIsolate.resume()).thenAnswer((Invocation invocation) {
         connectionLog.add('resume');
-        return Future<Null>.value();
+        return Future<dynamic>.value(null);
       });
       when(mockIsolate.onExtensionAdded).thenAnswer((Invocation invocation) {
         connectionLog.add('onExtensionAdded');
@@ -79,7 +79,7 @@
 
     test('connects to isolate paused mid-flight', () async {
       when(mockIsolate.pauseEvent).thenReturn(MockVMPauseBreakpointEvent());
-      when(mockIsolate.resume()).thenAnswer((Invocation invocation) => Future<Null>.value());
+      when(mockIsolate.resume()).thenAnswer((Invocation invocation) => Future<dynamic>.value(null));
 
       final FlutterDriver driver = await FlutterDriver.connect(dartVmServiceUrl: '');
       expect(driver, isNotNull);
@@ -95,7 +95,7 @@
       when(mockIsolate.resume()).thenAnswer((Invocation invocation) {
         // This needs to be wrapped in a closure to not be considered uncaught
         // by package:test
-        return Future<Null>.error(rpc.RpcException(101, ''));
+        return Future<dynamic>.error(rpc.RpcException(101, ''));
       });
 
       final FlutterDriver driver = await FlutterDriver.connect(dartVmServiceUrl: '');
@@ -132,7 +132,7 @@
     });
 
     test('closes connection', () async {
-      when(mockClient.close()).thenAnswer((Invocation invocation) => Future<Null>.value());
+      when(mockClient.close()).thenAnswer((Invocation invocation) => Future<dynamic>.value(null));
       await driver.close();
     });
 
diff --git a/packages/flutter_driver/test/src/extension_test.dart b/packages/flutter_driver/test/src/extension_test.dart
index 10871b1..58979e3 100644
--- a/packages/flutter_driver/test/src/extension_test.dart
+++ b/packages/flutter_driver/test/src/extension_test.dart
@@ -24,7 +24,7 @@
 
     testWidgets('returns immediately when transient callback queue is empty', (WidgetTester tester) async {
       extension.call(WaitUntilNoTransientCallbacks().serialize())
-          .then<Null>(expectAsync1((Map<String, dynamic> r) {
+          .then<void>(expectAsync1((Map<String, dynamic> r) {
         result = r;
       }));
 
@@ -44,7 +44,7 @@
       });
 
       extension.call(WaitUntilNoTransientCallbacks().serialize())
-          .then<Null>(expectAsync1((Map<String, dynamic> r) {
+          .then<void>(expectAsync1((Map<String, dynamic> r) {
         result = r;
       }));
 
diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart
index eff3f82..7b88e08 100644
--- a/packages/flutter_test/lib/src/widget_tester.dart
+++ b/packages/flutter_test/lib/src/widget_tester.dart
@@ -300,7 +300,7 @@
         await binding.pump(duration, phase);
         count += 1;
       } while (binding.hasScheduledFrame);
-    }).then<int>((void _) => count);
+    }).then<int>((_) => count);
   }
 
   /// Runs a [callback] that performs real asynchronous work.
diff --git a/packages/flutter_test/test/widget_tester_test.dart b/packages/flutter_test/test/widget_tester_test.dart
index e37ef47..da81a08 100644
--- a/packages/flutter_test/test/widget_tester_test.dart
+++ b/packages/flutter_test/test/widget_tester_test.dart
@@ -23,23 +23,23 @@
     testWidgets('completes when matcher completes', (WidgetTester tester) async {
       final Completer<void> completer = Completer<void>();
       final Future<void> future = expectLater(null, FakeMatcher(completer));
-      String value;
-      future.then<void>((void _) {
-        value = '123';
+      String result;
+      future.then<void>((void value) {
+        result = '123';
       });
-      test_package.expect(value, isNull);
+      test_package.expect(result, isNull);
       completer.complete();
-      test_package.expect(value, isNull);
+      test_package.expect(result, isNull);
       await future;
       await tester.pump();
-      test_package.expect(value, '123');
+      test_package.expect(result, '123');
     });
 
     testWidgets('respects the skip flag', (WidgetTester tester) async {
       final Completer<void> completer = Completer<void>();
       final Future<void> future = expectLater(null, FakeMatcher(completer), skip: 'testing skip');
       bool completed = false;
-      future.then<void>((void _) {
+      future.then<void>((_) {
         completed = true;
       });
       test_package.expect(completed, isFalse);
@@ -625,7 +625,7 @@
 
   @override
   Future<String> matchAsync(dynamic object) {
-    return completer.future.then<String>((void _) {
+    return completer.future.then<String>((void value) {
       return object?.toString();
     });
   }
diff --git a/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart b/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart
index d40dcd6..9b63d59 100644
--- a/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart
+++ b/packages/flutter_tools/lib/src/commands/make_host_app_editable.dart
@@ -42,7 +42,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await _project.ensureReadyForPlatformSpecificTooling();
 
     final bool isAndroidRequested = argResults['android'];
@@ -58,5 +58,7 @@
     } else if (isIOSRequested) {
       await _project.ios.makeHostAppEditable();
     }
+
+    return null;
   }
 }