diff --git a/packages/flutter/test/cupertino/slider_test.dart b/packages/flutter/test/cupertino/slider_test.dart
index eae21e7..8959324 100644
--- a/packages/flutter/test/cupertino/slider_test.dart
+++ b/packages/flutter/test/cupertino/slider_test.dart
@@ -12,7 +12,7 @@
 
 void main() {
 
-  Future<Null> _dragSlider(WidgetTester tester, Key sliderKey) {
+  Future<void> _dragSlider(WidgetTester tester, Key sliderKey) {
     final Offset topLeft = tester.getTopLeft(find.byKey(sliderKey));
     const double unit = CupertinoThumbPainter.radius;
     const double delta = 3.0 * unit;
diff --git a/packages/flutter/test/material/chip_test.dart b/packages/flutter/test/material/chip_test.dart
index fa906fc..8870443 100644
--- a/packages/flutter/test/material/chip_test.dart
+++ b/packages/flutter/test/material/chip_test.dart
@@ -545,7 +545,7 @@
 
   testWidgets('Avatar drawer works as expected on RawChip', (WidgetTester tester) async {
     final GlobalKey labelKey = GlobalKey();
-    Future<Null> pushChip({Widget avatar}) async {
+    Future<void> pushChip({Widget avatar}) async {
       return tester.pumpWidget(
         _wrapForChip(
           child: Wrap(
@@ -659,7 +659,7 @@
     final UniqueKey labelKey = UniqueKey();
     final UniqueKey deleteButtonKey = UniqueKey();
     bool wasDeleted = false;
-    Future<Null> pushChip({bool deletable = false}) async {
+    Future<void> pushChip({bool deletable = false}) async {
       return tester.pumpWidget(
         _wrapForChip(
           child: Wrap(
@@ -774,7 +774,7 @@
   testWidgets('Selection with avatar works as expected on RawChip', (WidgetTester tester) async {
     bool selected = false;
     final UniqueKey labelKey = UniqueKey();
-    Future<Null> pushChip({Widget avatar, bool selectable = false}) async {
+    Future<void> pushChip({Widget avatar, bool selectable = false}) async {
       return tester.pumpWidget(
         _wrapForChip(
           child: Wrap(
@@ -857,7 +857,7 @@
   testWidgets('Selection without avatar works as expected on RawChip', (WidgetTester tester) async {
     bool selected = false;
     final UniqueKey labelKey = UniqueKey();
-    Future<Null> pushChip({bool selectable = false}) async {
+    Future<void> pushChip({bool selectable = false}) async {
       return tester.pumpWidget(
         _wrapForChip(
           child: Wrap(
@@ -933,7 +933,7 @@
   testWidgets('Activation works as expected on RawChip', (WidgetTester tester) async {
     bool selected = false;
     final UniqueKey labelKey = UniqueKey();
-    Future<Null> pushChip({Widget avatar, bool selectable = false}) async {
+    Future<void> pushChip({Widget avatar, bool selectable = false}) async {
       return tester.pumpWidget(
         _wrapForChip(
           child: Wrap(
diff --git a/packages/flutter/test/rendering/viewport_test.dart b/packages/flutter/test/rendering/viewport_test.dart
index c97bbe8..a181101 100644
--- a/packages/flutter/test/rendering/viewport_test.dart
+++ b/packages/flutter/test/rendering/viewport_test.dart
@@ -353,7 +353,7 @@
   group('Nested viewports (same orientation) showOnScreen', () {
     List<Widget> children;
 
-    Future<Null> buildNestedScroller({WidgetTester tester, ScrollController inner, ScrollController outer}) {
+    Future<void> buildNestedScroller({WidgetTester tester, ScrollController inner, ScrollController outer}) {
       return tester.pumpWidget(
         Directionality(
           textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/widgets/animated_switcher_test.dart b/packages/flutter/test/widgets/animated_switcher_test.dart
index ae5a806..78c2a45 100644
--- a/packages/flutter/test/widgets/animated_switcher_test.dart
+++ b/packages/flutter/test/widgets/animated_switcher_test.dart
@@ -346,7 +346,7 @@
   });
 
   testWidgets('AnimatedSwitcher updates widgets without animating if they are isomorphic.', (WidgetTester tester) async {
-    Future<Null> pumpChild(Widget child) async {
+    Future<void> pumpChild(Widget child) async {
       return tester.pumpWidget(
         Directionality(
           textDirection: TextDirection.rtl,
diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart
index 2dba2fe..31f7d7d 100644
--- a/packages/flutter/test/widgets/editable_text_test.dart
+++ b/packages/flutter/test/widgets/editable_text_test.dart
@@ -1444,7 +1444,7 @@
   });
 
   group('a11y copy/cut/paste', () {
-    Future<Null> _buildApp(
+    Future<void> _buildApp(
         MockTextSelectionControls controls, WidgetTester tester) {
       return tester.pumpWidget(MaterialApp(
         home: EditableText(
diff --git a/packages/flutter/test/widgets/gesture_detector_test.dart b/packages/flutter/test/widgets/gesture_detector_test.dart
index a0b7820..67a0652 100644
--- a/packages/flutter/test/widgets/gesture_detector_test.dart
+++ b/packages/flutter/test/widgets/gesture_detector_test.dart
@@ -126,7 +126,7 @@
     bool didReceivePointerDown;
     bool didTap;
 
-    Future<Null> pumpWidgetTree(HitTestBehavior behavior) {
+    Future<void> pumpWidgetTree(HitTestBehavior behavior) {
       return tester.pumpWidget(
         Directionality(
           textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/widgets/image_resolution_test.dart b/packages/flutter/test/widgets/image_resolution_test.dart
index 84f1950..40ee82f 100644
--- a/packages/flutter/test/widgets/image_resolution_test.dart
+++ b/packages/flutter/test/widgets/image_resolution_test.dart
@@ -156,7 +156,7 @@
   return tester.renderObject<RenderImage>(find.byKey(key)).image;
 }
 
-Future<Null> pumpTreeToLayout(WidgetTester tester, Widget widget) {
+Future<void> pumpTreeToLayout(WidgetTester tester, Widget widget) {
   const Duration pumpDuration = Duration(milliseconds: 0);
   const EnginePhase pumpPhase = EnginePhase.layout;
   return tester.pumpWidget(widget, pumpDuration, pumpPhase);
diff --git a/packages/flutter/test/widgets/single_child_scroll_view_test.dart b/packages/flutter/test/widgets/single_child_scroll_view_test.dart
index d974141..4026b6a 100644
--- a/packages/flutter/test/widgets/single_child_scroll_view_test.dart
+++ b/packages/flutter/test/widgets/single_child_scroll_view_test.dart
@@ -697,7 +697,7 @@
   group('Nested SingleChildScrollView (same orientation) showOnScreen', () {
     List<Widget> children;
 
-    Future<Null> buildNestedScroller({WidgetTester tester, ScrollController inner, ScrollController outer}) {
+    Future<void> buildNestedScroller({WidgetTester tester, ScrollController inner, ScrollController outer}) {
       return tester.pumpWidget(
         Directionality(
           textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/widgets/slivers_block_global_key_test.dart b/packages/flutter/test/widgets/slivers_block_global_key_test.dart
index 2aa787d..ebfc534 100644
--- a/packages/flutter/test/widgets/slivers_block_global_key_test.dart
+++ b/packages/flutter/test/widgets/slivers_block_global_key_test.dart
@@ -24,7 +24,7 @@
 
 // Creates a SliverList with `keys.length` children and each child having a key from `keys` and a text of `key:generation`.
 // The generation is increased with every call to this method.
-Future<Null> test(WidgetTester tester, double offset, List<int> keys) {
+Future<void> test(WidgetTester tester, double offset, List<int> keys) {
   globalGeneration += 1;
   return tester.pumpWidget(
     Directionality(
diff --git a/packages/flutter/test/widgets/slivers_block_test.dart b/packages/flutter/test/widgets/slivers_block_test.dart
index d433be9..147b25b 100644
--- a/packages/flutter/test/widgets/slivers_block_test.dart
+++ b/packages/flutter/test/widgets/slivers_block_test.dart
@@ -8,7 +8,7 @@
 
 import '../rendering/mock_canvas.dart';
 
-Future<Null> test(WidgetTester tester, double offset) {
+Future<void> test(WidgetTester tester, double offset) {
   return tester.pumpWidget(
     Directionality(
       textDirection: TextDirection.ltr,
diff --git a/packages/flutter/test/widgets/slivers_padding_test.dart b/packages/flutter/test/widgets/slivers_padding_test.dart
index 2316111..89ad950 100644
--- a/packages/flutter/test/widgets/slivers_padding_test.dart
+++ b/packages/flutter/test/widgets/slivers_padding_test.dart
@@ -6,7 +6,7 @@
 import 'package:flutter/rendering.dart';
 import 'package:flutter/widgets.dart';
 
-Future<Null> test(WidgetTester tester, double offset, EdgeInsetsGeometry padding, AxisDirection axisDirection, TextDirection textDirection) {
+Future<void> test(WidgetTester tester, double offset, EdgeInsetsGeometry padding, AxisDirection axisDirection, TextDirection textDirection) {
   return tester.pumpWidget(
     Directionality(
       textDirection: textDirection,
diff --git a/packages/flutter/test/widgets/slivers_test.dart b/packages/flutter/test/widgets/slivers_test.dart
index 9b39ac7..c25ee66 100644
--- a/packages/flutter/test/widgets/slivers_test.dart
+++ b/packages/flutter/test/widgets/slivers_test.dart
@@ -6,7 +6,7 @@
 import 'package:flutter/widgets.dart';
 import 'package:flutter/rendering.dart';
 
-Future<Null> test(WidgetTester tester, double offset, { double anchor = 0.0 }) {
+Future<void> test(WidgetTester tester, double offset, { double anchor = 0.0 }) {
   return tester.pumpWidget(
     Directionality(
       textDirection: TextDirection.ltr,
diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart
index 80c3fb8..b865b0b 100644
--- a/packages/flutter_test/lib/src/binding.dart
+++ b/packages/flutter_test/lib/src/binding.dart
@@ -197,7 +197,7 @@
   ///
   /// See also [LiveTestWidgetsFlutterBindingFramePolicy], which affects how
   /// this method works when the test is run with `flutter run`.
-  Future<Null> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]);
+  Future<void> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]);
 
   /// Runs a `callback` that performs real asynchronous work.
   ///
@@ -227,12 +227,11 @@
 
   /// Artificially calls dispatchLocaleChanged on the Widget binding,
   /// then flushes microtasks.
-  Future<Null> setLocale(String languageCode, String countryCode) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> setLocale(String languageCode, String countryCode) {
+    return TestAsyncUtils.guard<void>(() async {
       assert(inTest);
       final Locale locale = Locale(languageCode, countryCode);
       dispatchLocaleChanged(locale);
-      return null;
     });
   }
 
@@ -242,14 +241,13 @@
   /// then flushes microtasks.
   ///
   /// Set to null to use the default surface size.
-  Future<Null> setSurfaceSize(Size size) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> setSurfaceSize(Size size) {
+    return TestAsyncUtils.guard<void>(() async {
       assert(inTest);
       if (_surfaceSize == size)
-        return null;
+        return;
       _surfaceSize = size;
       handleMetricsChanged();
-      return null;
     });
   }
 
@@ -272,11 +270,11 @@
   /// May result in an infinite loop or run out of memory if microtasks continue
   /// to recursively schedule new microtasks. Will not run any timers scheduled
   /// after this method was invoked, even if they are zero-time timers.
-  Future<Null> idle() {
-    return TestAsyncUtils.guard<Null>(() {
-      final Completer<Null> completer = Completer<Null>();
+  Future<void> idle() {
+    return TestAsyncUtils.guard<void>(() {
+      final Completer<void> completer = Completer<void>();
       Timer.run(() {
-        completer.complete(null);
+        completer.complete();
       });
       return completer.future;
     });
@@ -386,7 +384,7 @@
   /// The `description` is used by the [LiveTestWidgetsFlutterBinding] to
   /// show a label on the screen during the test. The description comes from
   /// the value passed to [testWidgets]. It must not be null.
-  Future<Null> runTest(Future<Null> testBody(), VoidCallback invariantTester, { String description = '' });
+  Future<void> runTest(Future<void> testBody(), VoidCallback invariantTester, { String description = '' });
 
   /// This is called during test execution before and after the body has been
   /// executed.
@@ -399,7 +397,7 @@
 
   Zone _parentZone;
 
-  VoidCallback _createTestCompletionHandler(String testDescription, Completer<Null> completer) {
+  VoidCallback _createTestCompletionHandler(String testDescription, Completer<void> completer) {
     return () {
       // This can get called twice, in the case of a Future without listeners failing, and then
       // our main future completing.
@@ -410,7 +408,7 @@
         _pendingExceptionDetails = null;
       }
       if (!completer.isCompleted)
-        completer.complete(null);
+        completer.complete();
     };
   }
 
@@ -426,8 +424,8 @@
     // The LiveTestWidgetsFlutterBinding overrides this to report the exception to the console.
   }
 
-  Future<Null> _runTest(Future<Null> testBody(), VoidCallback invariantTester, String description, {
-    Future<Null> timeout,
+  Future<void> _runTest(Future<void> testBody(), VoidCallback invariantTester, String description, {
+    Future<void> timeout,
   }) {
     assert(description != null);
     assert(inTest);
@@ -452,7 +450,7 @@
         _pendingExceptionDetails = details;
       }
     };
-    final Completer<Null> testCompleter = Completer<Null>();
+    final Completer<void> testCompleter = Completer<void>();
     final VoidCallback testCompletionHandler = _createTestCompletionHandler(description, testCompleter);
     void handleUncaughtError(dynamic exception, StackTrace stack) {
       if (testCompleter.isCompleted) {
@@ -537,13 +535,13 @@
     );
     _parentZone = Zone.current;
     final Zone testZone = _parentZone.fork(specification: errorHandlingZoneSpecification);
-    testZone.runBinary<Future<Null>, Future<Null> Function(), VoidCallback>(_runTestBody, testBody, invariantTester)
+    testZone.runBinary<Future<void>, Future<void> Function(), VoidCallback>(_runTestBody, testBody, invariantTester)
       .whenComplete(testCompletionHandler);
     timeout?.catchError(handleUncaughtError);
     return testCompleter.future;
   }
 
-  Future<Null> _runTestBody(Future<Null> testBody(), VoidCallback invariantTester) async {
+  Future<void> _runTestBody(Future<void> testBody(), VoidCallback invariantTester) async {
     assert(inTest);
 
     runApp(Container(key: UniqueKey(), child: _preTestMessage)); // Reset the tree to a known state.
@@ -688,8 +686,8 @@
   int get microtaskCount => _currentFakeAsync.microtaskCount;
 
   @override
-  Future<Null> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]) {
-    return TestAsyncUtils.guard<Null>(() {
+  Future<void> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]) {
+    return TestAsyncUtils.guard<void>(() {
       assert(inTest);
       assert(_clock != null);
       if (duration != null)
@@ -705,7 +703,7 @@
         handleDrawFrame();
       }
       _currentFakeAsync.flushMicrotasks();
-      return Future<Null>.value();
+      return Future<void>.value();
     });
   }
 
@@ -774,8 +772,8 @@
   }
 
   @override
-  Future<Null> idle() {
-    final Future<Null> result = super.idle();
+  Future<void> idle() {
+    final Future<void> result = super.idle();
     _currentFakeAsync.elapse(const Duration());
     return result;
   }
@@ -816,7 +814,7 @@
   Duration _timeout;
   Stopwatch _timeoutStopwatch;
   Timer _timeoutTimer;
-  Completer<Null> _timeoutCompleter;
+  Completer<void> _timeoutCompleter;
 
   void _checkTimeout(Timer timer) {
     assert(_timeoutTimer == timer);
@@ -860,7 +858,7 @@
   }
 
   @override
-  Future<Null> runTest(Future<Null> testBody(), VoidCallback invariantTester, {
+  Future<void> runTest(Future<void> testBody(), VoidCallback invariantTester, {
     String description = '',
     Duration timeout = const Duration(seconds: 2),
   }) {
@@ -872,12 +870,12 @@
     _timeout = timeout;
     _timeoutStopwatch = Stopwatch()..start();
     _timeoutTimer = Timer.periodic(const Duration(seconds: 1), _checkTimeout);
-    _timeoutCompleter = Completer<Null>();
+    _timeoutCompleter = Completer<void>();
 
     final FakeAsync fakeAsync = FakeAsync();
     _currentFakeAsync = fakeAsync; // reset in postTest
     _clock = fakeAsync.getClock(DateTime.utc(2015, 1, 1));
-    Future<Null> testBodyResult;
+    Future<void> testBodyResult;
     fakeAsync.run((FakeAsync localFakeAsync) {
       assert(fakeAsync == _currentFakeAsync);
       assert(fakeAsync == localFakeAsync);
@@ -885,14 +883,14 @@
       assert(inTest);
     });
 
-    return Future<Null>.microtask(() async {
+    return Future<void>.microtask(() async {
       // testBodyResult is a Future that was created in the Zone of the
       // fakeAsync. This means that if we await it here, it will register a
       // microtask to handle the future _in the fake async zone_. We avoid this
       // by calling '.then' in the current zone. While flushing the microtasks
       // of the fake-zone below, the new future will be completed and can then
       // be used without fakeAsync.
-      final Future<Null> resultFuture = testBodyResult.then<Null>((_) {
+      final Future<void> resultFuture = testBodyResult.then<void>((_) {
         // Do nothing.
       });
 
@@ -1038,7 +1036,7 @@
   @override
   test_package.Timeout get defaultTestTimeout => test_package.Timeout.none;
 
-  Completer<Null> _pendingFrame;
+  Completer<void> _pendingFrame;
   bool _expectingFrame = false;
   bool _viewNeedsPaint = false;
   bool _runningAsyncTasks = false;
@@ -1192,12 +1190,12 @@
   }
 
   @override
-  Future<Null> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]) {
+  Future<void> pump([ Duration duration, EnginePhase newPhase = EnginePhase.sendSemanticsUpdate ]) {
     assert(newPhase == EnginePhase.sendSemanticsUpdate);
     assert(inTest);
     assert(!_expectingFrame);
     assert(_pendingFrame == null);
-    return TestAsyncUtils.guard<Null>(() {
+    return TestAsyncUtils.guard<void>(() {
       if (duration != null) {
         Timer(duration, () {
           _expectingFrame = true;
@@ -1207,7 +1205,7 @@
         _expectingFrame = true;
         scheduleFrame();
       }
-      _pendingFrame = Completer<Null>();
+      _pendingFrame = Completer<void>();
       return _pendingFrame.future;
     });
   }
@@ -1244,7 +1242,7 @@
   }
 
   @override
-  Future<Null> runTest(Future<Null> testBody(), VoidCallback invariantTester, { String description = '' }) async {
+  Future<void> runTest(Future<void> testBody(), VoidCallback invariantTester, { String description = '' }) async {
     assert(description != null);
     assert(!inTest);
     _inTest = true;
@@ -1587,8 +1585,8 @@
   void addError(Object error, [StackTrace stackTrace]) {}
 
   @override
-  Future<Null> addStream(Stream<List<int>> stream) {
-    return Future<Null>.value(null);
+  Future<void> addStream(Stream<List<int>> stream) {
+    return Future<void>.value();
   }
 
   @override
@@ -1606,8 +1604,8 @@
   Future<HttpClientResponse> get done => null;
 
   @override
-  Future<Null> flush() {
-    return Future<Null>.value(null);
+  Future<void> flush() {
+    return Future<void>.value();
   }
 
   @override
diff --git a/packages/flutter_test/lib/src/controller.dart b/packages/flutter_test/lib/src/controller.dart
index 0d70e84..7f7defc 100644
--- a/packages/flutter_test/lib/src/controller.dart
+++ b/packages/flutter_test/lib/src/controller.dart
@@ -256,16 +256,15 @@
   ///
   /// If the center of the widget is not exposed, this might send events to
   /// another object.
-  Future<Null> tap(Finder finder, { int pointer }) {
+  Future<void> tap(Finder finder, { int pointer }) {
     return tapAt(getCenter(finder), pointer: pointer);
   }
 
   /// Dispatch a pointer down / pointer up sequence at the given location.
-  Future<Null> tapAt(Offset location, { int pointer }) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> tapAt(Offset location, { int pointer }) {
+    return TestAsyncUtils.guard<void>(() async {
       final TestGesture gesture = await startGesture(location, pointer: pointer);
       await gesture.up();
-      return null;
     });
   }
 
@@ -286,18 +285,17 @@
   ///
   /// If the center of the widget is not exposed, this might send events to
   /// another object.
-  Future<Null> longPress(Finder finder, { int pointer }) {
+  Future<void> longPress(Finder finder, { int pointer }) {
     return longPressAt(getCenter(finder), pointer: pointer);
   }
 
   /// Dispatch a pointer down / pointer up sequence at the given location with
   /// a delay of [kLongPressTimeout] + [kPressTimeout] between the two events.
-  Future<Null> longPressAt(Offset location, { int pointer }) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> longPressAt(Offset location, { int pointer }) {
+    return TestAsyncUtils.guard<void>(() async {
       final TestGesture gesture = await startGesture(location, pointer: pointer);
       await pump(kLongPressTimeout + kPressTimeout);
       await gesture.up();
-      return null;
     });
   }
 
@@ -321,7 +319,7 @@
   /// opposite direction of the fling (e.g. dragging 200 pixels to the right,
   /// then fling to the left over 200 pixels, ending at the exact point that the
   /// drag started).
-  Future<Null> fling(Finder finder, Offset offset, double speed, {
+  Future<void> fling(Finder finder, Offset offset, double speed, {
     int pointer,
     Duration frameInterval = const Duration(milliseconds: 16),
     Offset initialOffset = Offset.zero,
@@ -363,7 +361,7 @@
   /// opposite direction of the fling (e.g. dragging 200 pixels to the right,
   /// then fling to the left over 200 pixels, ending at the exact point that the
   /// drag started).
-  Future<Null> flingFrom(Offset startLocation, Offset offset, double speed, {
+  Future<void> flingFrom(Offset startLocation, Offset offset, double speed, {
     int pointer,
     Duration frameInterval = const Duration(milliseconds: 16),
     Offset initialOffset = Offset.zero,
@@ -371,7 +369,7 @@
   }) {
     assert(offset.distance > 0.0);
     assert(speed > 0.0); // speed is pixels/second
-    return TestAsyncUtils.guard<Null>(() async {
+    return TestAsyncUtils.guard<void>(() async {
       final TestPointer testPointer = TestPointer(pointer ?? _getNextPointer());
       final HitTestResult result = hitTestOnBinding(startLocation);
       const int kMoveCount = 50; // Needs to be >= kHistorySize, see _LeastSquaresVelocityTrackerStrategy
@@ -394,7 +392,6 @@
         }
       }
       await sendEventToBinding(testPointer.up(timeStamp: Duration(milliseconds: timeStamp.round())), result);
-      return null;
     });
   }
 
@@ -407,7 +404,7 @@
   ///
   /// See also [SchedulerBinding.endOfFrame], which returns a future that could
   /// be appropriate to return in the implementation of this method.
-  Future<Null> pump(Duration duration);
+  Future<void> pump(Duration duration);
 
   /// Attempts to drag the given widget by the given offset, by
   /// starting a drag in the middle of the widget.
@@ -417,7 +414,7 @@
   ///
   /// If you want the drag to end with a speed so that the gesture recognition
   /// system identifies the gesture as a fling, consider using [fling] instead.
-  Future<Null> drag(Finder finder, Offset offset, { int pointer }) {
+  Future<void> drag(Finder finder, Offset offset, { int pointer }) {
     return dragFrom(getCenter(finder), offset, pointer: pointer);
   }
 
@@ -427,13 +424,12 @@
   /// If you want the drag to end with a speed so that the gesture recognition
   /// system identifies the gesture as a fling, consider using [flingFrom]
   /// instead.
-  Future<Null> dragFrom(Offset startLocation, Offset offset, { int pointer }) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> dragFrom(Offset startLocation, Offset offset, { int pointer }) {
+    return TestAsyncUtils.guard<void>(() async {
       final TestGesture gesture = await startGesture(startLocation, pointer: pointer);
       assert(gesture != null);
       await gesture.moveBy(offset);
       await gesture.up();
-      return null;
     });
   }
 
@@ -468,10 +464,9 @@
   }
 
   /// Forwards the given pointer event to the binding.
-  Future<Null> sendEventToBinding(PointerEvent event, HitTestResult result) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> sendEventToBinding(PointerEvent event, HitTestResult result) {
+    return TestAsyncUtils.guard<void>(() async {
       binding.dispatchEvent(event, result);
-      return null;
     });
   }
 
@@ -538,7 +533,7 @@
   LiveWidgetController(WidgetsBinding binding) : super(binding);
 
   @override
-  Future<Null> pump(Duration duration) async {
+  Future<void> pump(Duration duration) async {
     if (duration != null)
       await Future<void>.delayed(duration);
     binding.scheduleFrame();
diff --git a/packages/flutter_test/lib/src/matchers.dart b/packages/flutter_test/lib/src/matchers.dart
index dda8377..15428da 100644
--- a/packages/flutter_test/lib/src/matchers.dart
+++ b/packages/flutter_test/lib/src/matchers.dart
@@ -1506,7 +1506,7 @@
   }
 }
 
-class _RendersOnPhysicalShape extends _MatchRenderObject<RenderPhysicalShape, Null> {
+class _RendersOnPhysicalShape extends _MatchRenderObject<RenderPhysicalShape, RenderPhysicalModel> {
   const _RendersOnPhysicalShape({
     this.shape,
     this.elevation,
@@ -1607,7 +1607,7 @@
     description.add('clips with bounding rounded rectangle with borderRadius: $borderRadius');
 }
 
-class _ClipsWithShapeBorder extends _MatchRenderObject<RenderClipPath, Null> {
+class _ClipsWithShapeBorder extends _MatchRenderObject<RenderClipPath, RenderClipRRect> {
   const _ClipsWithShapeBorder({@required this.shape});
 
   final ShapeBorder shape;
diff --git a/packages/flutter_test/lib/src/test_pointer.dart b/packages/flutter_test/lib/src/test_pointer.dart
index 56f2096..dea176d 100644
--- a/packages/flutter_test/lib/src/test_pointer.dart
+++ b/packages/flutter_test/lib/src/test_pointer.dart
@@ -113,7 +113,7 @@
 
 /// Signature for a callback that can dispatch events and returns a future that
 /// completes when the event dispatch is complete.
-typedef EventDispatcher = Future<Null> Function(PointerEvent event, HitTestResult result);
+typedef EventDispatcher = Future<void> Function(PointerEvent event, HitTestResult result);
 
 /// Signature for callbacks that perform hit-testing at a given location.
 typedef HitTester = HitTestResult Function(Offset location);
@@ -142,7 +142,7 @@
     assert(hitTester != null);
     assert(dispatcher != null);
     TestGesture result;
-    return TestAsyncUtils.guard<Null>(() async {
+    return TestAsyncUtils.guard<void>(() async {
       // dispatch down event
       final HitTestResult hitTestResult = hitTester(downLocation);
       final TestPointer testPointer = TestPointer(pointer);
@@ -150,8 +150,7 @@
 
       // create a TestGesture
       result = TestGesture._(dispatcher, hitTestResult, testPointer);
-      return null;
-    }).then<TestGesture>((Null value) {
+    }).then<TestGesture>((void value) {
       return result;
     }, onError: (dynamic error, StackTrace stack) {
       return Future<TestGesture>.error(error, stack);
@@ -163,14 +162,14 @@
   final TestPointer _pointer;
 
   /// Send a move event moving the pointer by the given offset.
-  Future<Null> moveBy(Offset offset, { Duration timeStamp = Duration.zero }) {
+  Future<void> moveBy(Offset offset, { Duration timeStamp = Duration.zero }) {
     assert(_pointer._isDown);
     return moveTo(_pointer.location + offset, timeStamp: timeStamp);
   }
 
   /// Send a move event moving the pointer to the given location.
-  Future<Null> moveTo(Offset location, { Duration timeStamp = Duration.zero }) {
-    return TestAsyncUtils.guard<Null>(() {
+  Future<void> moveTo(Offset location, { Duration timeStamp = Duration.zero }) {
+    return TestAsyncUtils.guard<void>(() {
       assert(_pointer._isDown);
       return _dispatcher(_pointer.move(location, timeStamp: timeStamp), _result);
     });
@@ -179,12 +178,11 @@
   /// End the gesture by releasing the pointer.
   ///
   /// The object is no longer usable after this method has been called.
-  Future<Null> up() {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> up() {
+    return TestAsyncUtils.guard<void>(() async {
       assert(_pointer._isDown);
       await _dispatcher(_pointer.up(), _result);
       assert(!_pointer._isDown);
-      return null;
     });
   }
 
@@ -193,12 +191,11 @@
   /// for instance).
   ///
   /// The object is no longer usable after this method has been called.
-  Future<Null> cancel() {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> cancel() {
+    return TestAsyncUtils.guard<void>(() async {
       assert(_pointer._isDown);
       await _dispatcher(_pointer.cancel(), _result);
       assert(!_pointer._isDown);
-      return null;
     });
   }
 }
diff --git a/packages/flutter_test/lib/src/test_text_input.dart b/packages/flutter_test/lib/src/test_text_input.dart
index 851ea9a..c6c1dbc 100644
--- a/packages/flutter_test/lib/src/test_text_input.dart
+++ b/packages/flutter_test/lib/src/test_text_input.dart
@@ -127,7 +127,7 @@
   /// Simulates the user pressing one of the [TextInputAction] buttons.
   /// Does not check that the [TextInputAction] performed is an acceptable one
   /// based on the `inputAction` [setClientArgs].
-  Future<Null> receiveAction(TextInputAction action) async {
+  Future<void> receiveAction(TextInputAction action) async {
     return TestAsyncUtils.guard(() {
       // Not using the `expect` function because in the case of a FlutterDriver
       // test this code does not run in a package:test test zone.
@@ -135,7 +135,7 @@
         throw TestFailure('Tried to use TestTextInput with no keyboard attached. You must use WidgetTester.showKeyboard() first.');
       }
 
-      final Completer<Null> completer = Completer<Null>();
+      final Completer<void> completer = Completer<void>();
 
       BinaryMessages.handlePlatformMessage(
         SystemChannels.textInput.name,
diff --git a/packages/flutter_test/lib/src/widget_tester.dart b/packages/flutter_test/lib/src/widget_tester.dart
index bac856f..eff3f82 100644
--- a/packages/flutter_test/lib/src/widget_tester.dart
+++ b/packages/flutter_test/lib/src/widget_tester.dart
@@ -30,7 +30,7 @@
   isInstanceOf; // we have our own wrapper in matchers.dart
 
 /// Signature for callback to [testWidgets] and [benchmarkWidgets].
-typedef WidgetTesterCallback = Future<Null> Function(WidgetTester widgetTester);
+typedef WidgetTesterCallback = Future<void> Function(WidgetTester widgetTester);
 
 /// Runs the [callback] inside the Flutter test environment.
 ///
@@ -114,7 +114,7 @@
 ///       });
 ///       exit(0);
 ///     }
-Future<Null> benchmarkWidgets(WidgetTesterCallback callback) {
+Future<void> benchmarkWidgets(WidgetTesterCallback callback) {
   assert(() {
     print('┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓');
     print('┇ ⚠ THIS BENCHMARK IS BEING RUN WITH ASSERTS ENABLED ⚠  ┇');
@@ -136,7 +136,7 @@
   return binding.runTest(
     () => callback(tester),
     tester._endOfTestVerifications,
-  ) ?? Future<Null>.value();
+  ) ?? Future<void>.value();
 }
 
 /// Assert that `actual` matches `matcher`.
@@ -217,11 +217,11 @@
   ///
   /// See also [LiveTestWidgetsFlutterBindingFramePolicy], which affects how
   /// this method works when the test is run with `flutter run`.
-  Future<Null> pumpWidget(Widget widget, [
+  Future<void> pumpWidget(Widget widget, [
     Duration duration,
     EnginePhase phase = EnginePhase.sendSemanticsUpdate,
   ]) {
-    return TestAsyncUtils.guard<Null>(() {
+    return TestAsyncUtils.guard<void>(() {
       binding.attachRootWidget(widget);
       binding.scheduleFrame();
       return binding.pump(duration, phase);
@@ -240,11 +240,11 @@
   /// See also [LiveTestWidgetsFlutterBindingFramePolicy], which affects how
   /// this method works when the test is run with `flutter run`.
   @override
-  Future<Null> pump([
+  Future<void> pump([
     Duration duration,
     EnginePhase phase = EnginePhase.sendSemanticsUpdate,
   ]) {
-    return TestAsyncUtils.guard<Null>(() => binding.pump(duration, phase));
+    return TestAsyncUtils.guard<void>(() => binding.pump(duration, phase));
   }
 
   /// Repeatedly calls [pump] with the given `duration` until there are no
@@ -292,7 +292,7 @@
       return true;
     }());
     int count = 0;
-    return TestAsyncUtils.guard<Null>(() async {
+    return TestAsyncUtils.guard<void>(() async {
       final DateTime endTime = binding.clock.fromNowBy(timeout);
       do {
         if (binding.clock.now().isAfter(endTime))
@@ -300,7 +300,7 @@
         await binding.pump(duration, phase);
         count += 1;
       } while (binding.hasScheduledFrame);
-    }).then<int>((Null _) => count);
+    }).then<int>((void _) => count);
   }
 
   /// Runs a [callback] that performs real asynchronous work.
@@ -350,10 +350,9 @@
   }
 
   @override
-  Future<Null> sendEventToBinding(PointerEvent event, HitTestResult result) {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> sendEventToBinding(PointerEvent event, HitTestResult result) {
+    return TestAsyncUtils.guard<void>(() async {
       binding.dispatchEvent(event, result, source: TestBindingEventSource.test);
-      return null;
     });
   }
 
@@ -484,8 +483,8 @@
   ///
   /// Does not run timers. May result in an infinite loop or run out of memory
   /// if microtasks continue to recursively schedule new microtasks.
-  Future<Null> idle() {
-    return TestAsyncUtils.guard<Null>(() => binding.idle());
+  Future<void> idle() {
+    return TestAsyncUtils.guard<void>(() => binding.idle());
   }
 
   Set<Ticker> _tickers;
@@ -569,8 +568,8 @@
   ///
   /// Tests that just need to add text to widgets like [TextField]
   /// or [TextFormField] only need to call [enterText].
-  Future<Null> showKeyboard(Finder finder) async {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> showKeyboard(Finder finder) async {
+    return TestAsyncUtils.guard<void>(() async {
       final EditableTextState editable = state<EditableTextState>(
         find.descendant(
           of: finder,
@@ -592,8 +591,8 @@
   ///
   /// To just give [finder] the focus without entering any text,
   /// see [showKeyboard].
-  Future<Null> enterText(Finder finder, String text) async {
-    return TestAsyncUtils.guard<Null>(() async {
+  Future<void> enterText(Finder finder, String text) async {
+    return TestAsyncUtils.guard<void>(() async {
       await showKeyboard(finder);
       testTextInput.enterText(text);
       await idle();
diff --git a/packages/flutter_test/test/test_async_utils_test.dart b/packages/flutter_test/test/test_async_utils_test.dart
index 3c4f230..deffb3b 100644
--- a/packages/flutter_test/test/test_async_utils_test.dart
+++ b/packages/flutter_test/test/test_async_utils_test.dart
@@ -13,22 +13,22 @@
 // of this test is to see how we handle leaking APIs.
 
 class TestAPI {
-  Future<Null> testGuard1() {
-    return TestAsyncUtils.guard(() async { return null; });
+  Future<Object> testGuard1() {
+    return TestAsyncUtils.guard<Object>(() async { return null; });
   }
-  Future<Null> testGuard2() {
-    return TestAsyncUtils.guard(() async { return null; });
+  Future<Object> testGuard2() {
+    return TestAsyncUtils.guard<Object>(() async { return null; });
   }
 }
 
 class TestAPISubclass extends TestAPI {
-  Future<Null> testGuard3() {
-    return TestAsyncUtils.guard(() async { return null; });
+  Future<Object> testGuard3() {
+    return TestAsyncUtils.guard<Object>(() async { return null; });
   }
 }
 
-Future<Null> _guardedThrower() {
-  return TestAsyncUtils.guard(() async {
+Future<Object> _guardedThrower() {
+  return TestAsyncUtils.guard<Object>(() async {
     throw 'Hello';
   });
 }
@@ -36,7 +36,7 @@
 void main() {
   test('TestAsyncUtils - one class', () async {
     final TestAPI testAPI = TestAPI();
-    Future<Null> f1, f2;
+    Future<Object> f1, f2;
     f1 = testAPI.testGuard1();
     try {
       f2 = testAPI.testGuard2();
@@ -57,7 +57,7 @@
 
   test('TestAsyncUtils - two classes, all callers in superclass', () async {
     final TestAPI testAPI = TestAPISubclass();
-    Future<Null> f1, f2;
+    Future<Object> f1, f2;
     f1 = testAPI.testGuard1();
     try {
       f2 = testAPI.testGuard2();
@@ -78,7 +78,7 @@
 
   test('TestAsyncUtils - two classes, mixed callers', () async {
     final TestAPISubclass testAPI = TestAPISubclass();
-    Future<Null> f1, f2;
+    Future<Object> f1, f2;
     f1 = testAPI.testGuard1();
     try {
       f2 = testAPI.testGuard3();
@@ -99,7 +99,7 @@
 
   test('TestAsyncUtils - expect() catches pending async work', () async {
     final TestAPI testAPI = TestAPISubclass();
-    Future<Null> f1;
+    Future<Object> f1;
     f1 = testAPI.testGuard1();
     try {
       flutter_test.expect(0, 0);
@@ -119,7 +119,7 @@
   });
 
   testWidgets('TestAsyncUtils - expect() catches pending async work', (WidgetTester tester) async {
-    Future<Null> f1, f2;
+    Future<Object> f1, f2;
     try {
       f1 = tester.pump();
       f2 = tester.pump();
@@ -139,7 +139,7 @@
   });
 
   testWidgets('TestAsyncUtils - expect() catches pending async work', (WidgetTester tester) async {
-    Future<Null> f1;
+    Future<Object> f1;
     try {
       f1 = tester.pump();
       TestAsyncUtils.verifyAllScopesClosed();
@@ -155,7 +155,7 @@
   });
 
   testWidgets('TestAsyncUtils - expect() catches pending async work', (WidgetTester tester) async {
-    Future<Null> f1;
+    Future<Object> f1;
     try {
       f1 = tester.pump();
       TestAsyncUtils.verifyAllScopesClosed();
