diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index 9f6f61e54110..39a1ebf24f3e 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// @dart = 2.8
-
 import 'dart:async';
 
 import 'package:flutter_tools/src/android/android_workflow.dart';
@@ -36,6 +34,7 @@ import 'package:flutter_tools/src/reporting/crash_reporting.dart';
 import 'package:flutter_tools/src/reporting/reporting.dart';
 import 'package:flutter_tools/src/version.dart';
 import 'package:meta/meta.dart';
+import 'package:test/fake.dart';
 
 import 'common.dart';
 import 'fake_http_client.dart';
@@ -48,9 +47,9 @@ export 'package:flutter_tools/src/base/context.dart' show Generator;
 export 'fake_process_manager.dart' show ProcessManager, FakeProcessManager, FakeCommand;
 
 /// Return the test logger. This assumes that the current Logger is a BufferLogger.
-BufferLogger get testLogger => context.get<Logger>() as BufferLogger;
+BufferLogger get testLogger => context.get<Logger>()! as BufferLogger;
 
-FakeDeviceManager get testDeviceManager => context.get<DeviceManager>() as FakeDeviceManager;
+FakeDeviceManager get testDeviceManager => context.get<DeviceManager>()! as FakeDeviceManager;
 
 @isTest
 void testUsingContext(
@@ -58,8 +57,8 @@ void testUsingContext(
   dynamic Function() testMethod, {
   Map<Type, Generator> overrides = const <Type, Generator>{},
   bool initializeFlutterRoot = true,
-  String testOn,
-  bool skip, // should default to `false`, but https://github.com/dart-lang/test/issues/545 doesn't allow this
+  String? testOn,
+  bool? skip, // should default to `false`, but https://github.com/dart-lang/test/issues/545 doesn't allow this
 }) {
   if (overrides[FileSystem] != null && overrides[ProcessManager] == null) {
     throw StateError(
@@ -74,10 +73,10 @@ void testUsingContext(
 
   // Ensure we don't rely on the default [Config] constructor which will
   // leak a sticky $HOME/.flutter_settings behind!
-  Directory configDir;
+  Directory? configDir;
   tearDown(() {
     if (configDir != null) {
-      tryToDelete(configDir);
+      tryToDelete(configDir!);
       configDir = null;
     }
   });
@@ -92,7 +91,7 @@ void testUsingContext(
   PersistentToolState buildPersistentToolState(FileSystem fs) {
     configDir ??= globals.fs.systemTempDirectory.createTempSync('flutter_config_dir_test.');
     return PersistentToolState.test(
-      directory: configDir,
+      directory: configDir!,
       logger: globals.logger,
     );
   }
@@ -172,7 +171,7 @@ void testUsingContext(
 
 void _printBufferedErrors(AppContext testContext) {
   if (testContext.get<Logger>() is BufferLogger) {
-    final BufferLogger bufferLogger = testContext.get<Logger>() as BufferLogger;
+    final BufferLogger bufferLogger = testContext.get<Logger>()! as BufferLogger;
     if (bufferLogger.errorText.isNotEmpty) {
       // This is where the logger outputting errors is implemented, so it has
       // to use `print`.
@@ -185,10 +184,10 @@ void _printBufferedErrors(AppContext testContext) {
 class FakeDeviceManager implements DeviceManager {
   List<Device> devices = <Device>[];
 
-  String _specifiedDeviceId;
+  String? _specifiedDeviceId;
 
   @override
-  String get specifiedDeviceId {
+  String? get specifiedDeviceId {
     if (_specifiedDeviceId == null || _specifiedDeviceId == 'all') {
       return null;
     }
@@ -196,7 +195,7 @@ class FakeDeviceManager implements DeviceManager {
   }
 
   @override
-  set specifiedDeviceId(String id) {
+  set specifiedDeviceId(String? id) {
     _specifiedDeviceId = id;
   }
 
@@ -212,7 +211,7 @@ class FakeDeviceManager implements DeviceManager {
   Future<List<Device>> getAllConnectedDevices() async => devices;
 
   @override
-  Future<List<Device>> refreshAllConnectedDevices({ Duration timeout }) async => devices;
+  Future<List<Device>> refreshAllConnectedDevices({ Duration? timeout }) async => devices;
 
   @override
   Future<List<Device>> getDevicesById(String deviceId) async {
@@ -222,7 +221,7 @@ class FakeDeviceManager implements DeviceManager {
   @override
   Future<List<Device>> getDevices() {
     return hasSpecifiedDeviceId
-        ? getDevicesById(specifiedDeviceId)
+        ? getDevicesById(specifiedDeviceId!)
         : getAllConnectedDevices();
   }
 
@@ -238,17 +237,17 @@ class FakeDeviceManager implements DeviceManager {
   List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[];
 
   @override
-  bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) {
-    return device.isSupportedForProject(flutterProject);
+  bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) {
+    return device.isSupportedForProject(flutterProject!);
   }
 
   @override
-  Future<List<Device>> findTargetDevices(FlutterProject flutterProject, { Duration timeout }) async {
+  Future<List<Device>> findTargetDevices(FlutterProject? flutterProject, { Duration? timeout }) async {
     return devices;
   }
 }
 
-class FakeAndroidLicenseValidator extends AndroidLicenseValidator {
+class FakeAndroidLicenseValidator extends Fake implements AndroidLicenseValidator {
   @override
   Future<LicensesAccepted> get licensesAccepted async => LicensesAccepted.all;
 }
@@ -302,7 +301,7 @@ class FakeXcodeProjectInterpreter implements XcodeProjectInterpreter {
   @override
   Future<Map<String, String>> getBuildSettings(
     String projectPath, {
-    XcodeProjectBuildContext buildContext,
+    XcodeProjectBuildContext? buildContext,
     Duration timeout = const Duration(minutes: 1),
   }) async {
     return <String, String>{};
@@ -313,14 +312,14 @@ class FakeXcodeProjectInterpreter implements XcodeProjectInterpreter {
       Directory podXcodeProject, {
         Duration timeout = const Duration(minutes: 1),
       }) async {
-    return null;
+    return '';
   }
 
   @override
   Future<void> cleanWorkspace(String workspacePath, String scheme, { bool verbose = false }) async { }
 
   @override
-  Future<XcodeProjectInfo> getInfo(String projectPath, {String projectFilename}) async {
+  Future<XcodeProjectInfo> getInfo(String projectPath, {String? projectFilename}) async {
     return XcodeProjectInfo(
       <String>['Runner'],
       <String>['Debug', 'Release'],
@@ -358,7 +357,7 @@ class LocalFileSystemBlockingSetCurrentDirectory extends LocalFileSystem {
 class FakeSignals implements Signals {
   @override
   Object addHandler(ProcessSignal signal, SignalHandler handler) {
-    return null;
+    return Object();
   }
 
   @override
diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart
index c47037803b78..ba8451212462 100644
--- a/packages/flutter_tools/test/src/testbed.dart
+++ b/packages/flutter_tools/test/src/testbed.dart
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// @dart = 2.8
-
 import 'dart:async';
 import 'dart:io';
 
@@ -81,18 +79,18 @@ class Testbed {
   /// `overrides` provides more overrides in addition to the test defaults.
   /// `setup` may be provided to apply mocks within the tool managed zone,
   /// including any specified overrides.
-  Testbed({FutureOr<void> Function() setup, Map<Type, Generator> overrides})
+  Testbed({FutureOr<void> Function()? setup, Map<Type, Generator>? overrides})
       : _setup = setup,
         _overrides = overrides;
 
-  final FutureOr<void> Function() _setup;
-  final Map<Type, Generator> _overrides;
+  final FutureOr<void> Function()? _setup;
+  final Map<Type, Generator>? _overrides;
 
   /// Runs `test` within a tool zone.
   ///
   /// `overrides` may be used to provide new context values for the single test
   /// case or override any context values from the setup.
-  Future<T> run<T>(FutureOr<T> Function() test, {Map<Type, Generator> overrides}) {
+  Future<T?> run<T>(FutureOr<T> Function() test, {Map<Type, Generator>? overrides}) {
     final Map<Type, Generator> testOverrides = <Type, Generator>{
       ..._testbedDefaults,
       // Add the initial setUp overrides
@@ -104,13 +102,13 @@ class Testbed {
       throw StateError('Do not inject ProcessUtils for testing, use ProcessManager instead.');
     }
     // Cache the original flutter root to restore after the test case.
-    final String originalFlutterRoot = Cache.flutterRoot;
+    final String? originalFlutterRoot = Cache.flutterRoot;
     // Track pending timers to verify that they were correctly cleaned up.
     final Map<Timer, StackTrace> timers = <Timer, StackTrace>{};
 
     return HttpOverrides.runZoned(() {
-      return runInContext<T>(() {
-        return context.run<T>(
+      return runInContext<T?>(() {
+        return context.run<T?>(
           name: 'testbed',
           overrides: testOverrides,
           zoneSpecification: ZoneSpecification(
@@ -128,7 +126,7 @@ class Testbed {
           body: () async {
             Cache.flutterRoot = '';
             if (_setup != null) {
-              await _setup();
+              await _setup?.call();
             }
             await test();
             Cache.flutterRoot = originalFlutterRoot;
@@ -140,6 +138,6 @@ class Testbed {
             return null;
           });
       });
-    }, createHttpClient: (SecurityContext c) => FakeHttpClient.any());
+    }, createHttpClient: (SecurityContext? c) => FakeHttpClient.any());
   }
 }