refactor context to be implicit-downcast safe (#31622)

diff --git a/packages/flutter_tools/test/application_package_test.dart b/packages/flutter_tools/test/application_package_test.dart
index ccd83c6..503701c 100644
--- a/packages/flutter_tools/test/application_package_test.dart
+++ b/packages/flutter_tools/test/application_package_test.dart
@@ -146,21 +146,21 @@
     testUsingContext('Error when parsing manifest with no Activity that has enabled set to true nor has no value for its enabled field', () {
       final ApkManifestData data = ApkManifestData.parseFromXmlDump(_aaptDataWithNoEnabledActivity);
       expect(data, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
           logger.errorText, 'Error running io.flutter.examples.hello_world. Default activity not found\n');
     }, overrides: noColorTerminalOverride);
     testUsingContext('Error when parsing manifest with no Activity that has action set to android.intent.action.MAIN', () {
       final ApkManifestData data = ApkManifestData.parseFromXmlDump(_aaptDataWithNoMainActivity);
       expect(data, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
           logger.errorText, 'Error running io.flutter.examples.hello_world. Default activity not found\n');
     }, overrides: noColorTerminalOverride);
     testUsingContext('Error when parsing manifest with no Activity that has category set to android.intent.category.LAUNCHER', () {
       final ApkManifestData data = ApkManifestData.parseFromXmlDump(_aaptDataWithNoLauncherActivity);
       expect(data, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
           logger.errorText, 'Error running io.flutter.examples.hello_world. Default activity not found\n');
     }, overrides: noColorTerminalOverride);
@@ -176,7 +176,7 @@
       final PrebuiltIOSApp iosApp =
           IOSApp.fromPrebuiltApp(fs.file('not_existing.ipa'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
         logger.errorText,
         'File "not_existing.ipa" does not exist. Use an app bundle or an ipa.\n',
@@ -187,7 +187,7 @@
       final PrebuiltIOSApp iosApp =
           IOSApp.fromPrebuiltApp(fs.file('regular_folder'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
           logger.errorText, 'Folder "regular_folder" is not an app bundle.\n');
     }, overrides: overrides);
@@ -195,7 +195,7 @@
       fs.directory('bundle.app').createSync();
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
         logger.errorText,
         'Invalid prebuilt iOS app. Does not contain Info.plist.\n',
@@ -206,7 +206,7 @@
       fs.file('bundle.app/Info.plist').writeAsStringSync(badPlistData);
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
         logger.errorText,
         contains(
@@ -217,7 +217,7 @@
       fs.directory('bundle.app').createSync();
       fs.file('bundle.app/Info.plist').writeAsStringSync(plistData);
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('bundle.app'));
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(logger.errorText, isEmpty);
       expect(iosApp.bundleDir.path, 'bundle.app');
       expect(iosApp.id, 'fooBundleId');
@@ -228,7 +228,7 @@
       when(os.unzip(fs.file('app.ipa'), any)).thenAnswer((Invocation _) { });
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(
         logger.errorText,
         'Invalid prebuilt iOS ipa. Does not contain a "Payload" directory.\n',
@@ -251,7 +251,7 @@
       });
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa'));
       expect(iosApp, isNull);
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(logger.errorText,
           'Invalid prebuilt iOS ipa. Does not contain a single app bundle.\n');
     }, overrides: overrides);
@@ -271,7 +271,7 @@
             .writeAsStringSync(plistData);
       });
       final PrebuiltIOSApp iosApp = IOSApp.fromPrebuiltApp(fs.file('app.ipa'));
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(logger.errorText, isEmpty);
       expect(iosApp.bundleDir.path, endsWith('bundle.app'));
       expect(iosApp.id, 'fooBundleId');
diff --git a/packages/flutter_tools/test/base/context_test.dart b/packages/flutter_tools/test/base/context_test.dart
index 9b05cbc..db2692b 100644
--- a/packages/flutter_tools/test/base/context_test.dart
+++ b/packages/flutter_tools/test/base/context_test.dart
@@ -80,7 +80,7 @@
         await context.run<void>(
           body: () {
             outer.future.then<void>((_) {
-              value = context[String];
+              value = context.get<String>();
               inner.complete();
             });
           },
@@ -99,10 +99,10 @@
         String value;
         await context.run<void>(
           body: () async {
-            final StringBuffer buf = StringBuffer(context[String]);
-            buf.write(context[String]);
+            final StringBuffer buf = StringBuffer(context.get<String>());
+            buf.write(context.get<String>());
             await context.run<void>(body: () {
-              buf.write(context[String]);
+              buf.write(context.get<String>());
             });
             value = buf.toString();
           },
@@ -122,10 +122,10 @@
         String value;
         await context.run(
           body: () async {
-            final StringBuffer buf = StringBuffer(context[String]);
-            buf.write(context[String]);
+            final StringBuffer buf = StringBuffer(context.get<String>());
+            buf.write(context.get<String>());
             await context.run<void>(body: () {
-              buf.write(context[String]);
+              buf.write(context.get<String>());
             });
             value = buf.toString();
           },
@@ -142,7 +142,7 @@
 
       test('returns null if generated value is null', () async {
         final String value = await context.run<String>(
-          body: () => context[String],
+          body: () => context.get<String>(),
           overrides: <Type, Generator>{
             String: () => null,
           },
@@ -153,12 +153,12 @@
       test('throws if generator has dependency cycle', () async {
         final Future<String> value = context.run<String>(
           body: () async {
-            return context[String];
+            return context.get<String>();
           },
           fallbacks: <Type, Generator>{
-            int: () => int.parse(context[String]),
-            String: () => '${context[double]}',
-            double: () => (context[int] as int) * 1.0, // ignore: avoid_as
+            int: () => int.parse(context.get<String>()),
+            String: () => '${context.get<double>()}',
+            double: () => context.get<int>() * 1.0,
           },
         );
         try {
@@ -197,7 +197,7 @@
               return context.run<String>(
                 body: () {
                   called = true;
-                  return context[String];
+                  return context.get<String>();
                 },
                 fallbacks: <Type, Generator>{
                   String: () => 'child',
@@ -216,7 +216,7 @@
               return context.run<String>(
                 body: () {
                   called = true;
-                  return context[String];
+                  return context.get<String>();
                 },
                 fallbacks: <Type, Generator>{
                   String: () {
@@ -238,11 +238,11 @@
         test('may depend on one another', () async {
           final String value = await context.run<String>(
             body: () {
-              return context[String];
+              return context.get<String>();
             },
             fallbacks: <Type, Generator>{
               int: () => 123,
-              String: () => '-${context[int]}-',
+              String: () => '-${context.get<int>()}-',
             },
           );
           expect(value, '-123-');
@@ -255,7 +255,7 @@
           final String value = await context.run<String>(
             body: () {
               return context.run<String>(
-                body: () => context[String],
+                body: () => context.get<String>(),
                 overrides: <Type, Generator>{
                   String: () => 'child',
                 },
diff --git a/packages/flutter_tools/test/base/logger_test.dart b/packages/flutter_tools/test/base/logger_test.dart
index e650ce5..c878855 100644
--- a/packages/flutter_tools/test/base/logger_test.dart
+++ b/packages/flutter_tools/test/base/logger_test.dart
@@ -163,7 +163,7 @@
       testUsingContext('Stdout startProgress on colored terminal for $testOs', () async {
         bool done = false;
         FakeAsync().run((FakeAsync time) {
-          final Logger logger = context[Logger];
+          final Logger logger = context.get<Logger>();
           final Status status = logger.startProgress(
             'Hello',
             progressId: null,
@@ -191,7 +191,7 @@
       testUsingContext('Stdout startProgress on colored terminal pauses on $testOs', () async {
         bool done = false;
         FakeAsync().run((FakeAsync time) {
-          final Logger logger = context[Logger];
+          final Logger logger = context.get<Logger>();
           final Status status = logger.startProgress(
             'Knock Knock, Who\'s There',
             timeout: const Duration(days: 10),
@@ -368,7 +368,7 @@
     List<String> outputStderr() => mockStdio.writtenToStderr.join('').split('\n');
 
     testUsingContext('Error logs are wrapped', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printError('0123456789' * 15);
       final List<String> lines = outputStderr();
       expect(outputStdout().length, equals(1));
@@ -385,7 +385,7 @@
     });
 
     testUsingContext('Error logs are wrapped and can be indented.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printError('0123456789' * 15, indent: 5);
       final List<String> lines = outputStderr();
       expect(outputStdout().length, equals(1));
@@ -405,7 +405,7 @@
     });
 
     testUsingContext('Error logs are wrapped and can have hanging indent.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printError('0123456789' * 15, hangingIndent: 5);
       final List<String> lines = outputStderr();
       expect(outputStdout().length, equals(1));
@@ -425,7 +425,7 @@
     });
 
     testUsingContext('Error logs are wrapped, indented, and can have hanging indent.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printError('0123456789' * 15, indent: 4, hangingIndent: 5);
       final List<String> lines = outputStderr();
       expect(outputStdout().length, equals(1));
@@ -445,7 +445,7 @@
     });
 
     testUsingContext('Stdout logs are wrapped', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus('0123456789' * 15);
       final List<String> lines = outputStdout();
       expect(outputStderr().length, equals(1));
@@ -462,7 +462,7 @@
     });
 
     testUsingContext('Stdout logs are wrapped and can be indented.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus('0123456789' * 15, indent: 5);
       final List<String> lines = outputStdout();
       expect(outputStderr().length, equals(1));
@@ -482,7 +482,7 @@
     });
 
     testUsingContext('Stdout logs are wrapped and can have hanging indent.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus('0123456789' * 15, hangingIndent: 5);
       final List<String> lines = outputStdout();
       expect(outputStderr().length, equals(1));
@@ -502,7 +502,7 @@
     });
 
     testUsingContext('Stdout logs are wrapped, indented, and can have hanging indent.', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus('0123456789' * 15, indent: 4, hangingIndent: 5);
       final List<String> lines = outputStdout();
       expect(outputStderr().length, equals(1));
@@ -522,7 +522,7 @@
     });
 
     testUsingContext('Error logs are red', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printError('Pants on fire!');
       final List<String> lines = outputStderr();
       expect(outputStdout().length, equals(1));
@@ -536,7 +536,7 @@
     });
 
     testUsingContext('Stdout logs are not colored', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus('All good.');
       final List<String> lines = outputStdout();
       expect(outputStderr().length, equals(1));
@@ -549,7 +549,7 @@
     });
 
     testUsingContext('Stdout printStatus handle null inputs on colored terminal', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus(
         null,
         emphasis: null,
@@ -568,7 +568,7 @@
     });
 
     testUsingContext('Stdout printStatus handle null inputs on non-color terminal', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.printStatus(
         null,
         emphasis: null,
@@ -590,7 +590,7 @@
     testUsingContext('Stdout startProgress on non-color terminal', () async {
       bool done = false;
       FakeAsync().run((FakeAsync time) {
-        final Logger logger = context[Logger];
+        final Logger logger = context.get<Logger>();
         final Status status = logger.startProgress(
           'Hello',
           progressId: null,
@@ -661,7 +661,7 @@
     }, overrides: <Type, Generator>{Stdio: () => mockStdio, Platform: _kNoAnsiPlatform});
 
     testUsingContext('sequential startProgress calls with StdoutLogger', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.startProgress('AAA', timeout: timeoutConfiguration.fastOperation)..stop();
       logger.startProgress('BBB', timeout: timeoutConfiguration.fastOperation)..stop();
       final List<String> output = outputStdout();
@@ -679,7 +679,7 @@
     });
 
     testUsingContext('sequential startProgress calls with VerboseLogger and StdoutLogger', () async {
-      final Logger logger = context[Logger];
+      final Logger logger = context.get<Logger>();
       logger.startProgress('AAA', timeout: timeoutConfiguration.fastOperation)..stop();
       logger.startProgress('BBB', timeout: timeoutConfiguration.fastOperation)..stop();
       expect(outputStdout(), <Matcher>[
@@ -696,7 +696,7 @@
     });
 
     testUsingContext('sequential startProgress calls with BufferLogger', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       logger.startProgress('AAA', timeout: timeoutConfiguration.fastOperation)..stop();
       logger.startProgress('BBB', timeout: timeoutConfiguration.fastOperation)..stop();
       expect(logger.statusText, 'AAA\nBBB\n');
diff --git a/packages/flutter_tools/test/commands/config_test.dart b/packages/flutter_tools/test/commands/config_test.dart
index c93c204..78828b4 100644
--- a/packages/flutter_tools/test/commands/config_test.dart
+++ b/packages/flutter_tools/test/commands/config_test.dart
@@ -25,7 +25,7 @@
 
   group('config', () {
     testUsingContext('machine flag', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       final ConfigCommand command = ConfigCommand();
       await command.handleMachine();
 
diff --git a/packages/flutter_tools/test/compile_test.dart b/packages/flutter_tools/test/compile_test.dart
index 5ec7075..a47ef0a 100644
--- a/packages/flutter_tools/test/compile_test.dart
+++ b/packages/flutter_tools/test/compile_test.dart
@@ -114,7 +114,7 @@
     });
 
     testUsingContext('single dart successful compilation', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       when(mockFrontendServer.stdout)
           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
             Future<List<int>>.value(utf8.encode(
@@ -137,7 +137,7 @@
     });
 
     testUsingContext('single dart failed compilation', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       when(mockFrontendServer.stdout)
           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
@@ -163,7 +163,7 @@
     testUsingContext('single dart abnormal compiler termination', () async {
       when(mockFrontendServer.exitCode).thenAnswer((_) async => 255);
 
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       when(mockFrontendServer.stdout)
           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
@@ -221,7 +221,7 @@
     });
 
     testUsingContext('single dart compile', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       when(mockFrontendServer.stdout)
           .thenAnswer((Invocation invocation) => Stream<List<int>>.fromFuture(
@@ -265,7 +265,7 @@
     });
 
     testUsingContext('compile and recompile', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       final StreamController<List<int>> streamController = StreamController<List<int>>();
       when(mockFrontendServer.stdout)
@@ -309,7 +309,7 @@
     });
 
     testUsingContext('compile and recompile twice', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       final StreamController<List<int>> streamController = StreamController<List<int>>();
       when(mockFrontendServer.stdout)
@@ -380,7 +380,7 @@
     });
 
     testUsingContext('compile single expression', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       final Completer<List<int>> compileResponseCompleter =
           Completer<List<int>>();
@@ -432,7 +432,7 @@
     });
 
     testUsingContext('compile expressions without awaiting', () async {
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
 
       final Completer<List<int>> compileResponseCompleter = Completer<List<int>>();
       final Completer<List<int>> compileExpressionResponseCompleter1 = Completer<List<int>>();
diff --git a/packages/flutter_tools/test/crash_reporting_test.dart b/packages/flutter_tools/test/crash_reporting_test.dart
index 90ee335..01aa924 100644
--- a/packages/flutter_tools/test/crash_reporting_test.dart
+++ b/packages/flutter_tools/test/crash_reporting_test.dart
@@ -109,7 +109,7 @@
       expect(fields['error_runtime_type'], 'StateError');
       expect(fields['error_message'], 'Bad state: Test bad state error');
 
-      final BufferLogger logger = context[Logger];
+      final BufferLogger logger = context.get<Logger>();
       expect(logger.statusText, 'Sending crash report to Google.\n'
           'Crash report sent (report ID: test-report-id)\n');
 
diff --git a/packages/flutter_tools/test/dart/pub_get_test.dart b/packages/flutter_tools/test/dart/pub_get_test.dart
index eb09f26..ef278b3 100644
--- a/packages/flutter_tools/test/dart/pub_get_test.dart
+++ b/packages/flutter_tools/test/dart/pub_get_test.dart
@@ -27,7 +27,7 @@
   testUsingContext('pub get 69', () async {
     String error;
 
-    final MockProcessManager processMock = context[ProcessManager];
+    final MockProcessManager processMock = context.get<ProcessManager>();
 
     FakeAsync().run((FakeAsync time) {
       expect(processMock.lastPubEnvironment, isNull);
@@ -95,8 +95,8 @@
   testUsingContext('pub cache in root is used', () async {
     String error;
 
-    final MockProcessManager processMock = context[ProcessManager];
-    final MockFileSystem fsMock = context[FileSystem];
+    final MockProcessManager processMock = context.get<ProcessManager>() as MockProcessManager;
+    final MockFileSystem fsMock = context.get<FileSystem>() as MockFileSystem;
 
     FakeAsync().run((FakeAsync time) {
       MockDirectory.findCache = true;
@@ -122,7 +122,7 @@
   testUsingContext('pub cache in environment is used', () async {
     String error;
 
-    final MockProcessManager processMock = context[ProcessManager];
+    final MockProcessManager processMock = context.get<ProcessManager>();
 
     FakeAsync().run((FakeAsync time) {
       MockDirectory.findCache = true;
diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart
index 7203676..8e9e3a8 100644
--- a/packages/flutter_tools/test/src/context.dart
+++ b/packages/flutter_tools/test/src/context.dart
@@ -30,10 +30,10 @@
 export 'package:flutter_tools/src/base/context.dart' show Generator;
 
 /// Return the test logger. This assumes that the current Logger is a BufferLogger.
-BufferLogger get testLogger => context[Logger];
+BufferLogger get testLogger => context.get<Logger>();
 
-MockDeviceManager get testDeviceManager => context[DeviceManager];
-MockDoctor get testDoctor => context[Doctor];
+MockDeviceManager get testDeviceManager => context.get<DeviceManager>();
+MockDoctor get testDoctor => context.get<Doctor>();
 
 typedef ContextInitializer = void Function(AppContext testContext);
 
@@ -126,8 +126,8 @@
 }
 
 void _printBufferedErrors(AppContext testContext) {
-  if (testContext[Logger] is BufferLogger) {
-    final BufferLogger bufferLogger = testContext[Logger];
+  if (testContext.get<Logger>() is BufferLogger) {
+    final BufferLogger bufferLogger = testContext.get<Logger>();
     if (bufferLogger.errorText.isNotEmpty)
       print(bufferLogger.errorText);
     bufferLogger.clear();
diff --git a/packages/flutter_tools/test/version_test.dart b/packages/flutter_tools/test/version_test.dart
index 328e703..312d889 100644
--- a/packages/flutter_tools/test/version_test.dart
+++ b/packages/flutter_tools/test/version_test.dart
@@ -414,7 +414,7 @@
 }
 
 void _expectVersionMessage(String message) {
-  final BufferLogger logger = context[Logger];
+  final BufferLogger logger = context.get<Logger>();
   expect(logger.statusText.trim(), message.trim());
   logger.clear();
 }