apply lint prefer_void_to_null in packages/flutter_tools (#22686)

diff --git a/packages/flutter_tools/bin/fuchsia_asset_builder.dart b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
index c659f84..aa63d3d 100644
--- a/packages/flutter_tools/bin/fuchsia_asset_builder.dart
+++ b/packages/flutter_tools/bin/fuchsia_asset_builder.dart
@@ -30,20 +30,20 @@
   _kOptionComponentName,
 ];
 
-Future<Null> main(List<String> args) {
-  return runInContext<Null>(() => run(args), overrides: <Type, Generator>{
+Future<void> main(List<String> args) {
+  return runInContext<void>(() => run(args), overrides: <Type, Generator>{
     Usage: () => DisabledUsage(),
   });
 }
 
-Future<Null> writeFile(libfs.File outputFile, DevFSContent content) async {
+Future<void> writeFile(libfs.File outputFile, DevFSContent content) async {
   outputFile.createSync(recursive: true);
   final List<int> data = await content.contentsAsBytes();
   outputFile.writeAsBytesSync(data);
   return null;
 }
 
-Future<Null> run(List<String> args) async {
+Future<void> run(List<String> args) async {
   final ArgParser parser = ArgParser()
     ..addOption(_kOptionPackages, help: 'The .packages file')
     ..addOption(_kOptionAsset,
@@ -72,18 +72,18 @@
     exit(1);
   }
 
-  final List<Future<Null>> calls = <Future<Null>>[];
+  final List<Future<void>> calls = <Future<void>>[];
   assets.entries.forEach((String fileName, DevFSContent content) {
     final libfs.File outputFile = libfs.fs.file(libfs.fs.path.join(assetDir, fileName));
     calls.add(writeFile(outputFile, content));
   });
-  await Future.wait<Null>(calls);
+  await Future.wait<void>(calls);
 
   final String outputMan = argResults[_kOptionAssetManifestOut];
   await writeFuchsiaManifest(assets, argResults[_kOptionAsset], outputMan, argResults[_kOptionComponentName]);
 }
 
-Future<Null> writeFuchsiaManifest(AssetBundle assets, String outputBase, String fileDest, String componentName) async {
+Future<void> writeFuchsiaManifest(AssetBundle assets, String outputBase, String fileDest, String componentName) async {
 
   final libfs.File destFile = libfs.fs.file(fileDest);
   await destFile.create(recursive: true);
diff --git a/packages/flutter_tools/bin/fuchsia_tester.dart b/packages/flutter_tools/bin/fuchsia_tester.dart
index 8d97972..a5e0ee3 100644
--- a/packages/flutter_tools/bin/fuchsia_tester.dart
+++ b/packages/flutter_tools/bin/fuchsia_tester.dart
@@ -43,12 +43,12 @@
 const String _kOptionCoveragePath = 'coverage-path';
 
 void main(List<String> args) {
-  runInContext<Null>(() => run(args), overrides: <Type, Generator>{
+  runInContext<void>(() => run(args), overrides: <Type, Generator>{
     Usage: () => DisabledUsage(),
   });
 }
 
-Future<Null> run(List<String> args) async {
+Future<void> run(List<String> args) async {
   final ArgParser parser = ArgParser()
     ..addOption(_kOptionPackages, help: 'The .packages file')
     ..addOption(_kOptionShell, help: 'The Flutter shell binary')
diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart
index 61a38a7..6d62a5e 100644
--- a/packages/flutter_tools/lib/executable.dart
+++ b/packages/flutter_tools/lib/executable.dart
@@ -39,7 +39,7 @@
 /// Main entry point for commands.
 ///
 /// This function is intended to be used from the `flutter` command line tool.
-Future<Null> main(List<String> args) async {
+Future<void> main(List<String> args) async {
   final bool verbose = args.contains('-v') || args.contains('--verbose');
 
   final bool doctor = (args.isNotEmpty && args.first == 'doctor') ||
diff --git a/packages/flutter_tools/lib/runner.dart b/packages/flutter_tools/lib/runner.dart
index d727c70..963d801 100644
--- a/packages/flutter_tools/lib/runner.dart
+++ b/packages/flutter_tools/lib/runner.dart
@@ -211,7 +211,7 @@
   // Run shutdown hooks before flushing logs
   await runShutdownHooks();
 
-  final Completer<Null> completer = Completer<Null>();
+  final Completer<void> completer = Completer<void>();
 
   // Give the task / timer queue one cycle through before we hard exit.
   Timer.run(() {
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 497157f..ea70f44 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -676,7 +676,7 @@
         _timeOrigin = _adbTimestampToDateTime(lastTimestamp);
     else
         _timeOrigin = null;
-    runCommand(device.adbCommandForDevice(args)).then<Null>((Process process) {
+    runCommand(device.adbCommandForDevice(args)).then<void>((Process process) {
       _process = process;
       const Utf8Decoder decoder = Utf8Decoder(allowMalformed: true);
       _process.stdout.transform<String>(decoder).transform<String>(const LineSplitter()).listen(_onLine);
@@ -868,7 +868,7 @@
   }
 
   @override
-  Future<Null> unforward(ForwardedPort forwardedPort) async {
+  Future<void> unforward(ForwardedPort forwardedPort) async {
     await runCheckedAsync(device.adbCommandForDevice(
       <String>['forward', '--remove', 'tcp:${forwardedPort.hostPort}']
     ));
diff --git a/packages/flutter_tools/lib/src/android/apk.dart b/packages/flutter_tools/lib/src/android/apk.dart
index 43b73c1..5b30036 100644
--- a/packages/flutter_tools/lib/src/android/apk.dart
+++ b/packages/flutter_tools/lib/src/android/apk.dart
@@ -14,7 +14,7 @@
 import 'android_sdk.dart';
 import 'gradle.dart';
 
-Future<Null> buildApk({
+Future<void> buildApk({
   @required FlutterProject project,
   @required String target,
   BuildInfo buildInfo = BuildInfo.debug
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index b676afc..ab3a21a 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -272,7 +272,7 @@
   }
 }
 
-Future<Null> buildGradleProject({
+Future<void> buildGradleProject({
   @required FlutterProject project,
   @required BuildInfo buildInfo,
   @required String target,
@@ -301,7 +301,7 @@
   }
 }
 
-Future<Null> _buildGradleProjectV1(FlutterProject project, String gradle) async {
+Future<void> _buildGradleProjectV1(FlutterProject project, String gradle) async {
   // Run 'gradlew build'.
   final Status status = logger.startProgress(
     "Running 'gradlew build'...",
@@ -322,7 +322,7 @@
   printStatus('Built ${fs.path.relative(project.android.gradleAppOutV1File.path)}.');
 }
 
-Future<Null> _buildGradleProjectV2(
+Future<void> _buildGradleProjectV2(
     FlutterProject flutterProject,
     String gradle,
     BuildInfo buildInfo,
diff --git a/packages/flutter_tools/lib/src/base/net.dart b/packages/flutter_tools/lib/src/base/net.dart
index 94c724e..0a8270a 100644
--- a/packages/flutter_tools/lib/src/base/net.dart
+++ b/packages/flutter_tools/lib/src/base/net.dart
@@ -23,7 +23,7 @@
     if (result != null)
       return result;
     printStatus('Download failed -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
-    await Future<Null>.delayed(Duration(seconds: duration));
+    await Future<void>.delayed(Duration(seconds: duration));
     if (duration < 64)
       duration *= 2;
   }
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index 29029d4..c612e45 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -74,7 +74,7 @@
 /// hooks within a given stage will be started in parallel and will be
 /// guaranteed to run to completion before shutdown hooks in the next stage are
 /// started.
-Future<Null> runShutdownHooks() async {
+Future<void> runShutdownHooks() async {
   printTrace('Running shutdown hooks');
   _shutdownHooksRunning = true;
   try {
@@ -164,12 +164,12 @@
 
   // Wait for stdout to be fully processed
   // because process.exitCode may complete first causing flaky tests.
-  await waitGroup<Null>(<Future<Null>>[
-    stdoutSubscription.asFuture<Null>(),
-    stderrSubscription.asFuture<Null>(),
+  await waitGroup<void>(<Future<void>>[
+    stdoutSubscription.asFuture<void>(),
+    stderrSubscription.asFuture<void>(),
   ]);
 
-  await waitGroup<Null>(<Future<Null>>[
+  await waitGroup<void>(<Future<void>>[
     stdoutSubscription.cancel(),
     stderrSubscription.cancel(),
   ]);
@@ -203,9 +203,9 @@
   return await process.exitCode;
 }
 
-Future<Null> runAndKill(List<String> cmd, Duration timeout) {
+Future<void> runAndKill(List<String> cmd, Duration timeout) {
   final Future<Process> proc = runDetached(cmd);
-  return Future<Null>.delayed(timeout, () async {
+  return Future<void>.delayed(timeout, () async {
     printTrace('Intentionally killing ${cmd[0]}');
     processManager.killPid((await proc).pid);
   });
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart
index ee485de..e74fd49 100644
--- a/packages/flutter_tools/lib/src/base/utils.dart
+++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -251,14 +251,14 @@
 
 Clock get clock => context[Clock];
 
-typedef AsyncCallback = Future<Null> Function();
+typedef AsyncCallback = Future<void> Function();
 
 /// A [Timer] inspired class that:
 ///   - has a different initial value for the first callback delay
 ///   - waits for a callback to be complete before it starts the next timer
 class Poller {
   Poller(this.callback, this.pollingInterval, { this.initialDelay = Duration.zero }) {
-    Future<Null>.delayed(initialDelay, _handleCallback);
+    Future<void>.delayed(initialDelay, _handleCallback);
   }
 
   final AsyncCallback callback;
@@ -268,7 +268,7 @@
   bool _cancelled = false;
   Timer _timer;
 
-  Future<Null> _handleCallback() async {
+  Future<void> _handleCallback() async {
     if (_cancelled)
       return;
 
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index 8ab311c..4010e15 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -70,7 +70,7 @@
   /// Normally the lock will be held until the process exits (this uses normal
   /// POSIX flock semantics). Long-lived commands should release the lock by
   /// calling [Cache.releaseLockEarly] once they are no longer touching the cache.
-  static Future<Null> lock() async {
+  static Future<void> lock() async {
     if (!_lockEnabled)
       return null;
     assert(_lock == null);
@@ -87,7 +87,7 @@
           printStatus('Waiting for another flutter command to release the startup lock...');
           printed = true;
         }
-        await Future<Null>.delayed(const Duration(milliseconds: 50));
+        await Future<void>.delayed(const Duration(milliseconds: 50));
       }
     }
   }
@@ -199,7 +199,7 @@
     return cachedFile.path;
   }
 
-  Future<Null> updateAll() async {
+  Future<void> updateAll() async {
     if (!_lockEnabled)
       return null;
     try {
@@ -245,7 +245,7 @@
     return isUpToDateInner();
   }
 
-  Future<Null> update() async {
+  Future<void> update() async {
     if (location.existsSync())
       location.deleteSync(recursive: true);
     location.createSync(recursive: true);
@@ -272,7 +272,7 @@
   bool isUpToDateInner() => true;
 
   /// Template method to perform artifact update.
-  Future<Null> updateInner();
+  Future<void> updateInner();
 
   String get _storageBaseUrl {
     final String overrideUrl = platform.environment['FLUTTER_STORAGE_BASE_URL'];
@@ -285,7 +285,7 @@
   Uri _toStorageUri(String path) => Uri.parse('$_storageBaseUrl/$path');
 
   /// Download an archive from the given [url] and unzip it to [location].
-  Future<Null> _downloadArchive(String message, Uri url, Directory location, bool verifier(File f), void extractor(File f, Directory d)) {
+  Future<void> _downloadArchive(String message, Uri url, Directory location, bool verifier(File f), void extractor(File f, Directory d)) {
     return _withDownloadFile('${flattenNameSubdirs(url)}', (File tempFile) async {
       if (!verifier(tempFile)) {
         final Status status = logger.startProgress(message, expectSlowOperation: true);
@@ -305,18 +305,18 @@
   }
 
   /// Download a zip archive from the given [url] and unzip it to [location].
-  Future<Null> _downloadZipArchive(String message, Uri url, Directory location) {
+  Future<void> _downloadZipArchive(String message, Uri url, Directory location) {
     return _downloadArchive(message, url, location, os.verifyZip, os.unzip);
   }
 
   /// Download a gzipped tarball from the given [url] and unpack it to [location].
-  Future<Null> _downloadZippedTarball(String message, Uri url, Directory location) {
+  Future<void> _downloadZippedTarball(String message, Uri url, Directory location) {
     return _downloadArchive(message, url, location, os.verifyGzip, os.unpack);
   }
 
   /// Create a temporary file and invoke [onTemporaryFile] with the file as
   /// argument, then add the temporary file to the [_downloadedFiles].
-  Future<Null> _withDownloadFile(String name, Future<Null> onTemporaryFile(File file)) async {
+  Future<void> _withDownloadFile(String name, Future<void> onTemporaryFile(File file)) async {
     final File tempFile = fs.file(fs.path.join(cache.getDownloadDir().path, name));
     _downloadedFiles.add(tempFile);
     await onTemporaryFile(tempFile);
@@ -340,7 +340,7 @@
   MaterialFonts(Cache cache): super('material_fonts', cache);
 
   @override
-  Future<Null> updateInner() {
+  Future<void> updateInner() {
     final Uri archiveUri = _toStorageUri(version);
     return _downloadZipArchive('Downloading Material fonts...', archiveUri, location);
   }
@@ -470,7 +470,7 @@
   }
 
   @override
-  Future<Null> updateInner() async {
+  Future<void> updateInner() async {
     final String url = '$_storageBaseUrl/flutter_infra/flutter/$version/';
 
     final Directory pkgDir = cache.getCacheDir('pkg');
@@ -521,9 +521,9 @@
   GradleWrapper(Cache cache): super('gradle_wrapper', cache);
 
   @override
-  Future<Null> updateInner() {
+  Future<void> updateInner() {
     final Uri archiveUri = _toStorageUri(version);
-    return _downloadZippedTarball('Downloading Gradle Wrapper...', archiveUri, location).then<Null>((_) {
+    return _downloadZippedTarball('Downloading Gradle Wrapper...', archiveUri, location).then<void>((_) {
       // Delete property file, allowing templates to provide it.
       fs.file(fs.path.join(location.path, 'gradle', 'wrapper', 'gradle-wrapper.properties')).deleteSync();
       // Remove NOTICE file. Should not be part of the template.
@@ -565,7 +565,7 @@
 }
 
 /// Download a file from the given [url] and write it to [location].
-Future<Null> _downloadFile(Uri url, File location) async {
+Future<void> _downloadFile(Uri url, File location) async {
   _ensureExists(location.parent);
   final List<int> fileBytes = await fetchUrl(url);
   location.writeAsBytesSync(fileBytes, flush: true);
diff --git a/packages/flutter_tools/lib/src/commands/analyze.dart b/packages/flutter_tools/lib/src/commands/analyze.dart
index 1da4c74..ddb18d3 100644
--- a/packages/flutter_tools/lib/src/commands/analyze.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze.dart
@@ -80,20 +80,22 @@
   }
 
   @override
-  Future<Null> runCommand() {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults['watch']) {
-      return AnalyzeContinuously(
+      await AnalyzeContinuously(
         argResults,
         runner.getRepoRoots(),
         runner.getRepoPackages(),
       ).analyze();
+      return null;
     } else {
-      return AnalyzeOnce(
+      await AnalyzeOnce(
         argResults,
         runner.getRepoRoots(),
         runner.getRepoPackages(),
         workingDirectory: workingDirectory,
       ).analyze();
+      return null;
     }
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index e10f96f..2e9acfb 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -21,7 +21,7 @@
   final ArgResults argResults;
 
   /// Called by [AnalyzeCommand] to start the analysis process.
-  Future<Null> analyze();
+  Future<void> analyze();
 
   void dumpErrors(Iterable<String> errors) {
     if (argResults['write'] != null) {
diff --git a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
index c326608..dda2ab8 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
@@ -33,7 +33,7 @@
   Status analysisStatus;
 
   @override
-  Future<Null> analyze() async {
+  Future<void> analyze() async {
     List<String> directories;
 
     if (argResults['flutter-repo']) {
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index 3d181ad..d7a13d0 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -33,7 +33,7 @@
   final Directory workingDirectory;
 
   @override
-  Future<Null> analyze() async {
+  Future<void> analyze() async {
     final String currentDirectory =
         (workingDirectory ?? fs.currentDirectory).path;
 
@@ -68,7 +68,7 @@
       throwToolExit('Nothing to analyze.', exitCode: 0);
 
     // analyze all
-    final Completer<Null> analysisCompleter = Completer<Null>();
+    final Completer<void> analysisCompleter = Completer<void>();
     final List<AnalysisError> errors = <AnalysisError>[];
 
     final String sdkPath = argResults['dart-sdk'] ?? sdk.dartSdkPath;
diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart
index bcd8b24..35e44ac 100644
--- a/packages/flutter_tools/lib/src/commands/attach.dart
+++ b/packages/flutter_tools/lib/src/commands/attach.dart
@@ -76,7 +76,7 @@
   }
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     await super.validateCommand();
     if (await findTargetDevice() == null)
       throwToolExit(null);
@@ -84,7 +84,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     Cache.releaseLockEarly();
 
     await _validateArguments();
@@ -152,6 +152,7 @@
       final List<ForwardedPort> ports = device.portForwarder.forwardedPorts.toList();
       ports.forEach(device.portForwarder.unforward);
     }
+    return null;
   }
 
   Future<void> _validateArguments() async {}
diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart
index eb5ab8e..cda6c43 100644
--- a/packages/flutter_tools/lib/src/commands/build.dart
+++ b/packages/flutter_tools/lib/src/commands/build.dart
@@ -32,7 +32,7 @@
   final String description = 'Flutter build commands.';
 
   @override
-  Future<Null> runCommand() async { }
+  Future<FlutterCommandResult> runCommand() async => null;
 }
 
 abstract class BuildSubCommand extends FlutterCommand {
@@ -42,7 +42,7 @@
 
   @override
   @mustCallSuper
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (isRunningOnBot) {
       final File dotPackages = fs.file('.packages');
       printStatus('Contents of .packages:');
@@ -58,5 +58,6 @@
       else
         printError('File not found: ${pubspecLock.absolute.path}');
     }
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_aot.dart b/packages/flutter_tools/lib/src/commands/build_aot.dart
index dc5a79f..fadfa6d 100644
--- a/packages/flutter_tools/lib/src/commands/build_aot.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aot.dart
@@ -56,7 +56,7 @@
   final String description = "Build an ahead-of-time compiled snapshot of your app's Dart code.";
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
 
     final String targetPlatform = argResults['target-platform'];
@@ -89,7 +89,7 @@
       );
       if (mainPath == null) {
         throwToolExit('Compiler terminated unexpectedly.');
-        return;
+        return null;
       }
 
       // Build AOT snapshot.
@@ -152,7 +152,7 @@
       // Catch the String exceptions thrown from the `runCheckedSync` methods below.
       status?.cancel();
       printError(error);
-      return;
+      return null;
     }
     status?.stop();
 
@@ -165,5 +165,6 @@
     } else {
       printStatus(builtMessage);
     }
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart
index c5794b7..cc2b4b6 100644
--- a/packages/flutter_tools/lib/src/commands/build_apk.dart
+++ b/packages/flutter_tools/lib/src/commands/build_apk.dart
@@ -6,6 +6,7 @@
 
 import '../android/apk.dart';
 import '../project.dart';
+import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'build.dart';
 
 class BuildApkCommand extends BuildSubCommand {
@@ -38,12 +39,13 @@
     'suitable for deploying to app stores.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
     await buildApk(
       project: await FlutterProject.current(),
       target: targetFile,
       buildInfo: getBuildInfo(),
     );
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart
index c46d6b5..ef82cf9 100644
--- a/packages/flutter_tools/lib/src/commands/build_bundle.dart
+++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart
@@ -7,7 +7,7 @@
 import '../base/common.dart';
 import '../build_info.dart';
 import '../bundle.dart';
-import '../runner/flutter_command.dart' show FlutterOptions;
+import '../runner/flutter_command.dart' show FlutterOptions, FlutterCommandResult;
 import 'build.dart';
 
 class BuildBundleCommand extends BuildSubCommand {
@@ -78,7 +78,7 @@
       ' iOS runtimes.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
 
     final String targetPlatform = argResults['target-platform'];
@@ -108,5 +108,6 @@
       fileSystemScheme: argResults['filesystem-scheme'],
       fileSystemRoots: argResults['filesystem-root'],
     );
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_flx.dart b/packages/flutter_tools/lib/src/commands/build_flx.dart
index c6b1bee..33e6946 100644
--- a/packages/flutter_tools/lib/src/commands/build_flx.dart
+++ b/packages/flutter_tools/lib/src/commands/build_flx.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import '../globals.dart';
+import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'build.dart';
 
 class BuildFlxCommand extends BuildSubCommand {
@@ -18,11 +19,13 @@
   final String usageFooter = 'FLX archives are deprecated.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
 
     printError("'build flx' is no longer supported. Instead, use 'build "
                "bundle' to build and assemble the application code and resources "
                'for your app.');
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart
index b586dfd..e34c5eb 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios.dart
@@ -10,6 +10,7 @@
 import '../build_info.dart';
 import '../globals.dart';
 import '../ios/mac.dart';
+import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'build.dart';
 
 class BuildIOSCommand extends BuildSubCommand {
@@ -48,7 +49,7 @@
   final String description = 'Build an iOS application bundle (Mac OS X host only).';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final bool forSimulator = argResults['simulator'];
     defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release;
 
@@ -90,5 +91,7 @@
 
     if (result.output != null)
       printStatus('Built ${result.output}.');
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/channel.dart b/packages/flutter_tools/lib/src/commands/channel.dart
index 499fee1..0c21979 100644
--- a/packages/flutter_tools/lib/src/commands/channel.dart
+++ b/packages/flutter_tools/lib/src/commands/channel.dart
@@ -32,18 +32,20 @@
   String get invocation => '${runner.executableName} $name [<channel-name>]';
 
   @override
-  Future<Null> runCommand() {
+  Future<FlutterCommandResult> runCommand() async {
     switch (argResults.rest.length) {
       case 0:
-        return _listChannels(showAll: argResults['all']);
+        await _listChannels(showAll: argResults['all']);
+        return null;
       case 1:
-        return _switchChannel(argResults.rest[0]);
+        await _switchChannel(argResults.rest[0]);
+        return null;
       default:
         throw ToolExit('Too many arguments.\n$usage');
     }
   }
 
-  Future<Null> _listChannels({ bool showAll }) async {
+  Future<void> _listChannels({ bool showAll }) async {
     // Beware: currentBranch could contain PII. See getBranchName().
     final String currentChannel = FlutterVersion.instance.channel;
     final String currentBranch = FlutterVersion.instance.getBranchName();
@@ -76,7 +78,7 @@
       throwToolExit('List channels failed: $result', exitCode: result);
   }
 
-  Future<Null> _switchChannel(String branchName) {
+  Future<void> _switchChannel(String branchName) {
     printStatus("Switching to flutter channel '$branchName'...");
     if (FlutterVersion.obsoleteBranches.containsKey(branchName)) {
       final String alternative = FlutterVersion.obsoleteBranches[branchName];
@@ -87,7 +89,7 @@
     return _checkout(branchName);
   }
 
-  static Future<Null> upgradeChannel() async {
+  static Future<void> upgradeChannel() async {
     final String channel = FlutterVersion.instance.channel;
     if (FlutterVersion.obsoleteBranches.containsKey(channel)) {
       final String alternative = FlutterVersion.obsoleteBranches[channel];
@@ -96,7 +98,7 @@
     }
   }
 
-  static Future<Null> _checkout(String branchName) async {
+  static Future<void> _checkout(String branchName) async {
     // Get latest refs from upstream.
     int result = await runCommandAndStreamOutput(
       <String>['git', 'fetch'],
diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart
index f2e65a3..740f108 100644
--- a/packages/flutter_tools/lib/src/commands/clean.dart
+++ b/packages/flutter_tools/lib/src/commands/clean.dart
@@ -22,17 +22,19 @@
   final String description = 'Delete the build/ directory.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final Directory buildDir = fs.directory(getBuildDirectory());
     printStatus("Deleting '${buildDir.path}${fs.path.separator}'.");
 
     if (!buildDir.existsSync())
-      return;
+      return null;
 
     try {
       buildDir.deleteSync(recursive: true);
     } catch (error) {
       throwToolExit(error.toString());
     }
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart
index 2d60e8a..8109f8d 100644
--- a/packages/flutter_tools/lib/src/commands/config.dart
+++ b/packages/flutter_tools/lib/src/commands/config.dart
@@ -62,9 +62,11 @@
   Future<String> get usagePath => null;
 
   @override
-  Future<Null> runCommand() async {
-    if (argResults['machine'])
-      return handleMachine();
+  Future<FlutterCommandResult> runCommand() async {
+    if (argResults['machine']) {
+      await handleMachine();
+      return null;
+    }
 
     if (argResults.wasParsed('analytics')) {
       final bool value = argResults['analytics'];
@@ -86,9 +88,11 @@
 
     if (argResults.arguments.isEmpty)
       printStatus(usage);
+
+    return null;
   }
 
-  Future<Null> handleMachine() async {
+  Future<void> handleMachine() async {
     // Get all the current values.
     final Map<String, dynamic> results = <String, dynamic>{};
     for (String key in config.keys) {
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 80cf399..27818f7 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -171,7 +171,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults.rest.isEmpty)
       throwToolExit('No option specified for the output directory.\n$usage', exitCode: 2);
 
@@ -334,6 +334,8 @@
         printStatus('Your application code is in $relativeAppMain');
       }
     }
+
+    return null;
   }
 
   Future<int> _generateApplication(Directory directory, Map<String, dynamic> templateContext) async {
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index de16efb..fe94ffd 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -50,14 +50,14 @@
   final bool hidden;
 
   @override
-  Future<Null> runCommand() {
+  Future<FlutterCommandResult> runCommand() async {
     printStatus('Starting device daemon...');
 
     final NotifyingLogger notifyingLogger = NotifyingLogger();
 
     Cache.releaseLockEarly();
 
-    return context.run<Null>(
+    await context.run<void>(
       body: () async {
         final Daemon daemon = Daemon(
             stdinCommandStream, stdoutCommandResponse,
@@ -71,6 +71,7 @@
         Logger: () => notifyingLogger,
       },
     );
+    return null;
   }
 }
 
@@ -295,9 +296,9 @@
     return Future<String>.value(protocolVersion);
   }
 
-  Future<Null> shutdown(Map<String, dynamic> args) {
+  Future<void> shutdown(Map<String, dynamic> args) {
     Timer.run(daemon.shutdown);
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   @override
@@ -413,7 +414,7 @@
       connectionInfoCompleter = Completer<DebugConnectionInfo>();
       // We don't want to wait for this future to complete and callbacks won't fail.
       // As it just writes to stdout.
-      connectionInfoCompleter.future.then<Null>((DebugConnectionInfo info) { // ignore: unawaited_futures
+      connectionInfoCompleter.future.then<void>((DebugConnectionInfo info) { // ignore: unawaited_futures
         final Map<String, dynamic> params = <String, dynamic>{
           'port': info.httpUri.port,
           'wsUri': info.wsUri.toString(),
@@ -435,7 +436,7 @@
       _sendAppEvent(app, 'started');
     });
 
-    await app._runInZone<Null>(this, () async {
+    await app._runInZone<void>(this, () async {
       try {
         await runOrAttach(
             connectionInfoCompleter: connectionInfoCompleter,
@@ -599,11 +600,11 @@
     discoverer.onRemoved.listen(_onDeviceEvent('device.removed'));
   }
 
-  Future<Null> _serializeDeviceEvents = Future<Null>.value();
+  Future<void> _serializeDeviceEvents = Future<void>.value();
 
   _DeviceEventHandler _onDeviceEvent(String eventName) {
     return (Device device) {
-      _serializeDeviceEvents = _serializeDeviceEvents.then<Null>((_) async {
+      _serializeDeviceEvents = _serializeDeviceEvents.then<void>((_) async {
         sendEvent(eventName, await _deviceToMap(device));
       });
     };
@@ -620,17 +621,17 @@
   }
 
   /// Enable device events.
-  Future<Null> enable(Map<String, dynamic> args) {
+  Future<void> enable(Map<String, dynamic> args) {
     for (PollingDeviceDiscovery discoverer in _discoverers)
       discoverer.startPolling();
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   /// Disable device events.
-  Future<Null> disable(Map<String, dynamic> args) {
+  Future<void> disable(Map<String, dynamic> args) {
     for (PollingDeviceDiscovery discoverer in _discoverers)
       discoverer.stopPolling();
-    return Future<Null>.value();
+    return Future<void>.value();
   }
 
   /// Forward a host port to a device port.
@@ -649,7 +650,7 @@
   }
 
   /// Removes a forwarded port.
-  Future<Null> unforward(Map<String, dynamic> args) async {
+  Future<void> unforward(Map<String, dynamic> args) async {
     final String deviceId = _getStringArg(args, 'deviceId', required: true);
     final int devicePort = _getIntArg(args, 'devicePort', required: true);
     final int hostPort = _getIntArg(args, 'hostPort', required: true);
@@ -798,8 +799,8 @@
     return runner.restart(fullRestart: fullRestart, pauseAfterRestart: pauseAfterRestart);
   }
 
-  Future<Null> stop() => runner.stop();
-  Future<Null> detach() => runner.detach();
+  Future<void> stop() => runner.stop();
+  Future<void> detach() => runner.detach();
 
   void closeLogger() {
     _logger.close();
@@ -832,7 +833,7 @@
     return list.map<Map<String, dynamic>>(_emulatorToMap).toList();
   }
 
-  Future<Null> launch(Map<String, dynamic> args) async {
+  Future<void> launch(Map<String, dynamic> args) async {
     final String emulatorId = _getStringArg(args, 'emulatorId', required: true);
     final List<Emulator> matches =
         await emulators.getEmulatorsMatching(emulatorId);
diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart
index 75241b4..0613a98 100644
--- a/packages/flutter_tools/lib/src/commands/devices.dart
+++ b/packages/flutter_tools/lib/src/commands/devices.dart
@@ -19,7 +19,7 @@
   final String description = 'List all connected devices.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (!doctor.canListAnything) {
       throwToolExit(
         "Unable to locate a development device; please run 'flutter doctor' for "
@@ -46,5 +46,7 @@
       printStatus('${devices.length} connected ${pluralize('device', devices.length)}:\n');
       await Device.printDevices(devices);
     }
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/drive.dart b/packages/flutter_tools/lib/src/commands/drive.dart
index dcccb09..88daf78 100644
--- a/packages/flutter_tools/lib/src/commands/drive.dart
+++ b/packages/flutter_tools/lib/src/commands/drive.dart
@@ -14,6 +14,7 @@
 import '../device.dart';
 import '../globals.dart';
 import '../resident_runner.dart';
+import '../runner/flutter_command.dart' show FlutterCommandResult;
 import 'run.dart';
 
 /// Runs integration (a.k.a. end-to-end) tests.
@@ -82,7 +83,7 @@
   StreamSubscription<String> _deviceLogSubscription;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final String testFile = _getTestFile();
     if (testFile == null)
       throwToolExit(null);
@@ -133,6 +134,8 @@
         await appStopper(this);
       }
     }
+
+    return null;
   }
 
   String _getTestFile() {
@@ -272,13 +275,13 @@
 }
 
 /// Runs driver tests.
-typedef TestRunner = Future<Null> Function(List<String> testArgs, String observatoryUri);
+typedef TestRunner = Future<void> Function(List<String> testArgs, String observatoryUri);
 TestRunner testRunner = _runTests;
 void restoreTestRunner() {
   testRunner = _runTests;
 }
 
-Future<Null> _runTests(List<String> testArgs, String observatoryUri) async {
+Future<void> _runTests(List<String> testArgs, String observatoryUri) async {
   printTrace('Running driver tests.');
 
   PackageMap.globalPackagesPath = fs.path.normalize(fs.path.absolute(PackageMap.globalPackagesPath));
diff --git a/packages/flutter_tools/lib/src/commands/emulators.dart b/packages/flutter_tools/lib/src/commands/emulators.dart
index e1ab0dd..4821519 100644
--- a/packages/flutter_tools/lib/src/commands/emulators.dart
+++ b/packages/flutter_tools/lib/src/commands/emulators.dart
@@ -33,7 +33,7 @@
   final List<String> aliases = <String>['emulator'];
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (doctor.workflows.every((Workflow w) => !w.canListEmulators)) {
       throwToolExit(
           'Unable to find any emulator sources. Please ensure you have some\n'
@@ -54,6 +54,8 @@
               : null;
       await _listEmulators(searchText);
     }
+
+    return null;
   }
 
   Future<void> _launchEmulator(String id) async {
@@ -81,7 +83,7 @@
     }
   }
 
-  Future<Null> _createEmulator({String name}) async {
+  Future<void> _createEmulator({String name}) async {
     final CreateEmulatorResult createResult =
         await emulatorManager.createEmulator(name: name);
 
diff --git a/packages/flutter_tools/lib/src/commands/format.dart b/packages/flutter_tools/lib/src/commands/format.dart
index 546f267..9d5d56e1 100644
--- a/packages/flutter_tools/lib/src/commands/format.dart
+++ b/packages/flutter_tools/lib/src/commands/format.dart
@@ -43,7 +43,7 @@
   String get invocation => '${runner.executableName} $name <one or more paths>';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults.rest.isEmpty) {
       throwToolExit(
         'No files specified to be formatted.\n'
@@ -77,5 +77,7 @@
     final int result = await runCommandAndStreamOutput(command);
     if (result != 0)
       throwToolExit('Formatting failed: $result', exitCode: result);
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
index 9bb14cf..827cae0 100644
--- a/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
+++ b/packages/flutter_tools/lib/src/commands/fuchsia_reload.dart
@@ -102,7 +102,7 @@
   bool _list;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     Cache.releaseLockEarly();
 
     await _validateArguments();
@@ -130,7 +130,7 @@
         // continue to work.
         printStatus('Press Enter to exit.');
         await stdin.first;
-        return;
+        return null;
       }
 
       // Check that there are running VM services on the returned
@@ -168,8 +168,10 @@
       printStatus('Connecting to $_modName');
       await hotRunner.attach(viewFilter: isolateName);
     } finally {
-      await Future.wait<Null>(forwardedPorts.map<Future<Null>>((_PortForwarder pf) => pf.stop()));
+      await Future.wait<void>(forwardedPorts.map<Future<void>>((_PortForwarder pf) => pf.stop()));
     }
+
+    return null;
   }
 
   // A cache of VMService connections.
@@ -286,7 +288,7 @@
       '${extraTabs}External: $external\n';
   }
 
-  Future<Null> _listVMs(List<int> ports) async {
+  Future<void> _listVMs(List<int> ports) async {
     for (int port in ports) {
       final VMService vmService = await _getVMService(port);
       await vmService.getVM();
@@ -295,7 +297,7 @@
     }
   }
 
-  Future<Null> _validateArguments() async {
+  Future<void> _validateArguments() async {
     final String fuchsiaBuildDir = argResults['build-dir'];
     final String gnTarget = argResults['gn-target'];
 
@@ -485,7 +487,7 @@
     return _PortForwarder._(address, remotePort, localPort, process, sshConfig);
   }
 
-  Future<Null> stop() async {
+  Future<void> stop() async {
     // Kill the original ssh process if it is still around.
     if (_process != null) {
       printTrace('_PortForwarder killing ${_process.pid} for port $_localPort');
diff --git a/packages/flutter_tools/lib/src/commands/ide_config.dart b/packages/flutter_tools/lib/src/commands/ide_config.dart
index 415555c..f153b3b 100644
--- a/packages/flutter_tools/lib/src/commands/ide_config.dart
+++ b/packages/flutter_tools/lib/src/commands/ide_config.dart
@@ -218,7 +218,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults.rest.isNotEmpty) {
       throwToolExit('Currently, the only supported IDE is IntelliJ\n$usage', exitCode: 2);
     }
@@ -227,7 +227,7 @@
 
     if (argResults['update-templates']) {
       _handleTemplateUpdate();
-      return;
+      return null;
     }
 
     final String flutterRoot = fs.path.absolute(Cache.flutterRoot);
@@ -250,6 +250,8 @@
     printStatus('');
     printStatus('Your IntelliJ configuration is now up to date. It is prudent to '
         'restart IntelliJ, if running.');
+
+    return null;
   }
 
   int _renderTemplate(String templateName, String dirPath, Map<String, dynamic> context) {
diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index 8c2ba4d..4acc452 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -24,7 +24,7 @@
   final bool hidden;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final FlutterProject project = await FlutterProject.current();
     refreshPluginsList(project);
     await injectPlugins(project);
@@ -34,5 +34,7 @@
     } else {
       printStatus('This project does not use plugins, no GeneratedPluginRegistrants have been created.');
     }
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/install.dart b/packages/flutter_tools/lib/src/commands/install.dart
index c2fcc58..ab43906 100644
--- a/packages/flutter_tools/lib/src/commands/install.dart
+++ b/packages/flutter_tools/lib/src/commands/install.dart
@@ -25,7 +25,7 @@
   Device device;
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     await super.validateCommand();
     device = await findTargetDevice();
     if (device == null)
@@ -33,7 +33,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final ApplicationPackage package = await applicationPackages.getPackageForPlatform(await device.targetPlatform);
 
     Cache.releaseLockEarly();
@@ -42,6 +42,8 @@
 
     if (!await installApp(device, package))
       throwToolExit('Install failed');
+
+    return null;
   }
 }
 
diff --git a/packages/flutter_tools/lib/src/commands/logs.dart b/packages/flutter_tools/lib/src/commands/logs.dart
index 56212ad..de8283f 100644
--- a/packages/flutter_tools/lib/src/commands/logs.dart
+++ b/packages/flutter_tools/lib/src/commands/logs.dart
@@ -37,7 +37,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults['clear'])
       device.clearLogs();
 
@@ -76,5 +76,7 @@
     await subscription.cancel();
     if (result != 0)
       throwToolExit('Error listening to $logReader logs.');
+
+    return null;
   }
 }
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 efd5aa9..9e51d68 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
@@ -24,7 +24,7 @@
   bool get hidden => true;
 
   @override
-  Future<Null> runCommand() async { }
+  Future<FlutterCommandResult> runCommand() async => null;
 }
 
 abstract class MakeHostAppEditableSubCommand extends FlutterCommand {
@@ -36,12 +36,13 @@
 
   @override
   @mustCallSuper
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await _project.ensureReadyForPlatformSpecificTooling();
+    return null;
   }
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     await super.validateCommand();
     _project = await FlutterProject.current();
     if (!_project.isApplication)
@@ -57,9 +58,11 @@
   String get description => 'Make an Android host app editable within a Flutter project';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
     await _project.android.makeHostAppEditable();
+
+    return null;
   }
 }
 
@@ -71,8 +74,10 @@
   String get description => 'Make an iOS host app editable within a Flutter project';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     await super.runCommand();
     await _project.ios.makeHostAppEditable();
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/packages.dart b/packages/flutter_tools/lib/src/commands/packages.dart
index e010a35..b7b748a 100644
--- a/packages/flutter_tools/lib/src/commands/packages.dart
+++ b/packages/flutter_tools/lib/src/commands/packages.dart
@@ -28,7 +28,7 @@
   final String description = 'Commands for managing Flutter packages.';
 
   @override
-  Future<Null> runCommand() async { }
+  Future<FlutterCommandResult> runCommand() async => null;
 }
 
 class PackagesGetCommand extends FlutterCommand {
@@ -65,7 +65,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults.rest.length > 1)
       throwToolExit('Too many arguments.\n$usage');
 
@@ -89,6 +89,8 @@
       await _runPubGet(exampleProject.directory.path);
       await exampleProject.ensureReadyForPlatformSpecificTooling();
     }
+
+    return null;
   }
 }
 
@@ -116,7 +118,10 @@
   }
 
   @override
-  Future<Null> runCommand() => pub(<String>['run', 'test']..addAll(argResults.rest), context: PubContext.runTest, retry: false);
+  Future<FlutterCommandResult> runCommand() async {
+    await pub(<String>['run', 'test']..addAll(argResults.rest), context: PubContext.runTest, retry: false);
+    return null;
+  }
 }
 
 class PackagesPassthroughCommand extends FlutterCommand {
@@ -139,5 +144,8 @@
   }
 
   @override
-  Future<Null> runCommand() => pubInteractively(argResults.rest);
+  Future<FlutterCommandResult> runCommand() async {
+    await pubInteractively(argResults.rest);
+    return null;
+  }
 }
diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart
index f2a15ab..b1fc4dc 100644
--- a/packages/flutter_tools/lib/src/commands/precache.dart
+++ b/packages/flutter_tools/lib/src/commands/precache.dart
@@ -23,7 +23,7 @@
   bool get shouldUpdateCache => false;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults['all-platforms'])
       cache.includeAllPlatforms = true;
 
@@ -31,5 +31,7 @@
       printStatus('Already up-to-date.');
     else
       await cache.updateAll();
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 40c3548..160cf29 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -237,7 +237,7 @@
   bool get stayResident => argResults['resident'];
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     // When running with a prebuilt application, no command validation is
     // necessary.
     if (!runningWithPrebuiltApplication)
diff --git a/packages/flutter_tools/lib/src/commands/screenshot.dart b/packages/flutter_tools/lib/src/commands/screenshot.dart
index be39b24..e6ae9ba 100644
--- a/packages/flutter_tools/lib/src/commands/screenshot.dart
+++ b/packages/flutter_tools/lib/src/commands/screenshot.dart
@@ -76,22 +76,27 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     File outputFile;
     if (argResults.wasParsed(_kOut))
       outputFile = fs.file(argResults[_kOut]);
 
     switch (argResults[_kType]) {
       case _kDeviceType:
-        return runScreenshot(outputFile);
+        await runScreenshot(outputFile);
+        return null;
       case _kSkiaType:
-        return runSkia(outputFile);
+        await runSkia(outputFile);
+        return null;
       case _kRasterizerType:
-        return runRasterizer(outputFile);
+        await runRasterizer(outputFile);
+        return null;
     }
+
+    return null;
   }
 
-  Future<Null> runScreenshot(File outputFile) async {
+  Future<void> runScreenshot(File outputFile) async {
     outputFile ??= getUniqueFile(fs.currentDirectory, 'flutter', 'png');
     try {
       await device.takeScreenshot(outputFile);
@@ -101,7 +106,7 @@
     await showOutputFileInfo(outputFile);
   }
 
-  Future<Null> runSkia(File outputFile) async {
+  Future<void> runSkia(File outputFile) async {
     final Map<String, dynamic> skp = await _invokeVmServiceRpc('_flutter.screenshotSkp');
     outputFile ??= getUniqueFile(fs.currentDirectory, 'flutter', 'skp');
     final IOSink sink = outputFile.openWrite();
@@ -138,7 +143,7 @@
     }
   }
 
-  Future<Null> showOutputFileInfo(File outputFile) async {
+  Future<void> showOutputFileInfo(File outputFile) async {
     final int sizeKB = (await outputFile.length()) ~/ 1024;
     printStatus('Screenshot written to ${fs.path.relative(outputFile.path)} (${sizeKB}kB).');
   }
diff --git a/packages/flutter_tools/lib/src/commands/shell_completion.dart b/packages/flutter_tools/lib/src/commands/shell_completion.dart
index 1d2ef16..0ef8ca5 100644
--- a/packages/flutter_tools/lib/src/commands/shell_completion.dart
+++ b/packages/flutter_tools/lib/src/commands/shell_completion.dart
@@ -42,14 +42,14 @@
   Future<String> get usagePath => null;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     if (argResults.rest.length > 1) {
       throwToolExit('Too many arguments given to bash-completion command.', exitCode: 1);
     }
 
     if (argResults.rest.isEmpty || argResults.rest.first == '-') {
       stdout.write(generateCompletionScript(<String>['flutter']));
-      return;
+      return null;
     }
 
     final File outputFile = fs.file(argResults.rest.first);
@@ -65,5 +65,7 @@
     } on FileSystemException catch (error) {
       throwToolExit('Unable to write shell completion setup script.\n$error', exitCode: 1);
     }
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/stop.dart b/packages/flutter_tools/lib/src/commands/stop.dart
index 089c13d..9b61df5 100644
--- a/packages/flutter_tools/lib/src/commands/stop.dart
+++ b/packages/flutter_tools/lib/src/commands/stop.dart
@@ -25,7 +25,7 @@
   Device device;
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     await super.validateCommand();
     device = await findTargetDevice();
     if (device == null)
@@ -33,7 +33,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final TargetPlatform targetPlatform = await device.targetPlatform;
     final ApplicationPackage app = await applicationPackages.getPackageForPlatform(targetPlatform);
     if (app == null) {
@@ -43,5 +43,7 @@
     printStatus('Stopping apps on ${device.name}.');
     if (!await device.stopApp(app))
       throwToolExit(null);
+
+    return null;
   }
 }
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index 4fc19e9..978b589 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -89,7 +89,7 @@
   String get description => 'Run Flutter unit tests for the current project.';
 
   @override
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     await super.validateCommand();
     if (!fs.isFileSync('pubspec.yaml')) {
       throwToolExit(
diff --git a/packages/flutter_tools/lib/src/commands/trace.dart b/packages/flutter_tools/lib/src/commands/trace.dart
index 0b5d44e..a714199 100644
--- a/packages/flutter_tools/lib/src/commands/trace.dart
+++ b/packages/flutter_tools/lib/src/commands/trace.dart
@@ -44,7 +44,7 @@
     'The --debug-port argument is required.';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     int observatoryPort;
     if (argResults.wasParsed('debug-port')) {
       observatoryPort = int.tryParse(argResults['debug-port']);
@@ -88,12 +88,14 @@
 
     if (start)
       await tracing.startTracing();
-    await Future<Null>.delayed(duration);
+    await Future<void>.delayed(duration);
     if (stop)
       await _stopTracing(tracing);
+
+    return null;
   }
 
-  Future<Null> _stopTracing(Tracing tracing) async {
+  Future<void> _stopTracing(Tracing tracing) async {
     final Map<String, dynamic> timeline = await tracing.stopTracingAndDownloadTimeline();
     File localFile;
 
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index c6e988a..6c5f69d 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -82,7 +82,7 @@
   @override
   final bool hidden;
 
-  Future<Null> _downloadCoverageData() async {
+  Future<void> _downloadCoverageData() async {
     final Status status = logger.startProgress(
       'Downloading lcov data for package:flutter...',
       expectSlowOperation: true,
@@ -100,7 +100,7 @@
   }
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     final List<Directory> packages = runner.getRepoPackages();
 
     final bool upgrade = argResults['force-upgrade'];
@@ -163,7 +163,7 @@
         );
       }
       printStatus('All pubspecs were up to date.');
-      return;
+      return null;
     }
 
     if (upgrade || isPrintPaths || isPrintTransitiveClosure) {
@@ -265,12 +265,12 @@
         tree._dependencyTree.forEach((String from, Set<String> to) {
           printStatus('$from -> $to');
         });
-        return;
+        return null;
       }
 
       if (isPrintPaths) {
         showDependencyPaths(from: argResults['from'], to: argResults['to'], tree: tree);
-        return;
+        return null;
       }
 
       // Now that we have collected all the data, we can apply our dependency
@@ -302,6 +302,8 @@
 
     final double seconds = timer.elapsedMilliseconds / 1000.0;
     printStatus('\nRan \'pub\' $count time${count == 1 ? "" : "s"} and fetched coverage data in ${seconds.toStringAsFixed(1)}s.');
+
+    return null;
   }
 
   void showDependencyPaths({
diff --git a/packages/flutter_tools/lib/src/commands/upgrade.dart b/packages/flutter_tools/lib/src/commands/upgrade.dart
index eefa606..f7240e0 100644
--- a/packages/flutter_tools/lib/src/commands/upgrade.dart
+++ b/packages/flutter_tools/lib/src/commands/upgrade.dart
@@ -28,7 +28,7 @@
   bool get shouldUpdateCache => false;
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     try {
       await runCheckedAsync(<String>[
         'git', 'rev-parse', '@{u}'
@@ -85,6 +85,8 @@
       workingDirectory: Cache.flutterRoot,
       allowReentrantFlutter: true,
     );
+
+    return null;
   }
 
   //  dev/benchmarks/complex_layout/lib/main.dart        |  24 +-
diff --git a/packages/flutter_tools/lib/src/crash_reporting.dart b/packages/flutter_tools/lib/src/crash_reporting.dart
index b353780..39a8cb3 100644
--- a/packages/flutter_tools/lib/src/crash_reporting.dart
+++ b/packages/flutter_tools/lib/src/crash_reporting.dart
@@ -80,7 +80,7 @@
   /// Sends one crash report.
   ///
   /// The report is populated from data in [error] and [stackTrace].
-  Future<Null> sendReport({
+  Future<void> sendReport({
     @required dynamic error,
     @required StackTrace stackTrace,
     @required String getFlutterVersion(),
diff --git a/packages/flutter_tools/lib/src/dart/analysis.dart b/packages/flutter_tools/lib/src/dart/analysis.dart
index 481e4cb..189c174 100644
--- a/packages/flutter_tools/lib/src/dart/analysis.dart
+++ b/packages/flutter_tools/lib/src/dart/analysis.dart
@@ -27,7 +27,7 @@
 
   int _id = 0;
 
-  Future<Null> start() async {
+  Future<void> start() async {
     final String snapshot =
         fs.path.join(sdkPath, 'bin/snapshots/analysis_server.dart.snapshot');
     final List<String> command = <String>[
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart
index b318302..062bc12 100644
--- a/packages/flutter_tools/lib/src/dart/pub.dart
+++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -69,7 +69,7 @@
 
 /// [context] provides extra information to package server requests to
 /// understand usage.
-Future<Null> pubGet({
+Future<void> pubGet({
   @required PubContext context,
   String directory,
   bool skipIfAbsent = false,
@@ -135,7 +135,7 @@
 ///
 /// [context] provides extra information to package server requests to
 /// understand usage.
-Future<Null> pub(List<String> arguments, {
+Future<void> pub(List<String> arguments, {
   @required PubContext context,
   String directory,
   MessageFilter filter,
@@ -161,7 +161,7 @@
     if (code != 69) // UNAVAILABLE in https://github.com/dart-lang/pub/blob/master/lib/src/exit_codes.dart
       break;
     printStatus('$failureMessage ($code) -- attempting retry $attempts in $duration second${ duration == 1 ? "" : "s"}...');
-    await Future<Null>.delayed(Duration(seconds: duration));
+    await Future<void>.delayed(Duration(seconds: duration));
     if (duration < 64)
       duration *= 2;
   }
@@ -173,7 +173,7 @@
 /// Runs pub in 'interactive' mode, directly piping the stdin stream of this
 /// process to that of pub, and the stdout/stderr stream of pub to the corresponding
 /// streams of this process.
-Future<Null> pubInteractively(List<String> arguments, {
+Future<void> pubInteractively(List<String> arguments, {
   String directory,
 }) async {
   Cache.releaseLockEarly();
diff --git a/packages/flutter_tools/lib/src/devfs.dart b/packages/flutter_tools/lib/src/devfs.dart
index 54b7107..1236186 100644
--- a/packages/flutter_tools/lib/src/devfs.dart
+++ b/packages/flutter_tools/lib/src/devfs.dart
@@ -264,13 +264,13 @@
 
   int _inFlight = 0;
   Map<Uri, DevFSContent> _outstanding;
-  Completer<Null> _completer;
+  Completer<void> _completer;
   HttpClient _client;
 
-  Future<Null> write(Map<Uri, DevFSContent> entries) async {
+  Future<void> write(Map<Uri, DevFSContent> entries) async {
     _client = HttpClient();
     _client.maxConnectionsPerHost = kMaxInFlight;
-    _completer = Completer<Null>();
+    _completer = Completer<void>();
     _outstanding = Map<Uri, DevFSContent>.from(entries);
     _scheduleWrites();
     await _completer.future;
@@ -290,7 +290,7 @@
     }
   }
 
-  Future<Null> _scheduleWrite(
+  Future<void> _scheduleWrite(
     Uri deviceUri,
     DevFSContent content, [
     int retry = 0,
@@ -304,7 +304,7 @@
       final Stream<List<int>> contents = content.contentsAsCompressedStream();
       await request.addStream(contents);
       final HttpClientResponse response = await request.close();
-      await response.drain<Null>();
+      await response.drain<void>();
     } on SocketException catch (socketException, stackTrace) {
       // We have one completer and can get up to kMaxInFlight errors.
       if (!_completer.isCompleted)
@@ -322,7 +322,7 @@
     }
     _inFlight--;
     if ((_outstanding.isEmpty) && (_inFlight == 0)) {
-      _completer.complete(null);
+      _completer.complete();
     } else {
       _scheduleWrites();
     }
@@ -392,7 +392,7 @@
     return _baseUri;
   }
 
-  Future<Null> destroy() async {
+  Future<void> destroy() async {
     printTrace('DevFS: Deleting filesystem on the device ($_baseUri)');
     await _operations.destroy(fsName);
     printTrace('DevFS: Deleted filesystem on the device ($_baseUri)');
@@ -701,7 +701,7 @@
     );
   }
 
-  Future<Null> _scanPackages(Set<String> fileFilter) async {
+  Future<void> _scanPackages(Set<String> fileFilter) async {
     StringBuffer sb;
     final PackageMap packageMap = PackageMap(_packagesFilePath);
 
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index 29f5c27..7704cea 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -275,7 +275,7 @@
 
   bool get supportsScreenshot => false;
 
-  Future<void> takeScreenshot(File outputFile) => Future<Null>.error('unimplemented');
+  Future<void> takeScreenshot(File outputFile) => Future<void>.error('unimplemented');
 
   @override
   int get hashCode => id.hashCode;
@@ -326,7 +326,7 @@
     }
   }
 
-  static Future<Null> printDevices(List<Device> devices) async {
+  static Future<void> printDevices(List<Device> devices) async {
     await descriptions(devices).forEach(printStatus);
   }
 }
@@ -405,7 +405,7 @@
   Future<int> forward(int devicePort, {int hostPort});
 
   /// Stops forwarding [forwardedPort].
-  Future<Null> unforward(ForwardedPort forwardedPort);
+  Future<void> unforward(ForwardedPort forwardedPort);
 }
 
 /// Read the log for a particular device.
diff --git a/packages/flutter_tools/lib/src/disabled_usage.dart b/packages/flutter_tools/lib/src/disabled_usage.dart
index a499070..8be5a96 100644
--- a/packages/flutter_tools/lib/src/disabled_usage.dart
+++ b/packages/flutter_tools/lib/src/disabled_usage.dart
@@ -41,7 +41,7 @@
   Stream<Map<String, dynamic>> get onSend => null;
 
   @override
-  Future<Null> ensureAnalyticsSent() => Future<Null>.value();
+  Future<void> ensureAnalyticsSent() => Future<void>.value();
 
   @override
   void printWelcome() { }
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index ca10b6e..f08c926 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -112,7 +112,7 @@
   }
 
   /// Print a summary of the state of the tooling, as well as how to get more info.
-  Future<Null> summary() async {
+  Future<void> summary() async {
     printStatus(await summaryText);
   }
 
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 7609979..2ce84d6 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -68,7 +68,7 @@
     bool applicationNeedsRebuild = false,
     bool usesTerminalUi = false,
     bool ipv6 = false,
-  }) => Future<Null>.error('unimplemented');
+  }) => Future<void>.error('unimplemented');
 
   @override
   Future<bool> stopApp(ApplicationPackage app) async {
diff --git a/packages/flutter_tools/lib/src/ios/cocoapods.dart b/packages/flutter_tools/lib/src/ios/cocoapods.dart
index 184a24c..26a903d 100644
--- a/packages/flutter_tools/lib/src/ios/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/ios/cocoapods.dart
@@ -219,7 +219,7 @@
         || podfileLockFile.readAsStringSync() != manifestLockFile.readAsStringSync();
   }
 
-  Future<Null> _runPodInstall(IosProject iosProject, String engineDirectory) async {
+  Future<void> _runPodInstall(IosProject iosProject, String engineDirectory) async {
     final Status status = logger.startProgress('Running pod install...', expectSlowOperation: true);
     final ProcessResult result = await processManager.run(
       <String>['pod', 'install', '--verbose'],
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index f567692..da6ee62 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -376,7 +376,7 @@
   bool get supportsScreenshot => iMobileDevice.isInstalled;
 
   @override
-  Future<Null> takeScreenshot(File outputFile) async {
+  Future<void> takeScreenshot(File outputFile) async {
     await iMobileDevice.takeScreenshot(outputFile);
   }
 }
@@ -475,7 +475,7 @@
   String get name => device.name;
 
   void _start() {
-    iMobileDevice.startLogger().then<Null>((Process process) {
+    iMobileDevice.startLogger().then<void>((Process process) {
       _process = process;
       _process.stdout.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_newLineHandler());
       _process.stderr.transform<String>(utf8.decoder).transform<String>(const LineSplitter()).listen(_newLineHandler());
@@ -576,7 +576,7 @@
   }
 
   @override
-  Future<Null> unforward(ForwardedPort forwardedPort) async {
+  Future<void> unforward(ForwardedPort forwardedPort) async {
     if (!_forwardedPorts.remove(forwardedPort)) {
       // Not in list. Nothing to remove.
       return null;
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index ffaa515..ea367fb 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -530,7 +530,7 @@
   return generatedXcconfigFile.readAsStringSync();
 }
 
-Future<Null> diagnoseXcodeBuildFailure(XcodeBuildResult result) async {
+Future<void> diagnoseXcodeBuildFailure(XcodeBuildResult result) async {
   if (result.xcodeBuildExecution != null &&
       result.xcodeBuildExecution.buildForPhysicalDevice &&
       result.stdout?.contains('BCEROR') == true &&
@@ -625,7 +625,7 @@
   return true;
 }
 
-Future<Null> _addServicesToBundle(Directory bundle) async {
+Future<void> _addServicesToBundle(Directory bundle) async {
   final List<Map<String, String>> services = <Map<String, String>>[];
   printTrace('Trying to resolve native pub services.');
 
@@ -644,7 +644,7 @@
   _copyServiceDefinitionsManifest(services, manifestFile);
 }
 
-Future<Null> _copyServiceFrameworks(List<Map<String, String>> services, Directory frameworksDirectory) async {
+Future<void> _copyServiceFrameworks(List<Map<String, String>> services, Directory frameworksDirectory) async {
   printTrace("Copying service frameworks to '${fs.path.absolute(frameworksDirectory.path)}'.");
   frameworksDirectory.createSync(recursive: true);
   for (Map<String, String> service in services) {
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index ea830e3..587d6c6 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -438,7 +438,7 @@
     }
   }
 
-  Future<Null> ensureLogsExists() async {
+  Future<void> ensureLogsExists() async {
     if (await sdkMajorVersion < 11) {
       final File logFile = fs.file(logFilePath);
       if (!logFile.existsSync())
@@ -506,7 +506,7 @@
   @override
   String get name => device.name;
 
-  Future<Null> _start() async {
+  Future<void> _start() async {
     // Device log.
     await device.ensureLogsExists();
     _deviceProcess = await launchDeviceLogTool(device);
@@ -695,7 +695,7 @@
   }
 
   @override
-  Future<Null> unforward(ForwardedPort forwardedPort) async {
+  Future<void> unforward(ForwardedPort forwardedPort) async {
     _ports.remove(forwardedPort);
   }
 }
diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart
index ff6664a..cfd6b6f 100644
--- a/packages/flutter_tools/lib/src/protocol_discovery.dart
+++ b/packages/flutter_tools/lib/src/protocol_discovery.dart
@@ -50,9 +50,9 @@
   /// The discovered service URI.
   Future<Uri> get uri => _completer.future;
 
-  Future<Null> cancel() => _stopScrapingLogs();
+  Future<void> cancel() => _stopScrapingLogs();
 
-  Future<Null> _stopScrapingLogs() async {
+  Future<void> _stopScrapingLogs() async {
     await _deviceLogSubscription?.cancel();
     _deviceLogSubscription = null;
   }
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 53cd22c..4a6c62b 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -62,7 +62,7 @@
   /// expressions requested during debugging of the application.
   /// This ensures that the reload process follows the normal orchestration of
   /// the Flutter Tools and not just the VM internal service.
-  Future<Null> _connect({ReloadSources reloadSources, CompileExpression compileExpression}) async {
+  Future<void> _connect({ReloadSources reloadSources, CompileExpression compileExpression}) async {
     if (vmServices != null)
       return;
     final List<VMService> localVmServices = List<VMService>(observatoryUris.length);
@@ -76,7 +76,7 @@
     vmServices = localVmServices;
   }
 
-  Future<Null> refreshViews() async {
+  Future<void> refreshViews() async {
     if (vmServices == null || vmServices.isEmpty)
       return;
     for (VMService service in vmServices)
@@ -95,12 +95,12 @@
       .toList();
   }
 
-  Future<Null> getVMs() async {
+  Future<void> getVMs() async {
     for (VMService service in vmServices)
       await service.getVM();
   }
 
-  Future<Null> stopApps() async {
+  Future<void> stopApps() async {
     final List<FlutterView> flutterViews = views;
     if (flutterViews == null || flutterViews.isEmpty)
       return;
@@ -110,7 +110,7 @@
         view.uiIsolate.flutterExit(); // ignore: unawaited_futures
       }
     }
-    await Future<Null>.delayed(const Duration(milliseconds: 100));
+    await Future<void>.delayed(const Duration(milliseconds: 100));
   }
 
   Future<Uri> setupDevFS(String fsName,
@@ -145,11 +145,11 @@
     return reports;
   }
 
-  Future<Null> resetAssetDirectory() async {
+  Future<void> resetAssetDirectory() async {
     final Uri deviceAssetsDirectoryUri = devFS.baseUri.resolveUri(
         fs.path.toUri(getAssetBuildDirectory()));
     assert(deviceAssetsDirectoryUri != null);
-    await Future.wait<Null>(views.map<Future<Null>>(
+    await Future.wait<void>(views.map<Future<void>>(
       (FlutterView view) => view.setAssetDirectory(deviceAssetsDirectoryUri)
     ));
   }
@@ -172,42 +172,42 @@
     return elements;
   }
 
-  Future<Null> debugDumpApp() async {
+  Future<void> debugDumpApp() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterDebugDumpApp();
   }
 
-  Future<Null> debugDumpRenderTree() async {
+  Future<void> debugDumpRenderTree() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterDebugDumpRenderTree();
   }
 
-  Future<Null> debugDumpLayerTree() async {
+  Future<void> debugDumpLayerTree() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterDebugDumpLayerTree();
   }
 
-  Future<Null> debugDumpSemanticsTreeInTraversalOrder() async {
+  Future<void> debugDumpSemanticsTreeInTraversalOrder() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterDebugDumpSemanticsTreeInTraversalOrder();
   }
 
-  Future<Null> debugDumpSemanticsTreeInInverseHitTestOrder() async {
+  Future<void> debugDumpSemanticsTreeInInverseHitTestOrder() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterDebugDumpSemanticsTreeInInverseHitTestOrder();
   }
 
-  Future<Null> toggleDebugPaintSizeEnabled() async {
+  Future<void> toggleDebugPaintSizeEnabled() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterToggleDebugPaintSizeEnabled();
   }
 
-  Future<Null> debugTogglePerformanceOverlayOverride() async {
+  Future<void> debugTogglePerformanceOverlayOverride() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterTogglePerformanceOverlayOverride();
   }
 
-  Future<Null> toggleWidgetInspector() async {
+  Future<void> toggleWidgetInspector() async {
     for (FlutterView view in views)
       await view.uiIsolate.flutterToggleWidgetInspector();
   }
@@ -237,7 +237,7 @@
     });
   }
 
-  Future<Null> stopEchoingDeviceLog() async {
+  Future<void> stopEchoingDeviceLog() async {
     if (_loggingSubscription == null)
       return;
     await _loggingSubscription.cancel();
@@ -464,73 +464,73 @@
     throw 'unsupported';
   }
 
-  Future<Null> stop() async {
+  Future<void> stop() async {
     _stopped = true;
     await stopEchoingDeviceLog();
     await preStop();
     return stopApp();
   }
 
-  Future<Null> detach() async {
+  Future<void> detach() async {
     await stopEchoingDeviceLog();
     await preStop();
     appFinished();
   }
 
-  Future<Null> refreshViews() async {
+  Future<void> refreshViews() async {
     for (FlutterDevice device in flutterDevices)
       await device.refreshViews();
   }
 
-  Future<Null> _debugDumpApp() async {
+  Future<void> _debugDumpApp() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugDumpApp();
   }
 
-  Future<Null> _debugDumpRenderTree() async {
+  Future<void> _debugDumpRenderTree() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugDumpRenderTree();
   }
 
-  Future<Null> _debugDumpLayerTree() async {
+  Future<void> _debugDumpLayerTree() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugDumpLayerTree();
   }
 
-  Future<Null> _debugDumpSemanticsTreeInTraversalOrder() async {
+  Future<void> _debugDumpSemanticsTreeInTraversalOrder() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugDumpSemanticsTreeInTraversalOrder();
   }
 
-  Future<Null> _debugDumpSemanticsTreeInInverseHitTestOrder() async {
+  Future<void> _debugDumpSemanticsTreeInInverseHitTestOrder() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugDumpSemanticsTreeInInverseHitTestOrder();
   }
 
-  Future<Null> _debugToggleDebugPaintSizeEnabled() async {
+  Future<void> _debugToggleDebugPaintSizeEnabled() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.toggleDebugPaintSizeEnabled();
   }
 
-  Future<Null> _debugTogglePerformanceOverlayOverride() async {
+  Future<void> _debugTogglePerformanceOverlayOverride() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.debugTogglePerformanceOverlayOverride();
   }
 
-  Future<Null> _debugToggleWidgetInspector() async {
+  Future<void> _debugToggleWidgetInspector() async {
     await refreshViews();
     for (FlutterDevice device in flutterDevices)
       await device.toggleWidgetInspector();
   }
 
-  Future<Null> _screenshot(FlutterDevice device) async {
+  Future<void> _screenshot(FlutterDevice device) async {
     final Status status = logger.startProgress('Taking screenshot for ${device.device.name}...');
     final File outputFile = getUniqueFile(fs.currentDirectory, 'flutter', 'png');
     try {
@@ -568,7 +568,7 @@
     }
   }
 
-  Future<Null> _debugTogglePlatform() async {
+  Future<void> _debugTogglePlatform() async {
     await refreshViews();
     final String from = await flutterDevices[0].views[0].uiIsolate.flutterPlatformOverride();
     String to;
@@ -587,14 +587,14 @@
     ProcessSignal.SIGUSR2.watch().listen(_handleSignal);
   }
 
-  Future<Null> _cleanUpAndExit(ProcessSignal signal) async {
+  Future<void> _cleanUpAndExit(ProcessSignal signal) async {
     _resetTerminal();
     await cleanupAfterSignal();
     exit(0);
   }
 
   bool _processingUserRequest = false;
-  Future<Null> _handleSignal(ProcessSignal signal) async {
+  Future<void> _handleSignal(ProcessSignal signal) async {
     if (_processingUserRequest) {
       printTrace('Ignoring signal: "$signal" because we are busy.');
       return;
@@ -610,18 +610,18 @@
     }
   }
 
-  Future<Null> stopEchoingDeviceLog() async {
-    await Future.wait<Null>(
-      flutterDevices.map<Future<Null>>((FlutterDevice device) => device.stopEchoingDeviceLog())
+  Future<void> stopEchoingDeviceLog() async {
+    await Future.wait<void>(
+      flutterDevices.map<Future<void>>((FlutterDevice device) => device.stopEchoingDeviceLog())
     );
   }
 
   /// If the [reloadSources] parameter is not null the 'reloadSources' service
   /// will be registered
-  Future<Null> connectToServiceProtocol({String viewFilter,
+  Future<void> connectToServiceProtocol({String viewFilter,
       ReloadSources reloadSources, CompileExpression compileExpression}) async {
     if (!debuggingOptions.debuggingEnabled)
-      return Future<Null>.error('Error the service protocol is not enabled.');
+      return Future<void>.error('Error the service protocol is not enabled.');
 
     bool viewFound = false;
     for (FlutterDevice device in flutterDevices) {
@@ -644,7 +644,7 @@
         // This hooks up callbacks for when the connection stops in the future.
         // We don't want to wait for them. We don't handle errors in those callbacks'
         // futures either because they just print to logger and is not critical.
-        service.done.then<Null>( // ignore: unawaited_futures
+        service.done.then<void>( // ignore: unawaited_futures
           _serviceProtocolDone,
           onError: _serviceProtocolError
         ).whenComplete(_serviceDisconnected);
@@ -652,14 +652,14 @@
     }
   }
 
-  Future<Null> _serviceProtocolDone(dynamic object) {
+  Future<void> _serviceProtocolDone(dynamic object) {
     printTrace('Service protocol connection closed.');
-    return Future<Null>.value(object);
+    return Future<void>.value(object);
   }
 
-  Future<Null> _serviceProtocolError(dynamic error, StackTrace stack) {
+  Future<void> _serviceProtocolError(dynamic error, StackTrace stack) {
     printTrace('Service protocol connection closed with an error: $error\n$stack');
-    return Future<Null>.error(error, stack);
+    return Future<void>.error(error, stack);
   }
 
   /// Returns [true] if the input has been handled by this function.
@@ -734,7 +734,7 @@
     return false;
   }
 
-  Future<Null> processTerminalInput(String command) async {
+  Future<void> processTerminalInput(String command) async {
     // When terminal doesn't support line mode, '\n' can sneak into the input.
     command = command.trim();
     if (_processingUserRequest) {
@@ -810,9 +810,9 @@
     return dependencyChecker.check(lastBuildTime);
   }
 
-  Future<Null> preStop() async { }
+  Future<void> preStop() async { }
 
-  Future<Null> stopApp() async {
+  Future<void> stopApp() async {
     for (FlutterDevice device in flutterDevices)
       await device.stopApps();
     appFinished();
@@ -841,11 +841,11 @@
   }
 
   /// Called when a signal has requested we exit.
-  Future<Null> cleanupAfterSignal();
+  Future<void> cleanupAfterSignal();
   /// Called right before we exit.
-  Future<Null> cleanupAtFinish();
+  Future<void> cleanupAtFinish();
   /// Called when the runner should handle a terminal command.
-  Future<Null> handleTerminalCommand(String code);
+  Future<void> handleTerminalCommand(String code);
 }
 
 class OperationResult {
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart
index 18a12c5..32e415e 100644
--- a/packages/flutter_tools/lib/src/run_cold.dart
+++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -109,16 +109,16 @@
   }
 
   @override
-  Future<Null> handleTerminalCommand(String code) async => null;
+  Future<void> handleTerminalCommand(String code) async => null;
 
   @override
-  Future<Null> cleanupAfterSignal() async {
+  Future<void> cleanupAfterSignal() async {
     await stopEchoingDeviceLog();
     await stopApp();
   }
 
   @override
-  Future<Null> cleanupAtFinish() async {
+  Future<void> cleanupAtFinish() async {
     await stopEchoingDeviceLog();
   }
 
@@ -152,7 +152,7 @@
   }
 
   @override
-  Future<Null> preStop() async {
+  Future<void> preStop() async {
     for (FlutterDevice device in flutterDevices) {
       // If we're running in release mode, stop the app using the device logic.
       if (device.vmServices == null || device.vmServices.isEmpty)
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index 1d6a0a8..35d5f92 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -120,7 +120,7 @@
     return true;
   }
 
-  Future<Null> _reloadSourcesService(String isolateId,
+  Future<void> _reloadSourcesService(String isolateId,
       { bool force = false, bool pause = false }) async {
     // TODO(cbernaschina): check that isolateId is the id of the UI isolate.
     final OperationResult result = await restart(pauseAfterRestart: pause);
@@ -276,7 +276,7 @@
   }
 
   @override
-  Future<Null> handleTerminalCommand(String code) async {
+  Future<void> handleTerminalCommand(String code) async {
     final String lower = code.toLowerCase();
     if (lower == 'r') {
       final OperationResult result = await restart(fullRestart: code == 'R');
@@ -340,7 +340,7 @@
     return true;
   }
 
-  Future<Null> _evictDirtyAssets() async {
+  Future<void> _evictDirtyAssets() async {
     for (FlutterDevice device in flutterDevices) {
       if (device.devFS.assetPathsToEvict.isEmpty)
         return;
@@ -357,7 +357,7 @@
       device.devFS.assetPathsToEvict.clear();
   }
 
-  Future<Null> _cleanupDevFS() async {
+  Future<void> _cleanupDevFS() async {
     for (FlutterDevice device in flutterDevices) {
       if (device.devFS != null) {
         // Cleanup the devFS; don't wait indefinitely, and ignore any errors.
@@ -371,7 +371,7 @@
     }
   }
 
-  Future<Null> _launchInView(FlutterDevice device,
+  Future<void> _launchInView(FlutterDevice device,
                              Uri entryUri,
                              Uri packagesUri,
                              Uri assetsDirectoryUri) async {
@@ -379,7 +379,7 @@
       await view.runFromSource(entryUri, packagesUri, assetsDirectoryUri);
   }
 
-  Future<Null> _launchFromDevFS(String mainScript) async {
+  Future<void> _launchFromDevFS(String mainScript) async {
     final String entryUri = fs.path.relative(mainScript, from: projectRootPath);
     for (FlutterDevice device in flutterDevices) {
       final Uri deviceEntryUri = device.devFS.baseUri.resolveUri(
@@ -764,7 +764,7 @@
   }
 
   @override
-  Future<Null> cleanupAfterSignal() async {
+  Future<void> cleanupAfterSignal() async {
     await stopEchoingDeviceLog();
     if (_didAttach) {
       appFinished();
@@ -774,10 +774,10 @@
   }
 
   @override
-  Future<Null> preStop() => _cleanupDevFS();
+  Future<void> preStop() => _cleanupDevFS();
 
   @override
-  Future<Null> cleanupAtFinish() async {
+  Future<void> cleanupAtFinish() async {
     await _cleanupDevFS();
     await stopEchoingDeviceLog();
   }
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index f9a25fe..cef4908 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -65,7 +65,7 @@
   static const String kFileSystemScheme = 'filesystem-scheme';
 }
 
-abstract class FlutterCommand extends Command<Null> {
+abstract class FlutterCommand extends Command<void> {
   /// The currently executing command (or sub-command).
   ///
   /// Will be `null` until the top-most command has begun execution.
@@ -294,10 +294,10 @@
   /// and [runCommand] to execute the command
   /// so that this method can record and report the overall time to analytics.
   @override
-  Future<Null> run() {
+  Future<void> run() {
     final DateTime startTime = clock.now();
 
-    return context.run<Null>(
+    return context.run<void>(
       name: 'command',
       overrides: <Type, Generator>{FlutterCommand: () => this},
       body: () async {
@@ -451,7 +451,7 @@
 
   @protected
   @mustCallSuper
-  Future<Null> validateCommand() async {
+  Future<void> validateCommand() async {
     if (_requiresPubspecYaml && !PackageMap.isUsingCustomPackagesPath) {
       // Don't expect a pubspec.yaml file if the user passed in an explicit .packages file path.
       if (!fs.isFileSync('pubspec.yaml')) {
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index 68cc46f..dc9c2fda 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -38,7 +38,7 @@
 const String kFlutterToolsScriptFileName = 'flutter_tools.dart'; // in //flutter/packages/flutter_tools/bin/
 const String kFlutterEnginePackageName = 'sky_engine';
 
-class FlutterCommandRunner extends CommandRunner<Null> {
+class FlutterCommandRunner extends CommandRunner<void> {
   FlutterCommandRunner({ bool verboseHelp = false }) : super(
     'flutter',
     'Manage your Flutter app development.\n'
@@ -191,7 +191,7 @@
         usageException(error.message);
       }
 
-      Command<Null> command = commands[error.commands.first];
+      Command<void> command = commands[error.commands.first];
       for (String commandName in error.commands.skip(1)) {
         command = command.subcommands[commandName];
       }
@@ -202,7 +202,7 @@
   }
 
   @override
-  Future<Null> run(Iterable<String> args) {
+  Future<void> run(Iterable<String> args) {
     // Have an invocation of 'build' print out it's sub-commands.
     // TODO(ianh): Move this to the Build command itself somehow.
     if (args.length == 1 && args.first == 'build')
@@ -212,7 +212,7 @@
   }
 
   @override
-  Future<Null> runCommand(ArgResults topLevelResults) async {
+  Future<void> runCommand(ArgResults topLevelResults) async {
     final Map<Type, dynamic> contextOverrides = <Type, dynamic>{
       Flags: Flags(topLevelResults),
     };
@@ -300,7 +300,7 @@
       });
     }
 
-    await context.run<Null>(
+    await context.run<void>(
       overrides: contextOverrides.map<Type, Generator>((Type type, dynamic value) {
         return MapEntry<Type, Generator>(type, () => value);
       }),
diff --git a/packages/flutter_tools/lib/src/services.dart b/packages/flutter_tools/lib/src/services.dart
index bdc61d2..934f05e 100644
--- a/packages/flutter_tools/lib/src/services.dart
+++ b/packages/flutter_tools/lib/src/services.dart
@@ -25,7 +25,7 @@
 
 /// Loads all services specified in `pubspec.yaml`. Parses each service config file,
 /// storing meta data in [services] and the list of jar files in [jars].
-Future<Null> parseServiceConfigs(
+Future<void> parseServiceConfigs(
   List<Map<String, String>> services, { List<File> jars }
 ) async {
   Map<String, Uri> packageMap;
diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart
index 580b393..fda1785 100644
--- a/packages/flutter_tools/lib/src/test/coverage_collector.dart
+++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart
@@ -40,7 +40,7 @@
   /// has been run to completion so that all coverage data has been recorded.
   ///
   /// The returned [Future] completes when the coverage is collected.
-  Future<Null> collectCoverage(Process process, Uri observatoryUri) async {
+  Future<void> collectCoverage(Process process, Uri observatoryUri) async {
     assert(process != null);
     assert(observatoryUri != null);
 
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index e353708..eb77279 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -190,7 +190,7 @@
 
 enum _InitialResult { crashed, timedOut, connected }
 enum _TestResult { crashed, harnessBailed, testBailed }
-typedef _Finalizer = Future<Null> Function();
+typedef _Finalizer = Future<void> Function();
 
 class _CompilationRequest {
   _CompilationRequest(this.path, this.result);
diff --git a/packages/flutter_tools/lib/src/tester/flutter_tester.dart b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
index 219d46b..467ad0b 100644
--- a/packages/flutter_tools/lib/src/tester/flutter_tester.dart
+++ b/packages/flutter_tools/lib/src/tester/flutter_tester.dart
@@ -246,5 +246,5 @@
   List<ForwardedPort> get forwardedPorts => <ForwardedPort>[];
 
   @override
-  Future<Null> unforward(ForwardedPort forwardedPort) => null;
+  Future<void> unforward(ForwardedPort forwardedPort) => null;
 }
diff --git a/packages/flutter_tools/lib/src/tracing.dart b/packages/flutter_tools/lib/src/tracing.dart
index 0a72a48..3fe3953 100644
--- a/packages/flutter_tools/lib/src/tracing.dart
+++ b/packages/flutter_tools/lib/src/tracing.dart
@@ -25,7 +25,7 @@
 
   final VMService vmService;
 
-  Future<Null> startTracing() async {
+  Future<void> startTracing() async {
     await vmService.vm.setVMTimelineFlags(<String>['Compiler', 'Dart', 'Embedder', 'GC']);
     await vmService.vm.clearVMTimeline();
   }
@@ -41,7 +41,7 @@
       await vmService.vm.setVMTimelineFlags(<String>[]);
       timeline = await vmService.vm.getVMTimeline();
     } else {
-      final Completer<Null> whenFirstFrameRendered = Completer<Null>();
+      final Completer<void> whenFirstFrameRendered = Completer<void>();
 
       (await vmService.onTimelineEvent).listen((ServiceEvent timelineEvent) {
         final List<Map<String, dynamic>> events = timelineEvent.timelineEvents;
@@ -74,7 +74,7 @@
 
 /// Download the startup trace information from the given observatory client and
 /// store it to build/start_up_info.json.
-Future<Null> downloadStartupTrace(VMService observatory) async {
+Future<void> downloadStartupTrace(VMService observatory) async {
   final String traceInfoFilePath = fs.path.join(getBuildDirectory(), 'start_up_info.json');
   final File traceInfoFile = fs.file(traceInfoFilePath);
 
diff --git a/packages/flutter_tools/lib/src/usage.dart b/packages/flutter_tools/lib/src/usage.dart
index a49553d..8296d2a 100644
--- a/packages/flutter_tools/lib/src/usage.dart
+++ b/packages/flutter_tools/lib/src/usage.dart
@@ -122,7 +122,7 @@
 
   /// Returns when the last analytics event has been sent, or after a fixed
   /// (short) delay, whichever is less.
-  Future<Null> ensureAnalyticsSent() async {
+  Future<void> ensureAnalyticsSent() async {
     // TODO(devoncarew): This may delay tool exit and could cause some analytics
     // events to not be reported. Perhaps we could send the analytics pings
     // out-of-process from flutter_tools?
diff --git a/packages/flutter_tools/lib/src/version.dart b/packages/flutter_tools/lib/src/version.dart
index da54493..896227b 100644
--- a/packages/flutter_tools/lib/src/version.dart
+++ b/packages/flutter_tools/lib/src/version.dart
@@ -158,7 +158,7 @@
     }
   }
 
-  static Future<Null> _removeVersionCheckRemoteIfExists() async {
+  static Future<void> _removeVersionCheckRemoteIfExists() async {
     final List<String> remotes = (await _run(<String>['git', 'remote']))
         .split('\n')
         .map<String>((String name) => name.trim()) // to account for OS-specific line-breaks
@@ -234,7 +234,7 @@
   /// [checkFlutterVersionFreshness] is called after this. This is typically
   /// used when switching channels so that stale information from another
   /// channel doesn't linger.
-  static Future<Null> resetFlutterVersionFreshnessCheck() async {
+  static Future<void> resetFlutterVersionFreshnessCheck() async {
     try {
       await Cache.instance.getStampFileFor(
         VersionCheckStamp.kFlutterVersionCheckStampFile,
@@ -249,7 +249,7 @@
   ///
   /// This function must run while [Cache.lock] is acquired because it reads and
   /// writes shared cache files.
-  Future<Null> checkFlutterVersionFreshness() async {
+  Future<void> checkFlutterVersionFreshness() async {
     // Don't perform update checks if we're not on an official channel.
     if (!officialChannels.contains(_channel)) {
       return;
@@ -288,11 +288,11 @@
               ? newVersionAvailableMessage()
               : versionOutOfDateMessage(frameworkAge);
       printStatus(updateMessage, emphasis: true);
-      await Future.wait<Null>(<Future<Null>>[
+      await Future.wait<void>(<Future<void>>[
         stamp.store(
           newTimeWarningWasPrinted: _clock.now(),
         ),
-        Future<Null>.delayed(timeToPauseToLetUserReadTheMessage),
+        Future<void>.delayed(timeToPauseToLetUserReadTheMessage),
       ]);
     }
   }
@@ -418,7 +418,7 @@
     );
   }
 
-  Future<Null> store({
+  Future<void> store({
     DateTime newTimeVersionWasChecked,
     DateTime newKnownRemoteVersion,
     DateTime newTimeWarningWasPrinted,
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index e76b963..f83b50e 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -37,7 +37,7 @@
 /// hot mode.
 ///
 /// See: https://github.com/dart-lang/sdk/issues/30023
-typedef ReloadSources = Future<Null> Function(
+typedef ReloadSources = Future<void> Function(
   String isolateId, {
   bool force,
   bool pause,
@@ -66,7 +66,7 @@
     printTrace('This was attempt #$attempts. Will retry in $delay.');
 
     // Delay next attempt.
-    await Future<Null>.delayed(delay);
+    await Future<void>.delayed(delay);
 
     // Back off exponentially.
     delay *= 2;
@@ -260,7 +260,7 @@
   /// Whether our connection to the VM service has been closed;
   bool get isClosed => _peer.isClosed;
 
-  Future<Null> get done async {
+  Future<void> get done async {
     await _peer.done;
   }
 
@@ -332,7 +332,7 @@
     _getEventController(streamId).add(event);
   }
 
-  Future<Null> _streamListen(String streamId) async {
+  Future<void> _streamListen(String streamId) async {
     if (!_listeningFor.contains(streamId)) {
       _listeningFor.add(streamId);
       await _sendRequest('streamListen', <String, dynamic>{ 'streamId': streamId });
@@ -344,7 +344,7 @@
     return await _vm.reload();
   }
 
-  Future<Null> refreshViews() async {
+  Future<void> refreshViews() async {
     if (!vm.isFlutterEngine)
       return;
     await vm.refreshViews();
@@ -948,7 +948,7 @@
     return invokeRpcRaw('_getVMTimeline', timeout: kLongRequestTimeout);
   }
 
-  Future<Null> refreshViews() async {
+  Future<void> refreshViews() async {
     if (!isFlutterEngine)
       return;
     _viewCache.clear();
@@ -1277,7 +1277,7 @@
 
   Future<Map<String, dynamic>> flutterToggleWidgetInspector() => _flutterToggle('inspector.show');
 
-  Future<Null> flutterDebugAllowBanner(bool show) async {
+  Future<void> flutterDebugAllowBanner(bool show) async {
     await invokeFlutterExtensionRpcRaw(
       'ext.flutter.debugAllowBanner',
       params: <String, dynamic>{ 'enabled': show ? 'true' : 'false' },
@@ -1412,12 +1412,12 @@
   }
 
   // TODO(johnmccutchan): Report errors when running failed.
-  Future<Null> runFromSource(Uri entryUri,
+  Future<void> runFromSource(Uri entryUri,
                              Uri packagesUri,
                              Uri assetsDirectoryUri) async {
     final String viewId = id;
     // When this completer completes the isolate is running.
-    final Completer<Null> completer = Completer<Null>();
+    final Completer<void> completer = Completer<void>();
     final StreamSubscription<ServiceEvent> subscription =
       (await owner.vm.vmService.onIsolateEvent).listen((ServiceEvent event) {
       // TODO(johnmccutchan): Listen to the debug stream and catch initial
@@ -1425,7 +1425,7 @@
       if (event.kind == ServiceEvent.kIsolateRunnable) {
         printTrace('Isolate is runnable.');
         if (!completer.isCompleted)
-          completer.complete(null);
+          completer.complete();
       }
     });
     await owner.vm.runInView(viewId,
@@ -1437,7 +1437,7 @@
     await subscription.cancel();
   }
 
-  Future<Null> setAssetDirectory(Uri assetsDirectory) async {
+  Future<void> setAssetDirectory(Uri assetsDirectory) async {
     assert(assetsDirectory != null);
     await owner.vmService.vm.invokeRpc<ServiceObject>('_flutter.setAssetBundlePath',
         params: <String, dynamic>{
@@ -1449,7 +1449,7 @@
 
   bool get hasIsolate => _uiIsolate != null;
 
-  Future<Null> flushUIThreadTasks() async {
+  Future<void> flushUIThreadTasks() async {
     await owner.vm.invokeRpcRaw('_flutter.flushUIThreadTasks',
       params: <String, dynamic>{'isolateId': _uiIsolate.id});
   }
diff --git a/packages/flutter_tools/lib/src/vmservice_record_replay.dart b/packages/flutter_tools/lib/src/vmservice_record_replay.dart
index 0126f87..4749b58 100644
--- a/packages/flutter_tools/lib/src/vmservice_record_replay.dart
+++ b/packages/flutter_tools/lib/src/vmservice_record_replay.dart
@@ -253,7 +253,7 @@
   _ReplaySink(this.channel);
 
   final ReplayVMServiceChannel channel;
-  final Completer<Null> _completer = Completer<Null>();
+  final Completer<void> _completer = Completer<void>();
 
   @override
   Future<dynamic> close() {
diff --git a/packages/flutter_tools/test/analytics_test.dart b/packages/flutter_tools/test/analytics_test.dart
index ee99ace..14e5f0a 100644
--- a/packages/flutter_tools/test/analytics_test.dart
+++ b/packages/flutter_tools/test/analytics_test.dart
@@ -52,7 +52,7 @@
       count = 0;
       flutterUsage.enabled = false;
       final DoctorCommand doctorCommand = DoctorCommand();
-      final CommandRunner<Null>runner = createTestCommandRunner(doctorCommand);
+      final CommandRunner<void>runner = createTestCommandRunner(doctorCommand);
       await runner.run(<String>['doctor']);
       expect(count, 0);
     }, overrides: <Type, Generator>{
@@ -67,7 +67,7 @@
 
       flutterUsage.enabled = false;
       final ConfigCommand command = ConfigCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['config']);
       expect(count, 0);
 
@@ -100,7 +100,7 @@
       mockTimes = <int>[1000, 2000];
       when(mockDoctor.diagnose(androidLicenses: false, verbose: false)).thenAnswer((_) async => true);
       final DoctorCommand command = DoctorCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['doctor']);
 
       verify(mockClock.now()).called(2);
@@ -119,7 +119,7 @@
       mockTimes = <int>[1000, 2000];
       when(mockDoctor.diagnose(androidLicenses: false, verbose: false)).thenAnswer((_) async => false);
       final DoctorCommand command = DoctorCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['doctor']);
 
       verify(mockClock.now()).called(2);
diff --git a/packages/flutter_tools/test/asset_bundle_package_fonts_test.dart b/packages/flutter_tools/test/asset_bundle_package_fonts_test.dart
index a1a584f..a30b8cb 100644
--- a/packages/flutter_tools/test/asset_bundle_package_fonts_test.dart
+++ b/packages/flutter_tools/test/asset_bundle_package_fonts_test.dart
@@ -60,7 +60,7 @@
       ..writeAsStringSync(packages);
   }
 
-  Future<Null> buildAndVerifyFonts(
+  Future<void> buildAndVerifyFonts(
     List<String> localFonts,
     List<String> packageFonts,
     List<String> packages,
diff --git a/packages/flutter_tools/test/asset_bundle_package_test.dart b/packages/flutter_tools/test/asset_bundle_package_test.dart
index 17b3c42..9ed6f03 100644
--- a/packages/flutter_tools/test/asset_bundle_package_test.dart
+++ b/packages/flutter_tools/test/asset_bundle_package_test.dart
@@ -66,7 +66,7 @@
       ..writeAsStringSync(packages);
   }
 
-  Future<Null> buildAndVerifyAssets(
+  Future<void> buildAndVerifyAssets(
     List<String> assets,
     List<String> packages,
     String expectedAssetManifest,
diff --git a/packages/flutter_tools/test/base/flags_test.dart b/packages/flutter_tools/test/base/flags_test.dart
index 99122de..e49a7af 100644
--- a/packages/flutter_tools/test/base/flags_test.dart
+++ b/packages/flutter_tools/test/base/flags_test.dart
@@ -11,12 +11,12 @@
 import '../src/common.dart';
 import '../src/context.dart';
 
-typedef _TestMethod = FutureOr<Null> Function();
+typedef _TestMethod = FutureOr<void> Function();
 
 void main() {
   Cache.disableLocking();
 
-  Future<Null> runCommand(Iterable<String> flags, _TestMethod testMethod) async {
+  Future<void> runCommand(Iterable<String> flags, _TestMethod testMethod) async {
     final List<String> args = <String>['test']..addAll(flags);
     final _TestCommand command = _TestCommand(testMethod);
     await createTestCommandRunner(command).run(args);
diff --git a/packages/flutter_tools/test/channel_test.dart b/packages/flutter_tools/test/channel_test.dart
index ed12ded..96c2e92 100644
--- a/packages/flutter_tools/test/channel_test.dart
+++ b/packages/flutter_tools/test/channel_test.dart
@@ -43,7 +43,7 @@
 
     testUsingContext('list', () async {
       final ChannelCommand command = ChannelCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['channel']);
       expect(testLogger.errorText, hasLength(0));
       // The bots may return an empty list of channels (network hiccup?)
@@ -65,7 +65,7 @@
       )).thenAnswer((_) => Future<Process>.value(process));
 
       final ChannelCommand command = ChannelCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['channel']);
 
       verify(mockProcessManager.start(
@@ -106,7 +106,7 @@
       )).thenAnswer((_) => Future<Process>.value(createMockProcess()));
 
       final ChannelCommand command = ChannelCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['channel', 'beta']);
 
       verify(mockProcessManager.start(
@@ -166,7 +166,7 @@
       ''');
 
       final ChannelCommand command = ChannelCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['channel', 'beta']);
 
       verify(mockProcessManager.start(
diff --git a/packages/flutter_tools/test/commands/analyze_once_test.dart b/packages/flutter_tools/test/commands/analyze_once_test.dart
index afae38e..229c569 100644
--- a/packages/flutter_tools/test/commands/analyze_once_test.dart
+++ b/packages/flutter_tools/test/commands/analyze_once_test.dart
@@ -191,7 +191,7 @@
   }
 }
 
-Future<Null> runCommand({
+Future<void> runCommand({
   FlutterCommand command,
   List<String> arguments,
   List<String> statusTextContains,
diff --git a/packages/flutter_tools/test/commands/create_test.dart b/packages/flutter_tools/test/commands/create_test.dart
index 10c65eb..ff5bd11 100644
--- a/packages/flutter_tools/test/commands/create_test.dart
+++ b/packages/flutter_tools/test/commands/create_test.dart
@@ -234,7 +234,7 @@
     when(mockFlutterVersion.channel).thenReturn(frameworkChannel);
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--template=application', '--no-pub', '--org', 'com.foo.bar', projectDir.path]);
 
@@ -305,7 +305,7 @@
     when(mockFlutterVersion.channel).thenReturn(frameworkChannel);
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--template=app', '--no-pub', '--org', 'com.foo.bar', projectDir.path]);
 
@@ -374,7 +374,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--no-pub', projectDir.path]);
 
@@ -385,7 +385,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--no-pub', '--template=app', projectDir.path]);
 
@@ -402,7 +402,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--no-pub', '--template=app', projectDir.path]);
 
@@ -416,7 +416,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--no-pub', '--template=plugin', projectDir.path]);
 
@@ -430,7 +430,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     await runner.run(<String>['create', '--no-pub', '--template=package', projectDir.path]);
 
@@ -555,7 +555,7 @@
     Cache.flutterRoot = '../..';
 
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
 
     expect(
       runner.run(<String>['create', projectDir.path, '--pub']),
@@ -567,7 +567,7 @@
   testUsingContext('fails when file exists', () async {
     Cache.flutterRoot = '../..';
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
     final File existingFile = fs.file('${projectDir.path.toString()}/bad');
     if (!existingFile.existsSync()) {
       existingFile.createSync(recursive: true);
@@ -581,7 +581,7 @@
   testUsingContext('fails when invalid package name', () async {
     Cache.flutterRoot = '../..';
     final CreateCommand command = CreateCommand();
-    final CommandRunner<Null> runner = createTestCommandRunner(command);
+    final CommandRunner<void> runner = createTestCommandRunner(command);
     expect(
       runner.run(<String>['create', fs.path.join(projectDir.path, 'invalidName')]),
       throwsToolExit(message: '"invalidName" is not a valid Dart package name.'),
@@ -594,7 +594,7 @@
       Cache.flutterRoot = '../..';
 
       final CreateCommand command = CreateCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
 
       await runner.run(<String>['create', '--pub', '--offline', projectDir.path]);
       expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
@@ -612,7 +612,7 @@
       Cache.flutterRoot = '../..';
 
       final CreateCommand command = CreateCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
 
       await runner.run(<String>['create', '--pub', projectDir.path]);
       expect(loggingProcessManager.commands.first, contains(matches(r'dart-sdk[\\/]bin[\\/]pub')));
@@ -625,7 +625,7 @@
   );
 }
 
-Future<Null> _createProject(
+Future<void> _createProject(
   Directory dir,
   List<String> createArgs,
   List<String> expectedPaths, {
@@ -633,7 +633,7 @@
 }) async {
   Cache.flutterRoot = '../..';
   final CreateCommand command = CreateCommand();
-  final CommandRunner<Null> runner = createTestCommandRunner(command);
+  final CommandRunner<void> runner = createTestCommandRunner(command);
   final List<String> args = <String>['create'];
   args.addAll(createArgs);
   args.add(dir.path);
@@ -658,7 +658,7 @@
   expect(failures, isEmpty, reason: failures.join('\n'));
 }
 
-Future<Null> _createAndAnalyzeProject(
+Future<void> _createAndAnalyzeProject(
   Directory dir,
   List<String> createArgs,
   List<String> expectedPaths, {
@@ -668,7 +668,7 @@
   await _analyzeProject(dir.path);
 }
 
-Future<Null> _analyzeProject(String workingDir) async {
+Future<void> _analyzeProject(String workingDir) async {
   final String flutterToolsPath = fs.path.absolute(fs.path.join(
     'bin',
     'flutter_tools.dart',
@@ -691,7 +691,7 @@
   expect(exec.exitCode, 0);
 }
 
-Future<Null> _runFlutterTest(Directory workingDir, {String target}) async {
+Future<void> _runFlutterTest(Directory workingDir, {String target}) async {
   final String flutterToolsPath = fs.path.absolute(fs.path.join(
     'bin',
     'flutter_tools.dart',
diff --git a/packages/flutter_tools/test/commands/daemon_test.dart b/packages/flutter_tools/test/commands/daemon_test.dart
index b1315ea..fbdd8c4 100644
--- a/packages/flutter_tools/test/commands/daemon_test.dart
+++ b/packages/flutter_tools/test/commands/daemon_test.dart
@@ -84,7 +84,7 @@
         );
         printStatus('daemon.logMessage test');
         // Service the event loop.
-        await Future<Null>.value();
+        await Future<void>.value();
       }, zoneSpecification: ZoneSpecification(print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
         buffer.writeln(line);
       }));
@@ -103,7 +103,7 @@
         notifyingLogger: notifyingLogger
       );
       commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.shutdown'});
-      return daemon.onExit.then<Null>((int code) async {
+      return daemon.onExit.then<void>((int code) async {
         await commands.close();
         expect(code, 0);
       });
diff --git a/packages/flutter_tools/test/commands/format_test.dart b/packages/flutter_tools/test/commands/format_test.dart
index 526fa38..f3878cf 100644
--- a/packages/flutter_tools/test/commands/format_test.dart
+++ b/packages/flutter_tools/test/commands/format_test.dart
@@ -31,7 +31,7 @@
       srcFile.writeAsStringSync(original.replaceFirst('main()', 'main(  )'));
 
       final FormatCommand command = FormatCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['format', srcFile.path]);
 
       final String formatted = srcFile.readAsStringSync();
@@ -48,7 +48,7 @@
       srcFile.writeAsStringSync(nonFormatted);
 
       final FormatCommand command = FormatCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       await runner.run(<String>['format', '--dry-run', srcFile.path]);
 
       final String shouldNotFormatted = srcFile.readAsStringSync();
@@ -65,7 +65,7 @@
       srcFile.writeAsStringSync(nonFormatted);
 
       final FormatCommand command = FormatCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
 
       expect(runner.run(<String>[
         'format', '--dry-run', '--set-exit-if-changed', srcFile.path
diff --git a/packages/flutter_tools/test/commands/ide_config_test.dart b/packages/flutter_tools/test/commands/ide_config_test.dart
index 1e7a0fe..f3959a1 100644
--- a/packages/flutter_tools/test/commands/ide_config_test.dart
+++ b/packages/flutter_tools/test/commands/ide_config_test.dart
@@ -76,7 +76,7 @@
       return fs.file(absPath).existsSync() || fs.directory(absPath).existsSync();
     }
 
-    Future<Null> _updateIdeConfig({
+    Future<void> _updateIdeConfig({
       Directory dir,
       List<String> args = const <String>[],
       Map<String, String> expectedContents = const <String, String>{},
@@ -84,7 +84,7 @@
     }) async {
       dir ??= tempDir;
       final IdeConfigCommand command = IdeConfigCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
       final List<String> finalArgs = <String>['--flutter-root=${tempDir.absolute.path}', 'ide-config'];
       finalArgs.addAll(args);
       await runner.run(finalArgs);
diff --git a/packages/flutter_tools/test/commands/packages_test.dart b/packages/flutter_tools/test/commands/packages_test.dart
index 34dab67..c8cad27 100644
--- a/packages/flutter_tools/test/commands/packages_test.dart
+++ b/packages/flutter_tools/test/commands/packages_test.dart
@@ -57,9 +57,9 @@
       return projectPath;
     }
 
-    Future<Null> runCommandIn(String projectPath, String verb, { List<String> args }) async {
+    Future<void> runCommandIn(String projectPath, String verb, { List<String> args }) async {
       final PackagesCommand command = PackagesCommand();
-      final CommandRunner<Null> runner = createTestCommandRunner(command);
+      final CommandRunner<void> runner = createTestCommandRunner(command);
 
       final List<String> commandArgs = <String>['packages', verb];
       if (args != null)
@@ -307,12 +307,12 @@
     testUsingContext('publish', () async {
       final PromptingProcess process = PromptingProcess();
       mockProcessManager.processFactory = (List<String> commands) => process;
-      final Future<Null> runPackages = createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'pub', 'publish']);
-      final Future<Null> runPrompt = process.showPrompt('Proceed (y/n)? ', <String>['hello', 'world']);
-      final Future<Null> simulateUserInput = Future<Null>(() {
+      final Future<void> runPackages = createTestCommandRunner(PackagesCommand()).run(<String>['packages', 'pub', 'publish']);
+      final Future<void> runPrompt = process.showPrompt('Proceed (y/n)? ', <String>['hello', 'world']);
+      final Future<void> simulateUserInput = Future<void>(() {
         mockStdio.simulateStdin('y');
       });
-      await Future.wait<Null>(<Future<Null>>[runPackages, runPrompt, simulateUserInput]);
+      await Future.wait<void>(<Future<void>>[runPackages, runPrompt, simulateUserInput]);
       final List<String> commands = mockProcessManager.commands;
       expect(commands, hasLength(2));
       expect(commands[0], matches(r'dart-sdk[\\/]bin[\\/]pub'));
diff --git a/packages/flutter_tools/test/commands/test_test.dart b/packages/flutter_tools/test/commands/test_test.dart
index d0d3787..4c05295 100644
--- a/packages/flutter_tools/test/commands/test_test.dart
+++ b/packages/flutter_tools/test/commands/test_test.dart
@@ -15,7 +15,7 @@
 
 // This test depends on some files in ///dev/automated_tests/flutter_test/*
 
-Future<Null> _testExclusionLock;
+Future<void> _testExclusionLock;
 
 void main() {
   group('flutter test should', () {
@@ -90,7 +90,7 @@
   });
 }
 
-Future<Null> _testFile(String testName, String workingDirectory, String testDirectory, {Matcher exitCode}) async {
+Future<void> _testFile(String testName, String workingDirectory, String testDirectory, {Matcher exitCode}) async {
   exitCode ??= isNonZero;
   final String fullTestExpectation = fs.path.join(testDirectory, '${testName}_expectation.txt');
   final File expectationFile = fs.file(fullTestExpectation);
@@ -171,7 +171,7 @@
   while (_testExclusionLock != null)
     await _testExclusionLock;
 
-  final Completer<Null> testExclusionCompleter = Completer<Null>();
+  final Completer<void> testExclusionCompleter = Completer<void>();
   _testExclusionLock = testExclusionCompleter.future;
   try {
     return await Process.run(
diff --git a/packages/flutter_tools/test/compile_test.dart b/packages/flutter_tools/test/compile_test.dart
index 2428559..879304c 100644
--- a/packages/flutter_tools/test/compile_test.dart
+++ b/packages/flutter_tools/test/compile_test.dart
@@ -376,7 +376,7 @@
   });
 }
 
-Future<Null> _recompile(StreamController<List<int>> streamController,
+Future<void> _recompile(StreamController<List<int>> streamController,
   ResidentCompiler generator, MockStdIn mockFrontendServerStdIn,
   String mockCompilerOutput) async {
   // Put content into the output stream after generator.recompile gets
diff --git a/packages/flutter_tools/test/crash_reporting_test.dart b/packages/flutter_tools/test/crash_reporting_test.dart
index 2eab591..efbbf21 100644
--- a/packages/flutter_tools/test/crash_reporting_test.dart
+++ b/packages/flutter_tools/test/crash_reporting_test.dart
@@ -173,7 +173,7 @@
   String get name => 'crash';
 
   @override
-  Future<Null> runCommand() async {
+  Future<FlutterCommandResult> runCommand() async {
     void fn1() {
       throw StateError('Test bad state error');
     }
@@ -187,6 +187,8 @@
     }
 
     fn3();
+
+    return null;
   }
 }
 
diff --git a/packages/flutter_tools/test/dart/pub_get_test.dart b/packages/flutter_tools/test/dart/pub_get_test.dart
index ec4773f..a4c4d2c 100644
--- a/packages/flutter_tools/test/dart/pub_get_test.dart
+++ b/packages/flutter_tools/test/dart/pub_get_test.dart
@@ -32,7 +32,7 @@
     FakeAsync().run((FakeAsync time) {
       expect(processMock.lastPubEnvironment, isNull);
       expect(testLogger.statusText, '');
-      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((Null value) {
+      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((void value) {
         error = 'test completed unexpectedly';
       }, onError: (dynamic thrownError) {
         error = 'test failed unexpectedly: $thrownError';
@@ -102,7 +102,7 @@
       MockDirectory.findCache = true;
       expect(processMock.lastPubEnvironment, isNull);
       expect(processMock.lastPubCache, isNull);
-      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((Null value) {
+      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((void value) {
         error = 'test completed unexpectedly';
       }, onError: (dynamic thrownError) {
         error = 'test failed unexpectedly: $thrownError';
@@ -128,7 +128,7 @@
       MockDirectory.findCache = true;
       expect(processMock.lastPubEnvironment, isNull);
       expect(processMock.lastPubCache, isNull);
-      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((Null value) {
+      pubGet(context: PubContext.flutterTests, checkLastModified: false).then((void value) {
         error = 'test completed unexpectedly';
       }, onError: (dynamic thrownError) {
         error = 'test failed unexpectedly: $thrownError';
@@ -213,7 +213,7 @@
   Future<E> asFuture<E>([E futureValue]) => Future<E>.value();
 
   @override
-  Future<Null> cancel() => null;
+  Future<void> cancel() => null;
 
   @override
   dynamic noSuchMethod(Invocation invocation) => null;
diff --git a/packages/flutter_tools/test/devfs_test.dart b/packages/flutter_tools/test/devfs_test.dart
index d3c72bc..ab0ee76 100644
--- a/packages/flutter_tools/test/devfs_test.dart
+++ b/packages/flutter_tools/test/devfs_test.dart
@@ -438,7 +438,7 @@
   @override
   VM get vm => _vm;
 
-  Future<Null> setUp() async {
+  Future<void> setUp() async {
     try {
       _server = await HttpServer.bind(InternetAddress.loopbackIPv6, 0);
       _httpAddress = Uri.parse('http://[::1]:${_server.port}');
@@ -451,7 +451,7 @@
       final String fsName = request.headers.value('dev_fs_name');
       final String devicePath = utf8.decode(base64.decode(request.headers.value('dev_fs_uri_b64')));
       messages.add('writeFile $fsName $devicePath');
-      request.drain<List<int>>().then<Null>((List<int> value) {
+      request.drain<List<int>>().then<void>((List<int> value) {
         request.response
           ..write('Got it')
           ..close();
@@ -459,7 +459,7 @@
     });
   }
 
-  Future<Null> tearDown() async {
+  Future<void> tearDown() async {
     await _server?.close();
   }
 
@@ -522,7 +522,7 @@
     tryToDelete(_tempDirs.removeLast());
 }
 
-Future<Null> _createPackage(FileSystem fs, String pkgName, String pkgFileName, { bool doubleSlash = false }) async {
+Future<void> _createPackage(FileSystem fs, String pkgName, String pkgFileName, { bool doubleSlash = false }) async {
   final Directory pkgTempDir = _newTempDir(fs);
   String pkgFilePath = fs.path.join(pkgTempDir.path, pkgName, 'lib', pkgFileName);
   if (doubleSlash) {
diff --git a/packages/flutter_tools/test/device_test.dart b/packages/flutter_tools/test/device_test.dart
index db32c3d..4b199c7 100644
--- a/packages/flutter_tools/test/device_test.dart
+++ b/packages/flutter_tools/test/device_test.dart
@@ -25,7 +25,7 @@
       final List<Device> devices = <Device>[device1, device2, device3];
       final DeviceManager deviceManager = TestDeviceManager(devices);
 
-      Future<Null> expectDevice(String id, List<Device> expected) async {
+      Future<void> expectDevice(String id, List<Device> expected) async {
         expect(await deviceManager.getDevicesById(id).toList(), expected);
       }
       await expectDevice('01abfc49119c410e', <Device>[device2]);
diff --git a/packages/flutter_tools/test/emulator_test.dart b/packages/flutter_tools/test/emulator_test.dart
index 0bb1499..59b276d 100644
--- a/packages/flutter_tools/test/emulator_test.dart
+++ b/packages/flutter_tools/test/emulator_test.dart
@@ -58,7 +58,7 @@
       final TestEmulatorManager testEmulatorManager =
           TestEmulatorManager(emulators);
 
-      Future<Null> expectEmulator(String id, List<Emulator> expected) async {
+      Future<void> expectEmulator(String id, List<Emulator> expected) async {
         expect(await testEmulatorManager.getEmulatorsMatching(id), expected);
       }
 
diff --git a/packages/flutter_tools/test/project_test.dart b/packages/flutter_tools/test/project_test.dart
index c17d6f0..80248ba 100644
--- a/packages/flutter_tools/test/project_test.dart
+++ b/packages/flutter_tools/test/project_test.dart
@@ -234,7 +234,7 @@
         mockXcodeProjectInterpreter = MockXcodeProjectInterpreter();
       });
 
-      void testWithMocks(String description, Future<Null> testMethod()) {
+      void testWithMocks(String description, Future<void> testMethod()) {
         testUsingContext(description, testMethod, overrides: <Type, Generator>{
           FileSystem: () => fs,
           IOSWorkflow: () => mockIOSWorkflow,
@@ -365,7 +365,7 @@
 
 /// Executes the [testMethod] in a context where the file system
 /// is in memory.
-void testInMemory(String description, Future<Null> testMethod()) {
+void testInMemory(String description, Future<void> testMethod()) {
   Cache.flutterRoot = getFlutterRoot();
   final FileSystem testFileSystem = MemoryFileSystem(
     style: platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix,
@@ -406,7 +406,7 @@
   }
 }
 
-Future<Null> expectToolExitLater(Future<dynamic> future, Matcher messageMatcher) async {
+Future<void> expectToolExitLater(Future<dynamic> future, Matcher messageMatcher) async {
   try {
     await future;
     fail('ToolExit expected, but nothing thrown');
diff --git a/packages/flutter_tools/test/protocol_discovery_test.dart b/packages/flutter_tools/test/protocol_discovery_test.dart
index d8499f2..c4e9050 100644
--- a/packages/flutter_tools/test/protocol_discovery_test.dart
+++ b/packages/flutter_tools/test/protocol_discovery_test.dart
@@ -240,7 +240,7 @@
   List<ForwardedPort> get forwardedPorts => throw 'not implemented';
 
   @override
-  Future<Null> unforward(ForwardedPort forwardedPort) {
+  Future<void> unforward(ForwardedPort forwardedPort) {
     throw 'not implemented';
   }
 }
diff --git a/packages/flutter_tools/test/resident_runner_test.dart b/packages/flutter_tools/test/resident_runner_test.dart
index fd50df4..30c07b8 100644
--- a/packages/flutter_tools/test/resident_runner_test.dart
+++ b/packages/flutter_tools/test/resident_runner_test.dart
@@ -18,13 +18,13 @@
   String receivedCommand;
 
   @override
-  Future<Null> cleanupAfterSignal() => null;
+  Future<void> cleanupAfterSignal() => null;
 
   @override
-  Future<Null> cleanupAtFinish() => null;
+  Future<void> cleanupAtFinish() => null;
 
   @override
-  Future<Null> handleTerminalCommand(String code) async {
+  Future<void> handleTerminalCommand(String code) async {
     receivedCommand = code;
   }
 
diff --git a/packages/flutter_tools/test/runner/flutter_command_test.dart b/packages/flutter_tools/test/runner/flutter_command_test.dart
index 2e78161..7c3464a 100644
--- a/packages/flutter_tools/test/runner/flutter_command_test.dart
+++ b/packages/flutter_tools/test/runner/flutter_command_test.dart
@@ -188,7 +188,7 @@
 
   @override
   Future<FlutterCommandResult> runCommand() async {
-    return commandFunction == null ? null : commandFunction();
+    return commandFunction == null ? null : await commandFunction();
   }
 }
 
diff --git a/packages/flutter_tools/test/src/common.dart b/packages/flutter_tools/test/src/common.dart
index 34627bf..a3e2039 100644
--- a/packages/flutter_tools/test/src/common.dart
+++ b/packages/flutter_tools/test/src/common.dart
@@ -68,7 +68,7 @@
   return fs.path.normalize(fs.path.join(toolsPath, '..', '..'));
 }
 
-CommandRunner<Null> createTestCommandRunner([FlutterCommand command]) {
+CommandRunner<void> createTestCommandRunner([FlutterCommand command]) {
   final FlutterCommandRunner runner = FlutterCommandRunner();
   if (command != null)
     runner.addCommand(command);
@@ -113,7 +113,7 @@
   arguments ??= <String>['--no-pub'];
   final String projectPath = fs.path.join(temp.path, 'flutter_project');
   final CreateCommand command = CreateCommand();
-  final CommandRunner<Null> runner = createTestCommandRunner(command);
+  final CommandRunner<void> runner = createTestCommandRunner(command);
   await runner.run(<String>['create']..addAll(arguments)..add(projectPath));
   return projectPath;
 }
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index e458d93..5721d0f 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -262,7 +262,7 @@
   Stream<Map<String, dynamic>> get onSend => null;
 
   @override
-  Future<Null> ensureAnalyticsSent() => Future<Null>.value();
+  Future<void> ensureAnalyticsSent() => Future<void>.value();
 
   @override
   void printWelcome() { }
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart
index eec77f1..a22872a 100644
--- a/packages/flutter_tools/test/src/mocks.dart
+++ b/packages/flutter_tools/test/src/mocks.dart
@@ -173,7 +173,7 @@
 /// A process that prompts the user to proceed, then asynchronously writes
 /// some lines to stdout before it exits.
 class PromptingProcess implements Process {
-  Future<Null> showPrompt(String prompt, List<String> outputLines) async {
+  Future<void> showPrompt(String prompt, List<String> outputLines) async {
     _stdoutController.add(utf8.encode(prompt));
     final List<int> bytesOnStdin = await _stdin.future;
     // Echo stdin to stdout.
@@ -234,11 +234,11 @@
   }
 
   @override
-  Future<Null> addStream(Stream<List<int>> stream) {
-    final Completer<Null> completer = Completer<Null>();
+  Future<void> addStream(Stream<List<int>> stream) {
+    final Completer<void> completer = Completer<void>();
     stream.listen((List<int> data) {
       add(data);
-    }).onDone(() => completer.complete(null));
+    }).onDone(() => completer.complete());
     return completer.future;
   }
 
@@ -275,13 +275,13 @@
   }
 
   @override
-  Future<Null> get done => close();
+  Future<void> get done => close();
 
   @override
-  Future<Null> close() async => null;
+  Future<void> close() async => null;
 
   @override
-  Future<Null> flush() async => null;
+  Future<void> flush() async => null;
 }
 
 /// A Stdio that collects stdout and supports simulated stdin.
diff --git a/packages/flutter_tools/test/utils_test.dart b/packages/flutter_tools/test/utils_test.dart
index 513a75d..17992c3 100644
--- a/packages/flutter_tools/test/utils_test.dart
+++ b/packages/flutter_tools/test/utils_test.dart
@@ -134,7 +134,7 @@
         called = true;
       }, const Duration(seconds: 1));
       expect(called, false);
-      await Future<Null>.delayed(kShortDelay);
+      await Future<void>.delayed(kShortDelay);
       expect(called, true);
     });
 
@@ -145,7 +145,7 @@
         callCount++;
       }, Duration(milliseconds: kShortDelay.inMilliseconds ~/ 2));
       expect(callCount, 0);
-      await Future<Null>.delayed(kShortDelay);
+      await Future<void>.delayed(kShortDelay);
       expect(callCount, greaterThanOrEqualTo(2));
     });
 
@@ -160,7 +160,7 @@
           completer.complete(DateTime.now().difference(firstTime));
 
         // introduce a delay
-        await Future<Null>.delayed(kShortDelay);
+        await Future<void>.delayed(kShortDelay);
       }, kShortDelay);
       final Duration duration = await completer.future;
       expect(duration, greaterThanOrEqualTo(Duration(milliseconds: kShortDelay.inMilliseconds * 2)));
diff --git a/packages/flutter_tools/tool/daemon_client.dart b/packages/flutter_tools/tool/daemon_client.dart
index d8a1d75..d064a86 100644
--- a/packages/flutter_tools/tool/daemon_client.dart
+++ b/packages/flutter_tools/tool/daemon_client.dart
@@ -18,7 +18,7 @@
 //   emulators: list emulators
 //   launch: launch an emulator
 
-Future<Null> main() async {
+Future<void> main() async {
   daemon = await Process.start('dart', <String>['bin/flutter_tools.dart', 'daemon']);
   print('daemon process started, pid: ${daemon.pid}');
 
@@ -82,7 +82,7 @@
   });
 
   // Print in the callback can't fail.
-  daemon.exitCode.then<Null>((int code) { // ignore: unawaited_futures
+  daemon.exitCode.then<void>((int code) { // ignore: unawaited_futures
     print('daemon exiting ($code)');
     exit(code);
   });