diff --git a/dev/benchmarks/macrobenchmarks/lib/src/cubic_bezier.dart b/dev/benchmarks/macrobenchmarks/lib/src/cubic_bezier.dart
index 75038c7..766c697 100644
--- a/dev/benchmarks/macrobenchmarks/lib/src/cubic_bezier.dart
+++ b/dev/benchmarks/macrobenchmarks/lib/src/cubic_bezier.dart
@@ -278,7 +278,7 @@
 
   //From http://wiki.roblox.com/index.php?title=File:Beziereq4.png
   double _getCubicPoint(double t, double p0, double p1, double p2, double p3) {
-    return pow(1 - t, 3) * p0 +
+    return (pow(1 - t, 3) as double) * p0 +
         3 * pow(1 - t, 2) * t * p1 +
         3 * (1 - t) * pow(t, 2) * p2 +
         pow(t, 3) * p3;
diff --git a/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart b/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
index 8d04628..d1b841d 100644
--- a/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/stocks/build_bench.dart
@@ -19,7 +19,7 @@
 
   // We control the framePolicy below to prevent us from scheduling frames in
   // the engine, so that the engine does not interfere with our timings.
-  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
+  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as LiveTestWidgetsFlutterBinding;
 
   final Stopwatch watch = Stopwatch();
   int iterations = 0;
diff --git a/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart b/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
index 0fdfa44..1350949 100644
--- a/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
+++ b/dev/benchmarks/microbenchmarks/lib/stocks/layout_bench.dart
@@ -20,7 +20,7 @@
 
   // We control the framePolicy below to prevent us from scheduling frames in
   // the engine, so that the engine does not interfere with our timings.
-  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized();
+  final LiveTestWidgetsFlutterBinding binding = TestWidgetsFlutterBinding.ensureInitialized() as LiveTestWidgetsFlutterBinding;
 
   final Stopwatch watch = Stopwatch();
   int iterations = 0;
diff --git a/dev/bots/analyze-sample-code.dart b/dev/bots/analyze-sample-code.dart
index ba2a2d0..445871a 100644
--- a/dev/bots/analyze-sample-code.dart
+++ b/dev/bots/analyze-sample-code.dart
@@ -78,7 +78,7 @@
 
   final ArgResults parsedArguments = argParser.parse(arguments);
 
-  if (parsedArguments['help']) {
+  if (parsedArguments['help'] as bool) {
     print(argParser.usage);
     exit(0);
   }
@@ -93,8 +93,9 @@
 
   Directory tempDirectory;
   if (parsedArguments.wasParsed('temp')) {
-    tempDirectory = Directory(path.join(Directory.systemTemp.absolute.path, path.basename(parsedArguments['temp'])));
-    if (path.basename(parsedArguments['temp']) != parsedArguments['temp']) {
+    final String tempArg = parsedArguments['temp'] as String;
+    tempDirectory = Directory(path.join(Directory.systemTemp.absolute.path, path.basename(tempArg)));
+    if (path.basename(tempArg) != tempArg) {
       stderr.writeln('Supplied temporary directory name should be a name, not a path. Using ${tempDirectory.absolute.path} instead.');
     }
     print('Leaving temporary output in ${tempDirectory.absolute.path}.');
@@ -106,7 +107,11 @@
     tempDirectory.createSync();
   }
   try {
-    exitCode = SampleChecker(flutterPackage, tempDirectory: tempDirectory, verbose: parsedArguments['verbose']).checkSamples();
+    exitCode = SampleChecker(
+      flutterPackage,
+      tempDirectory: tempDirectory,
+      verbose: parsedArguments['verbose'] as bool,
+    ).checkSamples();
   } on SampleCheckerException catch (e) {
     stderr.write(e);
     exit(1);
diff --git a/dev/bots/analyze.dart b/dev/bots/analyze.dart
index f711dea..15a68b4 100644
--- a/dev/bots/analyze.dart
+++ b/dev/bots/analyze.dart
@@ -290,10 +290,11 @@
 Future<void> verifyNoTestImports(String workingDirectory) async {
   final List<String> errors = <String>[];
   assert("// foo\nimport 'binding_test.dart' as binding;\n'".contains(_testImportPattern));
-  for (FileSystemEntity entity in Directory(path.join(workingDirectory, 'packages'))
+  final Iterable<File> dartFiles = Directory(path.join(workingDirectory, 'packages'))
     .listSync(recursive: true)
-    .where((FileSystemEntity entity) => entity is File && path.extension(entity.path) == '.dart')) {
-    final File file = entity;
+    .whereType<File>()
+    .where((File file) => path.extension(file.path) == '.dart');
+  for (File file in dartFiles) {
     for (String line in file.readAsLinesSync()) {
       final Match match = _testImportPattern.firstMatch(line);
       if (match != null && !_exemptTestImports.contains(match.group(2)))
@@ -316,11 +317,9 @@
   final List<String> shims = <String>[];
   final List<String> errors = Directory(workingDirectory)
     .listSync(recursive: true)
-    .where((FileSystemEntity entity) {
-      return entity is File && entity.path.endsWith('.dart');
-    })
-    .map<String>((FileSystemEntity entity) {
-      final File file = entity;
+    .whereType<File>()
+    .where((File file) => file.path.endsWith('.dart'))
+    .map<String>((File file) {
       final String name = Uri.file(path.relative(file.path,
           from: workingDirectory)).toFilePath(windows: false);
       if (name.startsWith('bin/cache') ||
@@ -395,14 +394,10 @@
 
   final Map<String, List<File>> packageToRegistrants = <String, List<File>>{};
 
-  for (FileSystemEntity entity in flutterRootDir.listSync(recursive: true)) {
-    if (entity is! File)
-      continue;
-    if (_isGeneratedPluginRegistrant(entity)) {
-      final String package = _getPackageFor(entity, flutterRootDir);
-      final List<File> registrants = packageToRegistrants.putIfAbsent(package, () => <File>[]);
-      registrants.add(entity);
-    }
+  for (File file in flutterRootDir.listSync(recursive: true).whereType<File>().where(_isGeneratedPluginRegistrant)) {
+    final String package = _getPackageFor(file, flutterRootDir);
+    final List<File> registrants = packageToRegistrants.putIfAbsent(package, () => <File>[]);
+    registrants.add(file);
   }
 
   final Set<String> outOfDate = <String>{};
@@ -497,10 +492,11 @@
 
 Future<void> verifyNoBadImportsInFlutterTools(String workingDirectory) async {
   final List<String> errors = <String>[];
-  for (FileSystemEntity entity in Directory(path.join(workingDirectory, 'packages', 'flutter_tools', 'lib'))
+  final Iterable<File> files = Directory(path.join(workingDirectory, 'packages', 'flutter_tools', 'lib'))
     .listSync(recursive: true)
-    .where((FileSystemEntity entity) => entity is File && path.extension(entity.path) == '.dart')) {
-    final File file = entity;
+    .whereType<File>()
+    .where((File file) => path.extension(file.path) == '.dart');
+  for (File file in files) {
     if (file.readAsStringSync().contains('package:flutter_tools/')) {
       errors.add('$yellow${file.path}$reset imports flutter_tools.');
     }
@@ -745,31 +741,33 @@
 final RegExp _importMetaPattern = RegExp(r'''^\s*import (['"])package:meta/meta\.dart\1''');
 
 Set<String> _findFlutterDependencies(String srcPath, List<String> errors, { bool checkForMeta = false }) {
-  return Directory(srcPath).listSync(recursive: true).where((FileSystemEntity entity) {
-    return entity is File && path.extension(entity.path) == '.dart';
-  }).map<Set<String>>((FileSystemEntity entity) {
-    final Set<String> result = <String>{};
-    final File file = entity;
-    for (String line in file.readAsLinesSync()) {
-      Match match = _importPattern.firstMatch(line);
-      if (match != null)
-        result.add(match.group(2));
-      if (checkForMeta) {
-        match = _importMetaPattern.firstMatch(line);
-        if (match != null) {
-          errors.add(
-            '${file.path}\nThis package imports the ${yellow}meta$reset package.\n'
-            'You should instead import the "foundation.dart" library.'
-          );
+  return Directory(srcPath)
+    .listSync(recursive: true)
+    .whereType<File>()
+    .where((File file) => path.extension(file.path) == '.dart')
+    .map<Set<String>>((File file) {
+      final Set<String> result = <String>{};
+      for (String line in file.readAsLinesSync()) {
+        Match match = _importPattern.firstMatch(line);
+        if (match != null)
+          result.add(match.group(2));
+        if (checkForMeta) {
+          match = _importMetaPattern.firstMatch(line);
+          if (match != null) {
+            errors.add(
+              '${file.path}\nThis package imports the ${yellow}meta$reset package.\n'
+              'You should instead import the "foundation.dart" library.'
+            );
+          }
         }
       }
-    }
-    return result;
-  }).reduce((Set<String> value, Set<String> element) {
-    value ??= <String>{};
-    value.addAll(element);
-    return value;
-  });
+      return result;
+    })
+    .reduce((Set<String> value, Set<String> element) {
+      value ??= <String>{};
+      value.addAll(element);
+      return value;
+    });
 }
 
 List<T> _deepSearch<T>(Map<T, Set<T>> map, T start, [ Set<T> seen ]) {
diff --git a/dev/bots/flutter_compact_formatter.dart b/dev/bots/flutter_compact_formatter.dart
index 5462808..5a4bbf6 100644
--- a/dev/bots/flutter_compact_formatter.dart
+++ b/dev/bots/flutter_compact_formatter.dart
@@ -82,9 +82,9 @@
       print(raw);
       return null;
     }
-    final Map<String, dynamic> decoded = json.decode(raw);
+    final Map<String, dynamic> decoded = json.decode(raw) as Map<String, dynamic>;
     final TestResult originalResult = _tests[decoded['testID']];
-    switch (decoded['type']) {
+    switch (decoded['type'] as String) {
       case 'done':
         stdout.write(_clearLine);
         stdout.write('$_bold${_stopwatch.elapsed}$_noColor ');
@@ -92,7 +92,7 @@
             '$_green+$successes $_yellow~$skips $_red-$failures:$_bold$_gray Done.$_noColor');
         break;
       case 'testStart':
-        final Map<String, dynamic> testData = decoded['test'];
+        final Map<String, dynamic> testData = decoded['test'] as Map<String, dynamic>;
         if (testData['url'] == null) {
           started += 1;
           stdout.write(_clearLine);
@@ -101,20 +101,20 @@
               '$_green+$successes $_yellow~$skips $_red-$failures: $_gray${testData['name']}$_noColor');
           break;
         }
-        _tests[testData['id']] = TestResult(
-          id: testData['id'],
-          name: testData['name'],
-          line: testData['root_line'] ?? testData['line'],
-          column: testData['root_column'] ?? testData['column'],
-          path: testData['root_url'] ?? testData['url'],
-          startTime: decoded['time'],
+        _tests[testData['id'] as int] = TestResult(
+          id: testData['id'] as int,
+          name: testData['name'] as String,
+          line: testData['root_line'] as int ?? testData['line'] as int,
+          column: testData['root_column'] as int ?? testData['column'] as int,
+          path: testData['root_url'] as String ?? testData['url'] as String,
+          startTime: decoded['time'] as int,
         );
         break;
       case 'testDone':
         if (originalResult == null) {
           break;
         }
-        originalResult.endTime = decoded['time'];
+        originalResult.endTime = decoded['time'] as int;
         if (decoded['skipped'] == true) {
           skips += 1;
           originalResult.status = TestStatus.skipped;
@@ -129,8 +129,8 @@
         }
         break;
       case 'error':
-        final String error = decoded['error'];
-        final String stackTrace = decoded['stackTrace'];
+        final String error = decoded['error'] as String;
+        final String stackTrace = decoded['stackTrace'] as String;
         if (originalResult != null) {
           originalResult.errorMessage = error;
           originalResult.stackTrace = stackTrace;
@@ -143,7 +143,7 @@
         break;
       case 'print':
         if (originalResult != null) {
-          originalResult.messages.add(decoded['message']);
+          originalResult.messages.add(decoded['message'] as String);
         }
         break;
       case 'group':
diff --git a/dev/bots/prepare_package.dart b/dev/bots/prepare_package.dart
index 7b85d32..ce9bad7 100644
--- a/dev/bots/prepare_package.dart
+++ b/dev/bots/prepare_package.dart
@@ -39,7 +39,7 @@
     if (message != null) {
       output += ': $message';
     }
-    final String stderr = result?.stderr ?? '';
+    final String stderr = result?.stderr as String ?? '';
     if (stderr.isNotEmpty) {
       output += ':\n$stderr';
     }
@@ -526,15 +526,15 @@
     newEntry['sha256'] = await _getChecksum(outputFile);
 
     // Search for any entries with the same hash and channel and remove them.
-    final List<dynamic> releases = jsonData['releases'];
+    final List<dynamic> releases = jsonData['releases'] as List<dynamic>;
     jsonData['releases'] = <Map<String, dynamic>>[
-      for (Map<String, dynamic> entry in releases)
+      for (Map<String, dynamic> entry in releases.cast<Map<String, dynamic>>())
         if (entry['hash'] != newEntry['hash'] || entry['channel'] != newEntry['channel'])
           entry,
       newEntry,
     ]..sort((Map<String, dynamic> a, Map<String, dynamic> b) {
-      final DateTime aDate = DateTime.parse(a['release_date']);
-      final DateTime bDate = DateTime.parse(b['release_date']);
+      final DateTime aDate = DateTime.parse(a['release_date'] as String);
+      final DateTime bDate = DateTime.parse(b['release_date'] as String);
       return bDate.compareTo(aDate);
     });
     return jsonData;
@@ -556,7 +556,7 @@
 
     Map<String, dynamic> jsonData;
     try {
-      jsonData = json.decode(currentMetadata);
+      jsonData = json.decode(currentMetadata) as Map<String, dynamic>;
     } on FormatException catch (e) {
       throw PreparePackageException('Unable to parse JSON metadata received from cloud: $e');
     }
@@ -665,7 +665,7 @@
 
   final ArgResults parsedArguments = argParser.parse(rawArguments);
 
-  if (parsedArguments['help']) {
+  if (parsedArguments['help'] as bool) {
     print(argParser.usage);
     exit(0);
   }
@@ -676,7 +676,7 @@
     exit(exitCode);
   }
 
-  final String revision = parsedArguments['revision'];
+  final String revision = parsedArguments['revision'] as String;
   if (revision.isEmpty) {
     errorExit('Invalid argument: --revision must be specified.');
   }
@@ -684,19 +684,20 @@
     errorExit('Invalid argument: --revision must be the entire hash, not just a prefix.');
   }
 
-  if (parsedArguments['branch'].isEmpty) {
+  if ((parsedArguments['branch'] as String).isEmpty) {
     errorExit('Invalid argument: --branch must be specified.');
   }
 
+  final String tempDirArg = parsedArguments['temp_dir'] as String;
   Directory tempDir;
   bool removeTempDir = false;
-  if (parsedArguments['temp_dir'] == null || parsedArguments['temp_dir'].isEmpty) {
+  if (tempDirArg == null || tempDirArg.isEmpty) {
     tempDir = Directory.systemTemp.createTempSync('flutter_package.');
     removeTempDir = true;
   } else {
-    tempDir = Directory(parsedArguments['temp_dir']);
+    tempDir = Directory(tempDirArg);
     if (!tempDir.existsSync()) {
-      errorExit("Temporary directory ${parsedArguments['temp_dir']} doesn't exist.");
+      errorExit("Temporary directory $tempDirArg doesn't exist.");
     }
   }
 
@@ -704,20 +705,20 @@
   if (parsedArguments['output'] == null) {
     outputDir = tempDir;
   } else {
-    outputDir = Directory(parsedArguments['output']);
+    outputDir = Directory(parsedArguments['output'] as String);
     if (!outputDir.existsSync()) {
       outputDir.createSync(recursive: true);
     }
   }
 
-  final Branch branch = fromBranchName(parsedArguments['branch']);
-  final ArchiveCreator creator = ArchiveCreator(tempDir, outputDir, revision, branch, strict: parsedArguments['publish']);
+  final Branch branch = fromBranchName(parsedArguments['branch'] as String);
+  final ArchiveCreator creator = ArchiveCreator(tempDir, outputDir, revision, branch, strict: parsedArguments['publish'] as bool);
   int exitCode = 0;
   String message;
   try {
     final String version = await creator.initializeRepo();
     final File outputFile = await creator.createArchive();
-    if (parsedArguments['publish']) {
+    if (parsedArguments['publish'] as bool) {
       final ArchivePublisher publisher = ArchivePublisher(
         tempDir,
         revision,
diff --git a/dev/bots/test/fake_process_manager.dart b/dev/bots/test/fake_process_manager.dart
index 2baf6ee..521e8c2 100644
--- a/dev/bots/test/fake_process_manager.dart
+++ b/dev/bots/test/fake_process_manager.dart
@@ -47,7 +47,7 @@
   void verifyCalls(List<String> calls) {
     int index = 0;
     for (String call in calls) {
-      expect(call.split(' '), orderedEquals(invocations[index].positionalArguments[0]));
+      expect(call.split(' '), orderedEquals(invocations[index].positionalArguments[0] as Iterable<dynamic>));
       index++;
     }
     expect(invocations.length, equals(calls.length));
@@ -66,17 +66,17 @@
 
   Future<Process> _nextProcess(Invocation invocation) async {
     invocations.add(invocation);
-    return Future<Process>.value(_popProcess(invocation.positionalArguments[0]));
+    return Future<Process>.value(_popProcess(invocation.positionalArguments[0] as List<String>));
   }
 
   ProcessResult _nextResultSync(Invocation invocation) {
     invocations.add(invocation);
-    return _popResult(invocation.positionalArguments[0]);
+    return _popResult(invocation.positionalArguments[0] as List<String>);
   }
 
   Future<ProcessResult> _nextResult(Invocation invocation) async {
     invocations.add(invocation);
-    return Future<ProcessResult>.value(_popResult(invocation.positionalArguments[0]));
+    return Future<ProcessResult>.value(_popResult(invocation.positionalArguments[0] as List<String>));
   }
 
   void _setupMock() {
@@ -117,8 +117,8 @@
 /// A fake process that can be used to interact with a process "started" by the FakeProcessManager.
 class FakeProcess extends Mock implements Process {
   FakeProcess(ProcessResult result, {void stdinResults(String input)})
-      : stdoutStream = Stream<List<int>>.fromIterable(<List<int>>[result.stdout.codeUnits]),
-        stderrStream = Stream<List<int>>.fromIterable(<List<int>>[result.stderr.codeUnits]),
+      : stdoutStream = Stream<List<int>>.value((result.stdout as String).codeUnits),
+        stderrStream = Stream<List<int>>.value((result.stderr as String).codeUnits),
         desiredExitCode = result.exitCode,
         stdinSink = IOSink(StringStreamConsumer(stdinResults)) {
     _setupMock();
diff --git a/dev/bots/test/prepare_package_test.dart b/dev/bots/test/prepare_package_test.dart
index 21dadad..b7054fe 100644
--- a/dev/bots/test/prepare_package_test.dart
+++ b/dev/bots/test/prepare_package_test.dart
@@ -328,13 +328,13 @@
         expect(contents, contains('"channel": "dev"'));
         // Make sure old matching entries are removed.
         expect(contents, isNot(contains('v0.0.0')));
-        final Map<String, dynamic> jsonData = json.decode(contents);
-        final List<dynamic> releases = jsonData['releases'];
+        final Map<String, dynamic> jsonData = json.decode(contents) as Map<String, dynamic>;
+        final List<dynamic> releases = jsonData['releases'] as List<dynamic>;
         expect(releases.length, equals(3));
         // Make sure the new entry is first (and hopefully it takes less than a
         // minute to go from publishArchive above to this line!).
         expect(
-          DateTime.now().difference(DateTime.parse(releases[0]['release_date'])),
+          DateTime.now().difference(DateTime.parse(releases[0]['release_date'] as String)),
           lessThan(const Duration(minutes: 1)),
         );
         const JsonEncoder encoder = JsonEncoder.withIndent('  ');
diff --git a/dev/bots/unpublish_package.dart b/dev/bots/unpublish_package.dart
index c0f779e..3da5bf6 100644
--- a/dev/bots/unpublish_package.dart
+++ b/dev/bots/unpublish_package.dart
@@ -41,7 +41,7 @@
     if (message != null) {
       output += ': $message';
     }
-    final String stderr = result?.stderr ?? '';
+    final String stderr = result?.stderr as String ?? '';
     if (stderr.isNotEmpty) {
       output += ':\n$stderr';
     }
@@ -242,8 +242,8 @@
   /// Remove the archive from Google Storage.
   Future<void> unpublishArchive() async {
     final Map<String, dynamic> jsonData = await _loadMetadata();
-    final List<Map<String, String>> releases = jsonData['releases'].map<Map<String, String>>((dynamic entry) {
-      final Map<String, dynamic> mapEntry = entry;
+    final List<Map<String, String>> releases = (jsonData['releases'] as List<dynamic>).map<Map<String, String>>((dynamic entry) {
+      final Map<String, dynamic> mapEntry = entry as Map<String, dynamic>;
       return mapEntry.cast<String, String>();
     }).toList();
     final Map<Channel, Map<String, String>> paths = await _getArchivePaths(releases);
@@ -306,7 +306,7 @@
 
     Map<String, dynamic> jsonData;
     try {
-      jsonData = json.decode(currentMetadata);
+      jsonData = json.decode(currentMetadata) as Map<String, dynamic>;
     } on FormatException catch (e) {
       throw UnpublishException('Unable to parse JSON metadata received from cloud: $e');
     }
@@ -449,7 +449,7 @@
 
   final ArgResults parsedArguments = argParser.parse(rawArguments);
 
-  if (parsedArguments['help']) {
+  if (parsedArguments['help'] as bool) {
     print(argParser.usage);
     exit(0);
   }
@@ -460,7 +460,7 @@
     exit(exitCode);
   }
 
-  final List<String> revisions = parsedArguments['revision'];
+  final List<String> revisions = parsedArguments['revision'] as List<String>;
   if (revisions.isEmpty) {
     errorExit('Invalid argument: at least one --revision must be specified.');
   }
@@ -473,25 +473,28 @@
     }
   }
 
+  final String tempDirArg = parsedArguments['temp_dir'] as String;
   Directory tempDir;
   bool removeTempDir = false;
-  if (parsedArguments['temp_dir'] == null || parsedArguments['temp_dir'].isEmpty) {
+  if (tempDirArg == null || tempDirArg.isEmpty) {
     tempDir = Directory.systemTemp.createTempSync('flutter_package.');
     removeTempDir = true;
   } else {
-    tempDir = Directory(parsedArguments['temp_dir']);
+    tempDir = Directory(tempDirArg);
     if (!tempDir.existsSync()) {
-      errorExit("Temporary directory ${parsedArguments['temp_dir']} doesn't exist.");
+      errorExit("Temporary directory $tempDirArg doesn't exist.");
     }
   }
 
-  if (!parsedArguments['confirm']) {
+  if (!(parsedArguments['confirm'] as bool)) {
     _printBanner('This will be just a dry run.  To actually perform the changes below, re-run with --confirm argument.');
   }
 
-  final List<String> channelOptions = parsedArguments['channel'].isNotEmpty ? parsedArguments['channel'] : allowedChannelValues;
+  final List<String> channelArg = parsedArguments['channel'] as List<String>;
+  final List<String> channelOptions = channelArg.isNotEmpty ? channelArg : allowedChannelValues;
   final Set<Channel> channels = channelOptions.map<Channel>((String value) => fromChannelName(value)).toSet();
-  final List<String> platformOptions = parsedArguments['platform'].isNotEmpty ? parsedArguments['platform'] : allowedPlatformNames;
+  final List<String> platformArg = parsedArguments['platform'] as List<String>;
+  final List<String> platformOptions = platformArg.isNotEmpty ? platformArg : allowedPlatformNames;
   final List<PublishedPlatform> platforms = platformOptions.map<PublishedPlatform>((String value) => fromPublishedPlatform(value)).toList();
   int exitCode = 0;
   String message;
@@ -503,7 +506,7 @@
         revisions.toSet(),
         channels,
         platform,
-        confirmed: parsedArguments['confirm'],
+        confirmed: parsedArguments['confirm'] as bool,
       );
       await publisher.unpublishArchive();
     }
@@ -522,7 +525,7 @@
     if (exitCode != 0) {
       errorExit('$message\n$stack', exitCode: exitCode);
     }
-    if (!parsedArguments['confirm']) {
+    if (!(parsedArguments['confirm'] as bool)) {
       _printBanner('This was just a dry run.  To actually perform the above changes, re-run with --confirm argument.');
     }
     exit(0);
diff --git a/dev/customer_testing/run_tests.dart b/dev/customer_testing/run_tests.dart
index 2630ef9..f6d56ca 100644
--- a/dev/customer_testing/run_tests.dart
+++ b/dev/customer_testing/run_tests.dart
@@ -65,11 +65,11 @@
     exit(1);
   }
 
-  final int repeat = int.tryParse(parsedArguments['repeat']);
-  final bool skipOnFetchFailure = parsedArguments['skip-on-fetch-failure'];
-  final bool skipTemplate = parsedArguments['skip-template'];
-  final bool verbose = parsedArguments['verbose'];
-  final bool help = parsedArguments['help'];
+  final int repeat = int.tryParse(parsedArguments['repeat'] as String);
+  final bool skipOnFetchFailure = parsedArguments['skip-on-fetch-failure'] as bool;
+  final bool skipTemplate = parsedArguments['skip-template'] as bool;
+  final bool verbose = parsedArguments['verbose'] as bool;
+  final bool help = parsedArguments['help'] as bool;
   final List<File> files = parsedArguments
     .rest
     .expand((String path) => Glob(path).listSync())
diff --git a/dev/devicelab/bin/run.dart b/dev/devicelab/bin/run.dart
index 3f39e24..9eaa691 100644
--- a/dev/devicelab/bin/run.dart
+++ b/dev/devicelab/bin/run.dart
@@ -55,9 +55,9 @@
     return;
   }
 
-  final bool silent = args['silent'];
-  final String localEngine = args['local-engine'];
-  final String localEngineSrcPath = args['local-engine-src-path'];
+  final bool silent = args['silent'] as bool;
+  final String localEngine = args['local-engine'] as String;
+  final String localEngineSrcPath = args['local-engine-src-path'] as String;
 
   for (String taskName in _taskNames) {
     section('Running task "$taskName"');
@@ -72,9 +72,9 @@
     print(const JsonEncoder.withIndent('  ').convert(result));
     section('Finished task "$taskName"');
 
-    if (!result['success']) {
+    if (!(result['success'] as bool)) {
       exitCode = 1;
-      if (args['exit']) {
+      if (args['exit'] as bool) {
         return;
       }
     }
@@ -94,10 +94,10 @@
     tasks.removeRange(0, index);
   }
   // Only start skipping if user specified a task to continue from
-  final String stage = args['stage'];
+  final String stage = args['stage'] as String;
   for (ManifestTask task in tasks) {
     final bool isQualifyingStage = stage == null || task.stage == stage;
-    final bool isQualifyingHost = !args['match-host-platform'] || task.isSupportedByHost();
+    final bool isQualifyingHost = !(args['match-host-platform'] as bool) || task.isSupportedByHost();
     if (isQualifyingHost && isQualifyingStage) {
       taskNames.add(task.name);
     }
diff --git a/dev/devicelab/bin/tasks/flutter_attach_test.dart b/dev/devicelab/bin/tasks/flutter_attach_test.dart
index 854560f..11584ff 100644
--- a/dev/devicelab/bin/tasks/flutter_attach_test.dart
+++ b/dev/devicelab/bin/tasks/flutter_attach_test.dart
@@ -86,7 +86,7 @@
   const String kActivityId = '$kAppId/com.yourcompany.integration_ui.MainActivity';
 
   task(() async {
-    final AndroidDevice device = await devices.workingDevice;
+    final AndroidDevice device = await devices.workingDevice as AndroidDevice;
     await device.unlock();
     final Directory appDir = dir(path.join(flutterDirectory.path, 'dev/integration_tests/ui'));
     await inDirectory(appDir, () async {
diff --git a/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart b/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart
index a0f4959..6417624 100644
--- a/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart
+++ b/dev/devicelab/bin/tasks/flutter_gallery__back_button_memory.dart
@@ -19,7 +19,7 @@
   BackButtonMemoryTest() : super('${flutterDirectory.path}/examples/flutter_gallery', 'test_memory/back_button.dart', packageName);
 
   @override
-  AndroidDevice get device => super.device;
+  AndroidDevice get device => super.device as AndroidDevice;
 
   @override
   int get iterationCount => 5;
diff --git a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart
index e059507..da1d889 100644
--- a/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart
+++ b/dev/devicelab/bin/tasks/gradle_plugin_light_apk_test.dart
@@ -178,7 +178,7 @@
         if (result.exitCode == 0)
           throw failure(
               'Gradle did not exit with error as expected', result);
-        final String output = result.stdout + '\n' + result.stderr;
+        final String output = '${result.stdout}\n${result.stderr}';
         if (output.contains('GradleException') ||
             output.contains('Failed to notify') ||
             output.contains('at org.gradle'))
@@ -197,7 +197,7 @@
         if (result.exitCode == 0)
           throw failure(
               'flutter build apk should fail when Gradle does', result);
-        final String output = result.stdout + '\n' + result.stderr;
+        final String output = '${result.stdout}\n${result.stderr}';
         if (!output.contains('Build failed') || !output.contains('builTypes'))
           throw failure(
               'flutter build apk output should contain a readable Gradle error message',
diff --git a/dev/devicelab/bin/tasks/named_isolates_test.dart b/dev/devicelab/bin/tasks/named_isolates_test.dart
index 4368262..ff2feb6 100644
--- a/dev/devicelab/bin/tasks/named_isolates_test.dart
+++ b/dev/devicelab/bin/tasks/named_isolates_test.dart
@@ -19,7 +19,7 @@
 
 void main() {
   task(() async {
-    final AndroidDevice device = await devices.workingDevice;
+    final AndroidDevice device = await devices.workingDevice as AndroidDevice;
     await device.unlock();
 
     section('Compile and run the tester app');
diff --git a/dev/devicelab/bin/tasks/run_machine_concurrent_hot_reload.dart b/dev/devicelab/bin/tasks/run_machine_concurrent_hot_reload.dart
index 73191f6..80fb3fc 100644
--- a/dev/devicelab/bin/tasks/run_machine_concurrent_hot_reload.dart
+++ b/dev/devicelab/bin/tasks/run_machine_concurrent_hot_reload.dart
@@ -17,7 +17,7 @@
   Map<String, dynamic> parseFlutterResponse(String line) {
     if (line.startsWith('[') && line.endsWith(']')) {
       try {
-        return json.decode(line)[0];
+        return json.decode(line)[0] as Map<String, dynamic>;
       } catch (e) {
         // Not valid JSON, so likely some other output that was surrounded by [brackets]
         return null;
@@ -60,10 +60,10 @@
         final dynamic json = parseFlutterResponse(line);
         if (json != null) {
           if (json['event'] == 'app.debugPort') {
-            vmServiceUri = Uri.parse(json['params']['wsUri']);
+            vmServiceUri = Uri.parse(json['params']['wsUri'] as String);
             print('service protocol connection available at $vmServiceUri');
           } else if (json['event'] == 'app.started') {
-            appId = json['params']['appId'];
+            appId = json['params']['appId'] as String;
             print('application identifier is $appId');
           }
         }
@@ -129,7 +129,7 @@
       if (!ok)
         throw 'App failed or crashed during hot reloads.';
 
-      final List<dynamic> responses = results;
+      final List<dynamic> responses = results as List<dynamic>;
       final List<dynamic> errorResponses = responses.where(
         (dynamic r) => r['error'] != null
       ).toList();
@@ -141,7 +141,7 @@
 
       if (errorResponses.length != 1)
         throw 'Did not receive the expected (exactly one) hot reload error response.';
-      final String errorMessage = errorResponses.first['error'];
+      final String errorMessage = (errorResponses.first as Map<String, dynamic>)['error'] as String;
       if (!errorMessage.contains('in progress'))
         throw 'Error response was not that hot reload was in progress.';
       if (successResponses.length != 1)
diff --git a/dev/devicelab/bin/tasks/service_extensions_test.dart b/dev/devicelab/bin/tasks/service_extensions_test.dart
index 53abf60..e91f4e5 100644
--- a/dev/devicelab/bin/tasks/service_extensions_test.dart
+++ b/dev/devicelab/bin/tasks/service_extensions_test.dart
@@ -81,15 +81,15 @@
       // validate the fields
       // {number: 8, startTime: 0, elapsed: 1437, build: 600, raster: 800}
       expect(event.data['number'] is int);
-      expect(event.data['number'] >= 0);
+      expect((event.data['number'] as int) >= 0);
       expect(event.data['startTime'] is int);
-      expect(event.data['startTime'] >= 0);
+      expect((event.data['startTime'] as int) >= 0);
       expect(event.data['elapsed'] is int);
-      expect(event.data['elapsed'] >= 0);
+      expect((event.data['elapsed'] as int) >= 0);
       expect(event.data['build'] is int);
-      expect(event.data['build'] >= 0);
+      expect((event.data['build'] as int) >= 0);
       expect(event.data['raster'] is int);
-      expect(event.data['raster'] >= 0);
+      expect((event.data['raster'] as int) >= 0);
 
       final Future<VMExtensionEvent> navigationFuture = navigationEvents.first;
       // This tap triggers a navigation event.
@@ -98,10 +98,10 @@
       final VMExtensionEvent navigationEvent = await navigationFuture;
       // validate the fields
       expect(navigationEvent.data['route'] is Map<dynamic, dynamic>);
-      final Map<dynamic, dynamic> route = navigationEvent.data['route'];
+      final Map<dynamic, dynamic> route = navigationEvent.data['route'] as Map<dynamic, dynamic>;
       expect(route['description'] is String);
       expect(route['settings'] is Map<dynamic, dynamic>);
-      final Map<dynamic, dynamic> settings = route['settings'];
+      final Map<dynamic, dynamic> settings = route['settings'] as Map<dynamic, dynamic>;
       expect(settings.containsKey('name'));
       expect(settings['isInitialRoute'] is bool);
 
diff --git a/dev/devicelab/lib/framework/adb.dart b/dev/devicelab/lib/framework/adb.dart
index 0cd8967..fa07a86 100644
--- a/dev/devicelab/lib/framework/adb.dart
+++ b/dev/devicelab/lib/framework/adb.dart
@@ -128,8 +128,8 @@
   /// [workingDevice].
   @override
   Future<void> chooseWorkingDevice() async {
-    final List<Device> allDevices = (await discoverDevices())
-      .map<Device>((String id) => AndroidDevice(deviceId: id))
+    final List<AndroidDevice> allDevices = (await discoverDevices())
+      .map<AndroidDevice>((String id) => AndroidDevice(deviceId: id))
       .toList();
 
     if (allDevices.isEmpty)
diff --git a/dev/devicelab/lib/framework/framework.dart b/dev/devicelab/lib/framework/framework.dart
index 21e68d4..e991c34 100644
--- a/dev/devicelab/lib/framework/framework.dart
+++ b/dev/devicelab/lib/framework/framework.dart
@@ -194,8 +194,10 @@
   /// Constructs a successful result using JSON data stored in a file.
   factory TaskResult.successFromFile(File file,
       {List<String> benchmarkScoreKeys}) {
-    return TaskResult.success(json.decode(file.readAsStringSync()),
-        benchmarkScoreKeys: benchmarkScoreKeys);
+    return TaskResult.success(
+      json.decode(file.readAsStringSync()) as Map<String, dynamic>,
+      benchmarkScoreKeys: benchmarkScoreKeys,
+    );
   }
 
   /// Constructs an unsuccessful result.
diff --git a/dev/devicelab/lib/framework/ios.dart b/dev/devicelab/lib/framework/ios.dart
index c3380fe..2d10b9b 100644
--- a/dev/devicelab/lib/framework/ios.dart
+++ b/dev/devicelab/lib/framework/ios.dart
@@ -47,7 +47,7 @@
     '-l',
     '${duration.inMilliseconds}',
   ]);
-  return json.decode(file('$cwd/result.json').readAsStringSync());
+  return json.decode(file('$cwd/result.json').readAsStringSync()) as Map<String, dynamic>;
 }
 
 Future<String> dylibSymbols(String pathToDylib) {
diff --git a/dev/devicelab/lib/framework/manifest.dart b/dev/devicelab/lib/framework/manifest.dart
index 61de3d2..6263a06 100644
--- a/dev/devicelab/lib/framework/manifest.dart
+++ b/dev/devicelab/lib/framework/manifest.dart
@@ -17,8 +17,8 @@
     ? loadYaml(file('manifest.yaml').readAsStringSync())
     : loadYamlNode(yaml);
 
-  _checkType(manifestYaml is Map, manifestYaml, 'Manifest', 'dictionary');
-  return _validateAndParseManifest(manifestYaml);
+  _checkType(manifestYaml is YamlMap, manifestYaml, 'Manifest', 'dictionary');
+  return _validateAndParseManifest(manifestYaml as YamlMap);
 }
 
 /// Contains CI task information.
@@ -93,21 +93,21 @@
 
 // There's no good YAML validator, at least not for Dart, so we validate
 // manually. It's not too much code and produces good error messages.
-Manifest _validateAndParseManifest(Map<dynamic, dynamic> manifestYaml) {
+Manifest _validateAndParseManifest(YamlMap manifestYaml) {
   _checkKeys(manifestYaml, 'manifest', const <String>['tasks']);
   return Manifest._(_validateAndParseTasks(manifestYaml['tasks']));
 }
 
 List<ManifestTask> _validateAndParseTasks(dynamic tasksYaml) {
-  _checkType(tasksYaml is Map, tasksYaml, 'Value of "tasks"', 'dictionary');
-  final List<dynamic> sortedKeys = tasksYaml.keys.toList()..sort();
+  _checkType(tasksYaml is YamlMap, tasksYaml, 'Value of "tasks"', 'dictionary');
+  final List<dynamic> sortedKeys = (tasksYaml as YamlMap).keys.toList()..sort();
   return sortedKeys.map<ManifestTask>((dynamic taskName) => _validateAndParseTask(taskName, tasksYaml[taskName])).toList();
 }
 
 ManifestTask _validateAndParseTask(dynamic taskName, dynamic taskYaml) {
   _checkType(taskName is String, taskName, 'Task name', 'string');
-  _checkType(taskYaml is Map, taskYaml, 'Value of task "$taskName"', 'dictionary');
-  _checkKeys(taskYaml, 'Value of task "$taskName"', const <String>[
+  _checkType(taskYaml is YamlMap, taskYaml, 'Value of task "$taskName"', 'dictionary');
+  _checkKeys(taskYaml as YamlMap, 'Value of task "$taskName"', const <String>[
     'description',
     'stage',
     'required_agent_capabilities',
@@ -125,24 +125,24 @@
     _checkType(timeoutInMinutes is int, timeoutInMinutes, 'timeout_in_minutes', 'integer');
   }
 
-  final List<dynamic> capabilities = _validateAndParseCapabilities(taskName, taskYaml['required_agent_capabilities']);
+  final List<dynamic> capabilities = _validateAndParseCapabilities(taskName as String, taskYaml['required_agent_capabilities']);
   return ManifestTask._(
-    name: taskName,
-    description: taskYaml['description'],
-    stage: taskYaml['stage'],
-    requiredAgentCapabilities: capabilities,
-    isFlaky: isFlaky ?? false,
-    timeoutInMinutes: timeoutInMinutes,
+    name: taskName as String,
+    description: taskYaml['description'] as String,
+    stage: taskYaml['stage'] as String,
+    requiredAgentCapabilities: capabilities as List<String>,
+    isFlaky: isFlaky as bool ?? false,
+    timeoutInMinutes: timeoutInMinutes as int,
   );
 }
 
 List<String> _validateAndParseCapabilities(String taskName, dynamic capabilitiesYaml) {
   _checkType(capabilitiesYaml is List, capabilitiesYaml, 'required_agent_capabilities', 'list');
-  for (int i = 0; i < capabilitiesYaml.length; i++) {
+  for (int i = 0; i < (capabilitiesYaml as List<dynamic>).length; i++) {
     final dynamic capability = capabilitiesYaml[i];
     _checkType(capability is String, capability, 'required_agent_capabilities[$i]', 'string');
   }
-  return capabilitiesYaml.cast<String>();
+  return (capabilitiesYaml as List<dynamic>).cast<String>();
 }
 
 void _checkType(bool isValid, dynamic value, String variableName, String typeName) {
@@ -154,13 +154,13 @@
 }
 
 void _checkIsNotBlank(dynamic value, String variableName, String ownerName) {
-  if (value == null || value.isEmpty) {
+  if (value == null || value is String && value.isEmpty || value is List<dynamic> && value.isEmpty) {
     throw ManifestError('$variableName must not be empty in $ownerName.');
   }
 }
 
 void _checkKeys(Map<dynamic, dynamic> map, String variableName, List<String> allowedKeys) {
-  for (String key in map.keys) {
+  for (String key in map.keys.cast<String>()) {
     if (!allowedKeys.contains(key)) {
       throw ManifestError(
         'Unrecognized property "$key" in $variableName. '
diff --git a/dev/devicelab/lib/framework/runner.dart b/dev/devicelab/lib/framework/runner.dart
index 2c59db4..8e511ee 100644
--- a/dev/devicelab/lib/framework/runner.dart
+++ b/dev/devicelab/lib/framework/runner.dart
@@ -69,7 +69,7 @@
 
   try {
     final VMIsolateRef isolate = await _connectToRunnerIsolate(await uri.future);
-    final Map<String, dynamic> taskResult = await isolate.invokeExtension('ext.cocoonRunTask');
+    final Map<String, dynamic> taskResult = await isolate.invokeExtension('ext.cocoonRunTask') as Map<String, dynamic>;
     await runner.exitCode;
     return taskResult;
   } finally {
@@ -100,7 +100,7 @@
       final VMServiceClient client = VMServiceClient.connect(url);
       final VM vm = await client.getVM();
       final VMIsolateRef isolate = vm.isolates.single;
-      final String response = await isolate.invokeExtension('ext.cocoonRunnerReady');
+      final String response = await isolate.invokeExtension('ext.cocoonRunnerReady') as String;
       if (response != 'ready')
         throw 'not ready yet';
       return isolate;
diff --git a/dev/devicelab/lib/framework/running_processes.dart b/dev/devicelab/lib/framework/running_processes.dart
index 6e26cae..e438b18 100644
--- a/dev/devicelab/lib/framework/running_processes.dart
+++ b/dev/devicelab/lib/framework/running_processes.dart
@@ -100,7 +100,7 @@
     print(result.stdout);
     return;
   }
-  for (RunningProcessInfo info in processPowershellOutput(result.stdout)) {
+  for (RunningProcessInfo info in processPowershellOutput(result.stdout as String)) {
     yield info;
   }
 }
@@ -191,7 +191,7 @@
     print(result.stdout);
     return;
   }
-  for (RunningProcessInfo info in processPsOutput(result.stdout, processName)) {
+  for (RunningProcessInfo info in processPsOutput(result.stdout as String, processName)) {
     yield info;
   }
 }
diff --git a/dev/devicelab/lib/framework/utils.dart b/dev/devicelab/lib/framework/utils.dart
index 3654808..7e5fc23 100644
--- a/dev/devicelab/lib/framework/utils.dart
+++ b/dev/devicelab/lib/framework/utils.dart
@@ -186,7 +186,7 @@
 Future<String> getDartVersion() async {
   // The Dart VM returns the version text to stderr.
   final ProcessResult result = _processManager.runSync(<String>[dartBin, '--version']);
-  String version = result.stderr.trim();
+  String version = (result.stderr as String).trim();
 
   // Convert:
   //   Dart VM version: 1.17.0-dev.2.0 (Tue May  3 12:14:52 2016) on "macos_x64"
@@ -465,7 +465,7 @@
 T requireConfigProperty<T>(Map<String, dynamic> map, String propertyName) {
   if (!map.containsKey(propertyName))
     fail('Configuration property not found: $propertyName');
-  final T result = map[propertyName];
+  final T result = map[propertyName] as T;
   return result;
 }
 
@@ -571,7 +571,7 @@
     return null;
   }
 
-  final String token = args['cloud-auth-token'];
+  final String token = args['cloud-auth-token'] as String;
   if (token == null) {
     stderr.writeln('Required option --cloud-auth-token not found');
     return null;
diff --git a/dev/devicelab/lib/tasks/gallery.dart b/dev/devicelab/lib/tasks/gallery.dart
index d3cb8ab..e27b9bc 100644
--- a/dev/devicelab/lib/tasks/gallery.dart
+++ b/dev/devicelab/lib/tasks/gallery.dart
@@ -46,16 +46,17 @@
 
     // Route paths contains slashes, which Firebase doesn't accept in keys, so we
     // remove them.
-    final Map<String, dynamic> original = Map<String, dynamic>.from(
-        json.decode(
-            file('${galleryDirectory.path}/build/transition_durations.timeline.json').readAsStringSync()
-        ));
+    final Map<String, dynamic> original = json.decode(
+      file('${galleryDirectory.path}/build/transition_durations.timeline.json').readAsStringSync(),
+    ) as Map<String, dynamic>;
     final Map<String, List<int>> transitions = <String, List<int>>{};
     for (String key in original.keys) {
-      transitions[key.replaceAll('/', '')] = List<int>.from(original[key]);
+      transitions[key.replaceAll('/', '')] = List<int>.from(original[key] as List<dynamic>);
     }
 
-    final Map<String, dynamic> summary = json.decode(file('${galleryDirectory.path}/build/transitions.timeline_summary.json').readAsStringSync());
+    final Map<String, dynamic> summary = json.decode(
+      file('${galleryDirectory.path}/build/transitions.timeline_summary.json').readAsStringSync(),
+    ) as Map<String, dynamic>;
 
     final Map<String, dynamic> data = <String, dynamic>{
       'transitions': transitions,
diff --git a/dev/devicelab/lib/tasks/hot_mode_tests.dart b/dev/devicelab/lib/tasks/hot_mode_tests.dart
index 95d9557..c9bb93b 100644
--- a/dev/devicelab/lib/tasks/hot_mode_tests.dart
+++ b/dev/devicelab/lib/tasks/hot_mode_tests.dart
@@ -90,7 +90,7 @@
               <Future<void>>[stdoutDone.future, stderrDone.future]);
           await process.exitCode;
 
-          twoReloadsData = json.decode(benchmarkFile.readAsStringSync());
+          twoReloadsData = json.decode(benchmarkFile.readAsStringSync()) as Map<String, dynamic>;
         }
         benchmarkFile.deleteSync();
 
@@ -129,7 +129,7 @@
           await process.exitCode;
 
           freshRestartReloadsData =
-              json.decode(benchmarkFile.readAsStringSync());
+              json.decode(benchmarkFile.readAsStringSync()) as Map<String, dynamic>;
         }
       });
     });
diff --git a/dev/devicelab/lib/tasks/microbenchmarks.dart b/dev/devicelab/lib/tasks/microbenchmarks.dart
index 9eebdc5..8cbe581 100644
--- a/dev/devicelab/lib/tasks/microbenchmarks.dart
+++ b/dev/devicelab/lib/tasks/microbenchmarks.dart
@@ -128,7 +128,7 @@
       // Also send a kill signal in case the `q` above didn't work.
       process.kill(ProcessSignal.sigint);
       try {
-        completer.complete(Map<String, double>.from(json.decode(jsonOutput)));
+        completer.complete(Map<String, double>.from(json.decode(jsonOutput) as Map<String, dynamic>));
       } catch (ex) {
         completer.completeError('Decoding JSON failed ($ex). JSON string was: $jsonOutput');
       }
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart
index 1de8fa2..0a1d858 100644
--- a/dev/devicelab/lib/tasks/perf_tests.dart
+++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -167,7 +167,9 @@
         '-d',
         deviceId,
       ]);
-      final Map<String, dynamic> data = json.decode(file('$testDirectory/build/start_up_info.json').readAsStringSync());
+      final Map<String, dynamic> data = json.decode(
+        file('$testDirectory/build/start_up_info.json').readAsStringSync(),
+      ) as Map<String, dynamic>;
 
       if (!reportMetrics)
         return TaskResult.success(data);
@@ -211,9 +213,11 @@
         '-d',
         deviceId,
       ]);
-      final Map<String, dynamic> data = json.decode(file('$testDirectory/build/$timelineFileName.timeline_summary.json').readAsStringSync());
+      final Map<String, dynamic> data = json.decode(
+        file('$testDirectory/build/$timelineFileName.timeline_summary.json').readAsStringSync(),
+      ) as Map<String, dynamic>;
 
-      if (data['frame_count'] < 5) {
+      if (data['frame_count'] as int < 5) {
         return TaskResult.failure(
           'Timeline contains too few frames: ${data['frame_count']}. Possibly '
           'trace events are not being captured.',
@@ -308,8 +312,8 @@
     final ProcessResult result = await Process.run('du', <String>['-k', output]);
     await Process.run('gzip',<String>['-k', '9', output]);
     final ProcessResult resultGzip = await Process.run('du', <String>['-k', output + '.gz']);
-    metrics['${metric}_dart2js_size'] = _parseDu(result.stdout);
-    metrics['${metric}_dart2js_size_gzip'] = _parseDu(resultGzip.stdout);
+    metrics['${metric}_dart2js_size'] = _parseDu(result.stdout as String);
+    metrics['${metric}_dart2js_size_gzip'] = _parseDu(resultGzip.stdout as String);
   }
 
   static int _parseDu(String source) {
@@ -636,9 +640,9 @@
     assert(_startMemoryUsage != null);
     print('snapshotting memory usage...');
     final Map<String, dynamic> endMemoryUsage = await device.getMemoryStats(package);
-    _startMemory.add(_startMemoryUsage['total_kb']);
-    _endMemory.add(endMemoryUsage['total_kb']);
-    _diffMemory.add(endMemoryUsage['total_kb'] - _startMemoryUsage['total_kb']);
+    _startMemory.add(_startMemoryUsage['total_kb'] as int);
+    _endMemory.add(endMemoryUsage['total_kb'] as int);
+    _diffMemory.add((endMemoryUsage['total_kb'] as int) - (_startMemoryUsage['total_kb'] as int));
   }
 }
 
diff --git a/dev/devicelab/lib/tasks/save_catalog_screenshots.dart b/dev/devicelab/lib/tasks/save_catalog_screenshots.dart
index 424d4a3..062c0b4 100644
--- a/dev/devicelab/lib/tasks/save_catalog_screenshots.dart
+++ b/dev/devicelab/lib/tasks/save_catalog_screenshots.dart
@@ -43,7 +43,7 @@
     if (retryCount == 0)
       return const Duration(milliseconds: 1000);
     random ??= math.Random();
-    return Duration(milliseconds: random.nextInt(1000) + math.pow(2, retryCount) * 1000);
+    return Duration(milliseconds: random.nextInt(1000) + (math.pow(2, retryCount) as int) * 1000);
   }
 
   Future<bool> save(HttpClient client, String name, List<int> content) async {
diff --git a/dev/devicelab/test/adb_test.dart b/dev/devicelab/test/adb_test.dart
index 0f4a9e3..ddf0279 100644
--- a/dev/devicelab/test/adb_test.dart
+++ b/dev/devicelab/test/adb_test.dart
@@ -138,11 +138,10 @@
   bool operator==(Object other) {
     if (other.runtimeType != CommandArgs)
       return false;
-
-    final CommandArgs otherCmd = other;
-    return otherCmd.command == command &&
-      const ListEquality<String>().equals(otherCmd.arguments, arguments) &&
-      const MapEquality<String, String>().equals(otherCmd.environment, environment);
+    return other is CommandArgs
+        && other.command == command
+        && const ListEquality<String>().equals(other.arguments, arguments)
+        && const MapEquality<String, String>().equals(other.environment, environment);
   }
 
   @override
diff --git a/dev/integration_tests/android_semantics_testing/lib/src/common.dart b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
index a4b983b..06fa05f 100644
--- a/dev/integration_tests/android_semantics_testing/lib/src/common.dart
+++ b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
@@ -52,19 +52,19 @@
   ///       ]
   ///     }
   factory AndroidSemanticsNode.deserialize(String value) {
-    return AndroidSemanticsNode._(json.decode(value));
+    return AndroidSemanticsNode._(json.decode(value) as Map<String, Object>);
   }
 
   final Map<String, Object> _values;
   final List<AndroidSemanticsNode> _children = <AndroidSemanticsNode>[];
 
-  Map<String, Object> get _flags => _values['flags'];
+  Map<String, Object> get _flags => _values['flags'] as Map<String, Object>;
 
   /// The text value of the semantics node.
   ///
   /// This is produced by combining the value, label, and hint fields from
   /// the Flutter [SemanticsNode].
-  String get text => _values['text'];
+  String get text => _values['text'] as String;
 
   /// The contentDescription of the semantics node.
   ///
@@ -74,7 +74,7 @@
   ///
   /// This is produced by combining the value, label, and hint fields from
   /// the Flutter [SemanticsNode].
-  String get contentDescription => _values['contentDescription'];
+  String get contentDescription => _values['contentDescription'] as String;
 
   /// The className of the semantics node.
   ///
@@ -83,10 +83,10 @@
   ///
   /// If a more specific value isn't provided, it defaults to
   /// "android.view.View".
-  String get className => _values['className'];
+  String get className => _values['className'] as String;
 
   /// The identifier for this semantics node.
-  int get id => _values['id'];
+  int get id => _values['id'] as int;
 
   /// The children of this semantics node.
   List<AndroidSemanticsNode> get children => _children;
@@ -94,44 +94,44 @@
   /// Whether the node is currently in a checked state.
   ///
   /// Equivalent to [SemanticsFlag.isChecked].
-  bool get isChecked => _flags['isChecked'];
+  bool get isChecked => _flags['isChecked'] as bool;
 
   /// Whether the node can be in a checked state.
   ///
   /// Equivalent to [SemanticsFlag.hasCheckedState]
-  bool get isCheckable => _flags['isCheckable'];
+  bool get isCheckable => _flags['isCheckable'] as bool;
 
   /// Whether the node is editable.
   ///
   /// This is usually only applied to text fields, which map
   /// to "android.widget.EditText".
-  bool get isEditable => _flags['isEditable'];
+  bool get isEditable => _flags['isEditable'] as bool;
 
   /// Whether the node is enabled.
-  bool get isEnabled => _flags['isEnabled'];
+  bool get isEnabled => _flags['isEnabled'] as bool;
 
   /// Whether the node is focusable.
-  bool get isFocusable => _flags['isFocusable'];
+  bool get isFocusable => _flags['isFocusable'] as bool;
 
   /// Whether the node is focused.
-  bool get isFocused => _flags['isFocused'];
+  bool get isFocused => _flags['isFocused'] as bool;
 
   /// Whether the node is considered a heading.
-  bool get isHeading => _flags['isHeading'];
+  bool get isHeading => _flags['isHeading'] as bool;
 
   /// Whether the node represents a password field.
   ///
   /// Equivalent to [SemanticsFlag.isObscured].
-  bool get isPassword => _flags['isPassword'];
+  bool get isPassword => _flags['isPassword'] as bool;
 
   /// Whether the node is long clickable.
   ///
   /// Equivalent to having [SemanticsAction.longPress].
-  bool get isLongClickable => _flags['isLongClickable'];
+  bool get isLongClickable => _flags['isLongClickable'] as bool;
 
   /// Gets a [Rect] which defines the position and size of the semantics node.
   Rect getRect() {
-    final Map<String, Object> rawRect = _values['rect'];
+    final Map<String, Object> rawRect = _values['rect'] as Map<String, Object>;
     final Map<String, int> rect = rawRect.cast<String, int>();
     return Rect.fromLTRB(
       rect['left'].toDouble(),
@@ -149,7 +149,7 @@
 
   /// Gets a list of [AndroidSemanticsActions] which are defined for the node.
   List<AndroidSemanticsAction> getActions() => <AndroidSemanticsAction>[
-    for (int id in _values['actions']) AndroidSemanticsAction.deserialize(id),
+    for (int id in (_values['actions'] as List<dynamic>).cast<int>()) AndroidSemanticsAction.deserialize(id),
   ];
 
   @override
@@ -189,11 +189,11 @@
   bool operator ==(Object other) {
     if (other.runtimeType != runtimeType)
       return false;
-    final Rect typedOther = other;
-    return typedOther.top == top &&
-        typedOther.left == left &&
-        typedOther.right == right &&
-        typedOther.bottom == bottom;
+    return other is Rect
+        && other.top == top
+        && other.left == left
+        && other.right == right
+        && other.bottom == bottom;
   }
 
   @override
@@ -221,8 +221,9 @@
   bool operator ==(Object other) {
     if (other.runtimeType != runtimeType)
       return false;
-    final Size typedOther = other;
-    return typedOther.width == width && typedOther.height == height;
+    return other is Size
+        && other.width == width
+        && other.height == height;
   }
 
   @override
diff --git a/dev/integration_tests/android_semantics_testing/lib/src/constants.dart b/dev/integration_tests/android_semantics_testing/lib/src/constants.dart
index 5b9b756..89ac499 100644
--- a/dev/integration_tests/android_semantics_testing/lib/src/constants.dart
+++ b/dev/integration_tests/android_semantics_testing/lib/src/constants.dart
@@ -196,8 +196,8 @@
   bool operator ==(Object other) {
     if (other.runtimeType != runtimeType)
       return false;
-    final AndroidSemanticsAction typedOther = other;
-    return id == typedOther.id;
+    return other is AndroidSemanticsAction
+        && other.id == id;
   }
 
   /// Creates a new [AndroidSemanticsAction] from an integer `value`.
diff --git a/dev/integration_tests/android_semantics_testing/lib/src/matcher.dart b/dev/integration_tests/android_semantics_testing/lib/src/matcher.dart
index 009efa7..614b23d 100644
--- a/dev/integration_tests/android_semantics_testing/lib/src/matcher.dart
+++ b/dev/integration_tests/android_semantics_testing/lib/src/matcher.dart
@@ -177,7 +177,7 @@
   @override
   Description describeMismatch(Object item, Description mismatchDescription,
       Map<Object, Object> matchState, bool verbose) {
-    return mismatchDescription.add(matchState['failure']);
+    return mismatchDescription.add(matchState['failure'] as String);
   }
 
   bool _failWithMessage(String value, Map<dynamic, dynamic> matchState) {
diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart
index c2832b4..16d4aba 100644
--- a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart
+++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart
@@ -47,8 +47,8 @@
   while (waitingForSplashToDisappear) {
     final String response = await driver.requestData('splash_test_log',);
 
-    final Map<String, dynamic> splashTestLog = jsonDecode(response);
-    final List<dynamic> events = splashTestLog['events'];
+    final Map<String, dynamic> splashTestLog = jsonDecode(response) as Map<String, dynamic>;
+    final List<dynamic> events = splashTestLog['events'] as List<dynamic>;
     if (events.length == 3) {
       expect(
           events[0],
diff --git a/dev/integration_tests/android_views/lib/motion_event_diff.dart b/dev/integration_tests/android_views/lib/motion_event_diff.dart
index b25d371..f5f073f 100644
--- a/dev/integration_tests/android_views/lib/motion_event_diff.dart
+++ b/dev/integration_tests/android_views/lib/motion_event_diff.dart
@@ -40,12 +40,12 @@
 void diffActions(StringBuffer diffBuffer, Map<String, dynamic> originalEvent,
     Map<String, dynamic> synthesizedEvent) {
   final int synthesizedActionMasked =
-      getActionMasked(synthesizedEvent['action']);
-  final int originalActionMasked = getActionMasked(originalEvent['action']);
+      getActionMasked(synthesizedEvent['action'] as int);
+  final int originalActionMasked = getActionMasked(originalEvent['action'] as int);
   final String synthesizedActionName =
-      getActionName(synthesizedActionMasked, synthesizedEvent['action']);
+      getActionName(synthesizedActionMasked, synthesizedEvent['action'] as int);
   final String originalActionName =
-      getActionName(originalActionMasked, originalEvent['action']);
+      getActionName(originalActionMasked, originalEvent['action'] as int);
 
   if (synthesizedActionMasked != originalActionMasked)
     diffBuffer.write(
@@ -53,8 +53,8 @@
 
   if (kPointerActions.contains(originalActionMasked) &&
       originalActionMasked == synthesizedActionMasked) {
-    final int originalPointer = getPointerIdx(originalEvent['action']);
-    final int synthesizedPointer = getPointerIdx(synthesizedEvent['action']);
+    final int originalPointer = getPointerIdx(originalEvent['action'] as int);
+    final int synthesizedPointer = getPointerIdx(synthesizedEvent['action'] as int);
     if (originalPointer != synthesizedPointer)
       diffBuffer.write(
           'pointerIdx (expected: $originalPointer actual: $synthesizedPointer action: $originalActionName ');
@@ -64,9 +64,9 @@
 void diffPointerProperties(StringBuffer diffBuffer,
     Map<String, dynamic> originalEvent, Map<String, dynamic> synthesizedEvent) {
   final List<Map<dynamic, dynamic>> expectedList =
-      originalEvent['pointerProperties'].cast<Map<dynamic, dynamic>>();
+      (originalEvent['pointerProperties'] as List<dynamic>).cast<Map<dynamic, dynamic>>();
   final List<Map<dynamic, dynamic>> actualList =
-      synthesizedEvent['pointerProperties'].cast<Map<dynamic, dynamic>>();
+      (synthesizedEvent['pointerProperties'] as List<dynamic>).cast<Map<dynamic, dynamic>>();
 
   if (expectedList.length != actualList.length) {
     diffBuffer.write(
@@ -86,9 +86,9 @@
 void diffPointerCoordsList(StringBuffer diffBuffer,
     Map<String, dynamic> originalEvent, Map<String, dynamic> synthesizedEvent) {
   final List<Map<dynamic, dynamic>> expectedList =
-      originalEvent['pointerCoords'].cast<Map<dynamic, dynamic>>();
+      (originalEvent['pointerCoords'] as List<dynamic>).cast<Map<dynamic, dynamic>>();
   final List<Map<dynamic, dynamic>> actualList =
-      synthesizedEvent['pointerCoords'].cast<Map<dynamic, dynamic>>();
+      (synthesizedEvent['pointerCoords'] as List<dynamic>).cast<Map<dynamic, dynamic>>();
 
   if (expectedList.length != actualList.length) {
     diffBuffer.write(
diff --git a/dev/integration_tests/android_views/lib/motion_events_page.dart b/dev/integration_tests/android_views/lib/motion_events_page.dart
index a546177..48be7de 100644
--- a/dev/integration_tests/android_views/lib/motion_events_page.dart
+++ b/dev/integration_tests/android_views/lib/motion_events_page.dart
@@ -115,7 +115,7 @@
     const StandardMessageCodec codec = StandardMessageCodec();
     try {
       final ByteData data = await rootBundle.load('packages/assets_for_android_views/assets/touchEvents');
-      final List<dynamic> unTypedRecordedEvents = codec.decodeMessage(data);
+      final List<dynamic> unTypedRecordedEvents = codec.decodeMessage(data) as List<dynamic>;
       final List<Map<String, dynamic>> recordedEvents = unTypedRecordedEvents
           .cast<Map<dynamic, dynamic>>()
           .map<Map<String, dynamic>>((Map<dynamic, dynamic> e) =>e.cast<String, dynamic>())
@@ -204,7 +204,7 @@
   Future<dynamic> onMethodChannelCall(MethodCall call) {
     switch (call.method) {
       case 'onTouch':
-        final Map<dynamic, dynamic> map = call.arguments;
+        final Map<dynamic, dynamic> map = call.arguments as Map<dynamic, dynamic>;
         flutterViewEvents.insert(0, map.cast<String, dynamic>());
         if (flutterViewEvents.length > kEventsBufferSize)
           flutterViewEvents.removeLast();
@@ -217,7 +217,7 @@
   Future<dynamic> onViewMethodChannelCall(MethodCall call) {
     switch (call.method) {
       case 'onTouch':
-        final Map<dynamic, dynamic> map = call.arguments;
+        final Map<dynamic, dynamic> map = call.arguments as Map<dynamic, dynamic>;
         embeddedViewEvents.insert(0, map.cast<String, dynamic>());
         if (embeddedViewEvents.length > kEventsBufferSize)
           embeddedViewEvents.removeLast();
@@ -248,7 +248,7 @@
     Color color;
     final String diff = diffMotionEvents(originalEvent, synthesizedEvent);
     String msg;
-    final int action = synthesizedEvent['action'];
+    final int action = synthesizedEvent['action'] as int;
     final String actionName = getActionName(getActionMasked(action), action);
     if (diff.isEmpty) {
       color = Colors.green;
@@ -274,7 +274,7 @@
 
   void prettyPrintEvent(Map<String, dynamic> event) {
     final StringBuffer buffer = StringBuffer();
-    final int action = event['action'];
+    final int action = event['action'] as int;
     final int maskedAction = getActionMasked(action);
     final String actionName = getActionName(maskedAction, action);
 
@@ -283,7 +283,7 @@
      buffer.write('pointer: ${getPointerIdx(action)} ');
     }
 
-    final List<Map<dynamic, dynamic>> coords = event['pointerCoords'].cast<Map<dynamic, dynamic>>();
+    final List<Map<dynamic, dynamic>> coords = (event['pointerCoords'] as List<dynamic>).cast<Map<dynamic, dynamic>>();
     for (int i = 0; i < coords.length; i++) {
       buffer.write('p$i x: ${coords[i]['x']} y: ${coords[i]['y']}, pressure: ${coords[i]['pressure']} ');
     }
diff --git a/dev/integration_tests/channels/lib/src/test_step.dart b/dev/integration_tests/channels/lib/src/test_step.dart
index daaca73..4662d03 100644
--- a/dev/integration_tests/channels/lib/src/test_step.dart
+++ b/dev/integration_tests/channels/lib/src/test_step.dart
@@ -46,7 +46,7 @@
         if (snapshot.hasData) {
           return snapshot.data;
         } else {
-          final TestStepResult result = snapshot.error;
+          final TestStepResult result = snapshot.error as TestStepResult;
           return result;
         }
         break;
diff --git a/dev/integration_tests/codegen/lib/main.dart b/dev/integration_tests/codegen/lib/main.dart
index bd69255..a71a3e7 100644
--- a/dev/integration_tests/codegen/lib/main.dart
+++ b/dev/integration_tests/codegen/lib/main.dart
@@ -45,6 +45,6 @@
 class GeneratedWidget extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    return Text(generated.message);
+    return Text(generated.message as String);
   }
 }
diff --git a/dev/integration_tests/ios_add2app/flutterapp/lib/marquee.dart b/dev/integration_tests/ios_add2app/flutterapp/lib/marquee.dart
index ebd9393..ad81d9c 100644
--- a/dev/integration_tests/ios_add2app/flutterapp/lib/marquee.dart
+++ b/dev/integration_tests/ios_add2app/flutterapp/lib/marquee.dart
@@ -12,7 +12,7 @@
 
   @override
   Widget build(BuildContext context) {
-    final Animation<double> animation = listenable;
+    final Animation<double> animation = listenable as Animation<double>;
     return Container(
       margin: EdgeInsets.only(left: animation.value),
       child: const Text(
diff --git a/dev/integration_tests/platform_interaction/lib/src/test_step.dart b/dev/integration_tests/platform_interaction/lib/src/test_step.dart
index b39d9af..61b8849 100644
--- a/dev/integration_tests/platform_interaction/lib/src/test_step.dart
+++ b/dev/integration_tests/platform_interaction/lib/src/test_step.dart
@@ -25,7 +25,7 @@
         if (snapshot.hasData) {
           return snapshot.data;
         } else {
-          final TestStepResult result = snapshot.error;
+          final TestStepResult result = snapshot.error as TestStepResult;
           return result;
         }
         break;
diff --git a/dev/manual_tests/lib/actions.dart b/dev/manual_tests/lib/actions.dart
index 744e2d5..16acf1e 100644
--- a/dev/manual_tests/lib/actions.dart
+++ b/dev/manual_tests/lib/actions.dart
@@ -166,7 +166,7 @@
 
   @override
   bool isEnabled(BuildContext context) {
-    final UndoableActionDispatcher manager = Actions.of(context, nullOk: true);
+    final UndoableActionDispatcher manager = Actions.of(context, nullOk: true) as UndoableActionDispatcher;
     return manager.canUndo;
   }
 }
@@ -176,7 +176,7 @@
 
   @override
   bool isEnabled(BuildContext context) {
-    final UndoableActionDispatcher manager = Actions.of(context, nullOk: true);
+    final UndoableActionDispatcher manager = Actions.of(context, nullOk: true) as UndoableActionDispatcher;
     return manager.canRedo;
   }
 }
@@ -189,7 +189,7 @@
     if (node?.context == null) {
       return;
     }
-    final UndoableActionDispatcher manager = Actions.of(node.context, nullOk: true);
+    final UndoableActionDispatcher manager = Actions.of(node.context, nullOk: true) as UndoableActionDispatcher;
     manager?.undo();
   },
 );
@@ -202,7 +202,7 @@
     if (node?.context == null) {
       return;
     }
-    final UndoableActionDispatcher manager = Actions.of(node.context, nullOk: true);
+    final UndoableActionDispatcher manager = Actions.of(node.context, nullOk: true) as UndoableActionDispatcher;
     manager?.redo();
   },
 );
diff --git a/dev/manual_tests/lib/card_collection.dart b/dev/manual_tests/lib/card_collection.dart
index bda7364..c8288a0 100644
--- a/dev/manual_tests/lib/card_collection.dart
+++ b/dev/manual_tests/lib/card_collection.dart
@@ -231,7 +231,7 @@
     );
   }
 
-  Widget _buildAppBar(BuildContext context) {
+  AppBar _buildAppBar(BuildContext context) {
     return AppBar(
       actions: <Widget>[
         Text(_dismissDirectionText(_dismissDirection)),
diff --git a/dev/manual_tests/lib/material_arc.dart b/dev/manual_tests/lib/material_arc.dart
index fb8e5b3..7d2c839 100644
--- a/dev/manual_tests/lib/material_arc.dart
+++ b/dev/manual_tests/lib/material_arc.dart
@@ -139,7 +139,7 @@
     if (_dragTarget != null)
       return _IgnoreDrag();
 
-    final RenderBox box = _painterKey.currentContext.findRenderObject();
+    final RenderBox box = _painterKey.currentContext.findRenderObject() as RenderBox;
     final double startOffset = (box.localToGlobal(_begin) - position).distanceSquared;
     final double endOffset = (box.localToGlobal(_end) - position).distanceSquared;
     setState(() {
@@ -307,7 +307,7 @@
     if (_dragTarget != null)
       return _IgnoreDrag();
 
-    final RenderBox box = _painterKey.currentContext.findRenderObject();
+    final RenderBox box = _painterKey.currentContext.findRenderObject() as RenderBox;
     final double startOffset = (box.localToGlobal(_begin.center) - position).distanceSquared;
     final double endOffset = (box.localToGlobal(_end.center) - position).distanceSquared;
     setState(() {
diff --git a/dev/manual_tests/lib/overlay_geometry.dart b/dev/manual_tests/lib/overlay_geometry.dart
index eb06c2b..54f68c7 100644
--- a/dev/manual_tests/lib/overlay_geometry.dart
+++ b/dev/manual_tests/lib/overlay_geometry.dart
@@ -171,7 +171,7 @@
   void handleTapUp(GlobalKey target, Offset globalPosition) {
     setState(() {
       markers[MarkerType.touch] = globalPosition;
-      final RenderBox box = target.currentContext.findRenderObject();
+      final RenderBox box = target.currentContext.findRenderObject() as RenderBox;
       markers[MarkerType.topLeft] = box.localToGlobal(const Offset(0.0, 0.0));
       final Size size = box.size;
       markers[MarkerType.bottomRight] = box.localToGlobal(Offset(size.width, size.height));
diff --git a/dev/manual_tests/lib/page_view.dart b/dev/manual_tests/lib/page_view.dart
index ab0dc3a..94e4187 100644
--- a/dev/manual_tests/lib/page_view.dart
+++ b/dev/manual_tests/lib/page_view.dart
@@ -111,7 +111,7 @@
     );
   }
 
-  Widget _buildAppBar() {
+  AppBar _buildAppBar() {
     return AppBar(
       title: const Text('PageView'),
       actions: <Widget>[
diff --git a/dev/manual_tests/lib/text.dart b/dev/manual_tests/lib/text.dart
index 557f133..37b421c 100644
--- a/dev/manual_tests/lib/text.dart
+++ b/dev/manual_tests/lib/text.dart
@@ -156,7 +156,7 @@
     return TextSpan(
       text: _fiddleWithText(node.text),
       style: _fiddleWithStyle(node.style),
-      children: _fiddleWithChildren(node.children?.map((InlineSpan child) => _fiddleWith(child))?.toList() ?? <InlineSpan>[]),
+      children: _fiddleWithChildren(node.children?.map((InlineSpan child) => _fiddleWith(child as TextSpan))?.toList() ?? <TextSpan>[]),
     );
   }
 
@@ -343,7 +343,7 @@
     if (node.children == null || node.children.isEmpty)
       return 0;
     int result = 0;
-    for (TextSpan child in node.children)
+    for (TextSpan child in node.children.cast<TextSpan>())
       result = math.max(result, depthOf(child));
     return result;
   }
diff --git a/dev/manual_tests/test/mock_image_http.dart b/dev/manual_tests/test/mock_image_http.dart
index 4f9cd77..0ff525f 100644
--- a/dev/manual_tests/test/mock_image_http.dart
+++ b/dev/manual_tests/test/mock_image_http.dart
@@ -21,10 +21,10 @@
   when(response.contentLength).thenReturn(kTransparentImage.length);
   when(response.statusCode).thenReturn(HttpStatus.ok);
   when(response.listen(any)).thenAnswer((Invocation invocation) {
-    final void Function(List<int>) onData = invocation.positionalArguments[0];
-    final void Function() onDone = invocation.namedArguments[#onDone];
-    final void Function(Object, [StackTrace]) onError = invocation.namedArguments[#onError];
-    final bool cancelOnError = invocation.namedArguments[#cancelOnError];
+    final void Function(List<int>) onData = invocation.positionalArguments[0] as void Function(List<int>);
+    final void Function() onDone = invocation.namedArguments[#onDone] as void Function();
+    final void Function(Object, [StackTrace]) onError = invocation.namedArguments[#onError] as void Function(Object, [StackTrace]);
+    final bool cancelOnError = invocation.namedArguments[#cancelOnError] as bool;
     return Stream<List<int>>.fromIterable(<List<int>>[kTransparentImage]).listen(onData, onDone: onDone, onError: onError, cancelOnError: cancelOnError);
   });
   return client;
diff --git a/dev/snippets/lib/main.dart b/dev/snippets/lib/main.dart
index 3141078..e9f9d8a 100644
--- a/dev/snippets/lib/main.dart
+++ b/dev/snippets/lib/main.dart
@@ -99,7 +99,7 @@
 
   final ArgResults args = parser.parse(argList);
 
-  if (args[_kHelpOption]) {
+  if (args[_kHelpOption] as bool) {
     stderr.writeln(parser.usage);
     exit(0);
   }
@@ -119,28 +119,30 @@
         'line, or in the INPUT environment variable.');
   }
 
-  final File input = File(args['input']);
+  final File input = File(args['input'] as String);
   if (!input.existsSync()) {
     errorExit('The input file ${input.path} does not exist.');
   }
 
   String template;
   if (snippetType == SnippetType.application) {
-    if (args[_kTemplateOption] == null || args[_kTemplateOption].isEmpty) {
+    final String templateArg = args[_kTemplateOption] as String;
+    if (templateArg == null || templateArg.isEmpty) {
       stderr.writeln(parser.usage);
       errorExit('The --$_kTemplateOption option must be specified on the command '
           'line for application snippets.');
     }
-    template = args[_kTemplateOption].toString().replaceAll(RegExp(r'.tmpl$'), '');
+    template = templateArg.replaceAll(RegExp(r'.tmpl$'), '');
   }
 
-  final String packageName = args[_kPackageOption] != null && args[_kPackageOption].isNotEmpty ? args[_kPackageOption] : null;
-  final String libraryName = args[_kLibraryOption] != null && args[_kLibraryOption].isNotEmpty ? args[_kLibraryOption] : null;
-  final String elementName = args[_kElementOption] != null && args[_kElementOption].isNotEmpty ? args[_kElementOption] : null;
-  final String serial = args[_kSerialOption] != null && args[_kSerialOption].isNotEmpty ? args[_kSerialOption] : null;
+  String emptyToNull(String value) => value?.isEmpty ?? true ? null : value;
+  final String packageName = emptyToNull(args[_kPackageOption] as String);
+  final String libraryName = emptyToNull(args[_kLibraryOption] as String);
+  final String elementName = emptyToNull(args[_kElementOption] as String);
+  final String serial = emptyToNull(args[_kSerialOption] as String);
   final List<String> id = <String>[];
   if (args[_kOutputOption] != null) {
-    id.add(path.basename(path.basenameWithoutExtension(args[_kOutputOption])));
+    id.add(path.basename(path.basenameWithoutExtension(args[_kOutputOption] as String)));
   } else {
     if (packageName != null && packageName != 'flutter') {
       id.add(packageName);
@@ -165,9 +167,9 @@
   stdout.write(generator.generate(
     input,
     snippetType,
-    showDartPad: args[_kShowDartPad],
+    showDartPad: args[_kShowDartPad] as bool,
     template: template,
-    output: args[_kOutputOption] != null ? File(args[_kOutputOption]) : null,
+    output: args[_kOutputOption] != null ? File(args[_kOutputOption] as String) : null,
     metadata: <String, Object>{
       'sourcePath': environment['SOURCE_PATH'],
       'sourceLine': environment['SOURCE_LINE'] != null
diff --git a/dev/snippets/lib/snippets.dart b/dev/snippets/lib/snippets.dart
index 289d719..3e955b0 100644
--- a/dev/snippets/lib/snippets.dart
+++ b/dev/snippets/lib/snippets.dart
@@ -129,8 +129,8 @@
       'code': htmlEscape.convert(result.join('\n')),
       'language': language ?? 'dart',
       'serial': '',
-      'id': metadata['id'],
-      'element': metadata['element'] ?? '',
+      'id': metadata['id'] as String,
+      'element': metadata['element'] as String ?? '',
       'app': '',
     };
     if (type == SnippetType.application) {
@@ -253,7 +253,7 @@
         }
 
         snippetData.add(_ComponentTuple('app', app.split('\n')));
-        final File outputFile = output ?? getOutputFile(metadata['id']);
+        final File outputFile = output ?? getOutputFile(metadata['id'] as String);
         stderr.writeln('Writing to ${outputFile.absolute.path}');
         outputFile.writeAsStringSync(app);
 
diff --git a/dev/snippets/test/snippets_test.dart b/dev/snippets/test/snippets_test.dart
index e8611f7..3d93f02 100644
--- a/dev/snippets/test/snippets_test.dart
+++ b/dev/snippets/test/snippets_test.dart
@@ -191,7 +191,7 @@
         metadata: <String, Object>{'sourcePath': 'some/path.dart', 'id': 'id'},
       );
       expect(expectedMetadataFile.existsSync(), isTrue);
-      final Map<String, dynamic> json = jsonDecode(expectedMetadataFile.readAsStringSync());
+      final Map<String, dynamic> json = jsonDecode(expectedMetadataFile.readAsStringSync()) as Map<String, dynamic>;
       expect(json['id'], equals('id'));
       expect(json['file'], equals('snippet_out.dart'));
       expect(json['description'], equals('A description of the snippet.\n\nOn several lines.'));
diff --git a/dev/tools/dartdoc.dart b/dev/tools/dartdoc.dart
index a035f5d..103697e 100644
--- a/dev/tools/dartdoc.dart
+++ b/dev/tools/dartdoc.dart
@@ -31,7 +31,7 @@
 Future<void> main(List<String> arguments) async {
   final ArgParser argParser = _createArgsParser();
   final ArgResults args = argParser.parse(arguments);
-  if (args['help']) {
+  if (args['help'] as bool) {
     print ('Usage:');
     print (argParser.usage);
     exit(0);
@@ -111,7 +111,7 @@
   final List<String> dartdocBaseArgs = <String>[
     'global',
     'run',
-    if (args['checked']) '-c',
+    if (args['checked'] as bool) '-c',
     'dartdoc',
   ];
 
@@ -130,8 +130,8 @@
   final List<String> dartdocArgs = <String>[
     ...dartdocBaseArgs,
     '--allow-tools',
-    if (args['json']) '--json',
-    if (args['validate-links']) '--validate-links' else '--no-validate-links',
+    if (args['json'] as bool) '--json',
+    if (args['validate-links'] as bool) '--validate-links' else '--no-validate-links',
     '--link-to-source-excludes', '../../bin/cache',
     '--link-to-source-root', '../..',
     '--link-to-source-uri-template', 'https://github.com/flutter/flutter/blob/master/%f%#L%l%',
@@ -207,14 +207,14 @@
     workingDirectory: kDocsRoot,
     environment: pubEnvironment,
   ));
-  printStream(process.stdout, prefix: args['json'] ? '' : 'dartdoc:stdout: ',
-    filter: args['verbose'] ? const <Pattern>[] : <Pattern>[
+  printStream(process.stdout, prefix: args['json'] as bool ? '' : 'dartdoc:stdout: ',
+    filter: args['verbose'] as bool ? const <Pattern>[] : <Pattern>[
       RegExp(r'^generating docs for library '), // unnecessary verbosity
       RegExp(r'^pars'), // unnecessary verbosity
     ],
   );
-  printStream(process.stderr, prefix: args['json'] ? '' : 'dartdoc:stderr: ',
-    filter: args['verbose'] ? const <Pattern>[] : <Pattern>[
+  printStream(process.stderr, prefix: args['json'] as bool ? '' : 'dartdoc:stderr: ',
+    filter: args['verbose'] as bool ? const <Pattern>[] : <Pattern>[
       RegExp(r'^ warning: .+: \(.+/\.pub-cache/hosted/pub.dartlang.org/.+\)'), // packages outside our control
     ],
   );
@@ -252,7 +252,7 @@
   if (gitResult.exitCode != 0)
     throw 'git status exit with non-zero exit code: ${gitResult.exitCode}';
   final Match gitBranchMatch = gitBranchRegexp.firstMatch(
-      gitResult.stdout.trim().split('\n').first);
+      (gitResult.stdout as String).trim().split('\n').first);
   return gitBranchMatch == null ? '' : gitBranchMatch.group(1).split('...').first;
 }
 
@@ -262,7 +262,7 @@
   final ProcessResult gitResult = Process.runSync('git', <String>['rev-parse', 'HEAD']);
   if (gitResult.exitCode != 0)
     throw 'git rev-parse exit with non-zero exit code: ${gitResult.exitCode}';
-  final String gitRevision = gitResult.stdout.trim();
+  final String gitRevision = (gitResult.stdout as String).trim();
 
   return gitRevision.length > kGitRevisionLength ? gitRevision.substring(0, kGitRevisionLength) : gitRevision;
 }
@@ -454,7 +454,7 @@
 }
 
 /// Finds all packages in the Flutter SDK
-List<FileSystemEntity> findPackages() {
+List<Directory> findPackages() {
   return Directory('packages')
     .listSync()
     .where((FileSystemEntity entity) {
diff --git a/dev/tools/gen_keycodes/bin/gen_keycodes.dart b/dev/tools/gen_keycodes/bin/gen_keycodes.dart
index 715d5cd..511a09f 100644
--- a/dev/tools/gen_keycodes/bin/gen_keycodes.dart
+++ b/dev/tools/gen_keycodes/bin/gen_keycodes.dart
@@ -132,61 +132,61 @@
 
   final ArgResults parsedArguments = argParser.parse(rawArguments);
 
-  if (parsedArguments['help']) {
+  if (parsedArguments['help'] as bool) {
     print(argParser.usage);
     exit(0);
   }
 
   KeyData data;
-  if (parsedArguments['collect']) {
+  if (parsedArguments['collect'] as bool) {
     String hidCodes;
     if (parsedArguments['chromium-hid-codes'] == null) {
       hidCodes = await getChromiumConversions();
     } else {
-      hidCodes = File(parsedArguments['chromium-hid-codes']).readAsStringSync();
+      hidCodes = File(parsedArguments['chromium-hid-codes'] as String).readAsStringSync();
     }
 
-    final String supplementalHidCodes = File(parsedArguments['supplemental-hid-codes']).readAsStringSync();
+    final String supplementalHidCodes = File(parsedArguments['supplemental-hid-codes'] as String).readAsStringSync();
     hidCodes = '$hidCodes\n$supplementalHidCodes';
 
     String androidKeyCodes;
     if (parsedArguments['android-keycodes'] == null) {
       androidKeyCodes = await getAndroidKeyCodes();
     } else {
-      androidKeyCodes = File(parsedArguments['android-keycodes']).readAsStringSync();
+      androidKeyCodes = File(parsedArguments['android-keycodes'] as String).readAsStringSync();
     }
 
     String androidScanCodes;
     if (parsedArguments['android-scancodes'] == null) {
       androidScanCodes = await getAndroidScanCodes();
     } else {
-      androidScanCodes = File(parsedArguments['android-scancodes']).readAsStringSync();
+      androidScanCodes = File(parsedArguments['android-scancodes'] as String).readAsStringSync();
     }
 
     String glfwKeyCodes;
     if (parsedArguments['glfw-keycodes'] == null) {
       glfwKeyCodes = await getGlfwKeyCodes();
     } else {
-      glfwKeyCodes = File(parsedArguments['glfw-keycodes']).readAsStringSync();
+      glfwKeyCodes = File(parsedArguments['glfw-keycodes'] as String).readAsStringSync();
     }
 
-    final String glfwToDomKey = File(parsedArguments['glfw-domkey']).readAsStringSync();
-    final String androidToDomKey = File(parsedArguments['android-domkey']).readAsStringSync();
+    final String glfwToDomKey = File(parsedArguments['glfw-domkey'] as String).readAsStringSync();
+    final String androidToDomKey = File(parsedArguments['android-domkey'] as String).readAsStringSync();
 
     data = KeyData(hidCodes, androidScanCodes, androidKeyCodes, androidToDomKey, glfwKeyCodes, glfwToDomKey);
 
     const JsonEncoder encoder = JsonEncoder.withIndent('  ');
-    File(parsedArguments['data']).writeAsStringSync(encoder.convert(data.toJson()));
+    File(parsedArguments['data'] as String).writeAsStringSync(encoder.convert(data.toJson()));
   } else {
-    data = KeyData.fromJson(json.decode(await File(parsedArguments['data']).readAsString()));
+    data = KeyData.fromJson(json.decode(await File(parsedArguments['data'] as String).readAsString()) as Map<String, dynamic>);
   }
 
-  final File codeFile = File(parsedArguments['code']);
+  final File codeFile = File(parsedArguments['code'] as String);
   if (!codeFile.existsSync()) {
     codeFile.createSync(recursive: true);
   }
 
-  final File mapsFile = File(parsedArguments['maps']);
+  final File mapsFile = File(parsedArguments['maps'] as String);
   if (!mapsFile.existsSync()) {
     mapsFile.createSync(recursive: true);
   }
diff --git a/dev/tools/gen_keycodes/lib/code_gen.dart b/dev/tools/gen_keycodes/lib/code_gen.dart
index 555f0d3..8d7d2d2 100644
--- a/dev/tools/gen_keycodes/lib/code_gen.dart
+++ b/dev/tools/gen_keycodes/lib/code_gen.dart
@@ -87,7 +87,7 @@
       // plane.
       final Key entry = keyData.data.firstWhere((Key item) => item.name == Key.synonyms[name][0]);
       final Set<String> unionNames = Key.synonyms[name].map<String>((dynamic name) {
-        return upperCamelToLowerCamel(name);
+        return upperCamelToLowerCamel(name as String);
       }).toSet();
       printKey(Key.synonymPlane | entry.flutterId, entry.keyLabel, name, Key.getCommentName(name),
           otherComments: wrapString('This key represents the union of the keys '
@@ -100,7 +100,7 @@
   String get logicalSynonyms {
     final StringBuffer synonyms = StringBuffer();
     for (String name in Key.synonyms.keys) {
-      for (String synonym in Key.synonyms[name]) {
+      for (String synonym in Key.synonyms[name].cast<String>()) {
         final String keyName = upperCamelToLowerCamel(synonym);
         synonyms.writeln('    $keyName: $name,');
       }
diff --git a/dev/tools/gen_keycodes/lib/key_data.dart b/dev/tools/gen_keycodes/lib/key_data.dart
index 10308fc..9c755a0 100644
--- a/dev/tools/gen_keycodes/lib/key_data.dart
+++ b/dev/tools/gen_keycodes/lib/key_data.dart
@@ -38,12 +38,12 @@
     _nameToAndroidKeyCode = _readAndroidKeyCodes(androidKeyCodeHeader);
     _nameToGlfwKeyCode = _readGlfwKeyCodes(glfwKeyCodeHeader);
     // Cast Android dom map
-    final Map<String, List<dynamic>> dynamicAndroidNames = json.decode(androidNameMap).cast<String, List<dynamic>>();
+    final Map<String, List<dynamic>> dynamicAndroidNames = (json.decode(androidNameMap) as Map<String, List<dynamic>>).cast<String, List<dynamic>>();
     _nameToAndroidName = dynamicAndroidNames.map<String, List<String>>((String key, List<dynamic> value) {
       return MapEntry<String, List<String>>(key, value.cast<String>());
     });
     // Cast GLFW dom map
-    final Map<String, List<dynamic>> dynamicGlfwNames = json.decode(glfwNameMap).cast<String, List<dynamic>>();
+    final Map<String, List<dynamic>> dynamicGlfwNames = (json.decode(glfwNameMap) as Map<String, List<dynamic>>).cast<String, List<dynamic>>();
     _nameToGlfwName = dynamicGlfwNames.map<String, List<String>>((String key, List<dynamic> value) {
       return MapEntry<String, List<String>>(key, value.cast<String>());
     });
@@ -53,7 +53,7 @@
   /// Parses the given JSON data and populates the data structure from it.
   KeyData.fromJson(Map<String, dynamic> contentMap) {
     data = <Key>[
-      for (String key in contentMap.keys) Key.fromJsonMapEntry(key, contentMap[key]),
+      for (String key in contentMap.keys) Key.fromJsonMapEntry(key, contentMap[key] as Map<String, List<dynamic>>),
     ];
   }
 
@@ -200,9 +200,9 @@
     replaced.forEach((String key, dynamic value) {
       // Some definition values point to other definitions (e.g #define GLFW_KEY_LAST GLFW_KEY_MENU).
       if (value is String) {
-        result[key] = replaced[value];
+        result[key] = replaced[value] as int;
       } else {
-        result[key] = value;
+        result[key] = value as int;
       }
     });
     return result;
@@ -285,18 +285,18 @@
   factory Key.fromJsonMapEntry(String name, Map<String, dynamic> map) {
     return Key(
       enumName: name,
-      name: map['names']['domkey'],
-      chromiumName: map['names']['chromium'],
-      usbHidCode: map['scanCodes']['usb'],
-      androidKeyNames: map['names']['android']?.cast<String>(),
-      androidScanCodes: map['scanCodes']['android']?.cast<int>(),
-      androidKeyCodes: map['keyCodes']['android']?.cast<int>(),
-      linuxScanCode: map['scanCodes']['linux'],
-      xKbScanCode: map['scanCodes']['xkb'],
-      windowsScanCode: map['scanCodes']['windows'],
-      macOsScanCode: map['scanCodes']['macos'],
-      glfwKeyNames: map['names']['glfw']?.cast<String>(),
-      glfwKeyCodes: map['keyCodes']['glfw']?.cast<int>(),
+      name: map['names']['domkey'] as String,
+      chromiumName: map['names']['chromium'] as String,
+      usbHidCode: map['scanCodes']['usb'] as int,
+      androidKeyNames: (map['names']['android'] as List<dynamic>)?.cast<String>(),
+      androidScanCodes: (map['scanCodes']['android'] as List<dynamic>)?.cast<int>(),
+      androidKeyCodes: (map['keyCodes']['android'] as List<dynamic>)?.cast<int>(),
+      linuxScanCode: map['scanCodes']['linux'] as int,
+      xKbScanCode: map['scanCodes']['xkb'] as int,
+      windowsScanCode: map['scanCodes']['windows'] as int,
+      macOsScanCode: map['scanCodes']['macos'] as int,
+      glfwKeyNames: (map['names']['glfw'] as List<dynamic>)?.cast<String>(),
+      glfwKeyCodes: (map['keyCodes']['glfw'] as List<dynamic>)?.cast<int>(),
     );
   }
 
@@ -427,7 +427,7 @@
   static Map<String, String> get printable {
     if (_printable == null) {
       final String printableKeys = File(path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'printable.json',)).readAsStringSync();
-      final Map<String, dynamic> printable = json.decode(printableKeys);
+      final Map<String, dynamic> printable = json.decode(printableKeys) as Map<String, dynamic>;
       _printable = printable.cast<String, String>();
     }
     return _printable;
@@ -442,7 +442,7 @@
   static Map<String, List<dynamic>> get synonyms {
     if (_synonym == null) {
       final String synonymKeys = File(path.join(flutterRoot.path, 'dev', 'tools', 'gen_keycodes', 'data', 'synonyms.json',)).readAsStringSync();
-      final Map<String, dynamic> synonym = json.decode(synonymKeys);
+      final Map<String, dynamic> synonym = json.decode(synonymKeys) as Map<String, dynamic>;
       _synonym = synonym.cast<String, List<dynamic>>();
     }
     return _synonym;
diff --git a/dev/tools/java_and_objc_doc.dart b/dev/tools/java_and_objc_doc.dart
index ce05801..7f41dff 100644
--- a/dev/tools/java_and_objc_doc.dart
+++ b/dev/tools/java_and_objc_doc.dart
@@ -60,7 +60,7 @@
     if (!af.name.endsWith('/')) {
       final File file = File('${output.path}/${af.name}');
       file.createSync(recursive: true);
-      file.writeAsBytesSync(af.content);
+      file.writeAsBytesSync(af.content as List<int>);
     }
   }
 
diff --git a/dev/tools/lib/roll_dev.dart b/dev/tools/lib/roll_dev.dart
index b51558a..1eae90e 100644
--- a/dev/tools/lib/roll_dev.dart
+++ b/dev/tools/lib/roll_dev.dart
@@ -66,12 +66,12 @@
     exit(1);
   }
 
-  final String level = argResults[kIncrement];
-  final String commit = argResults[kCommit];
-  final String origin = argResults[kOrigin];
-  final bool justPrint = argResults[kJustPrint];
-  final bool autoApprove = argResults[kYes];
-  final bool help = argResults[kHelp];
+  final String level = argResults[kIncrement] as String;
+  final String commit = argResults[kCommit] as String;
+  final String origin = argResults[kOrigin] as String;
+  final bool justPrint = argResults[kJustPrint] as bool;
+  final bool autoApprove = argResults[kYes] as bool;
+  final bool help = argResults[kHelp] as bool;
 
   if (help || level == null) {
     print('roll_dev.dart --increment=level --commit=hash • update the version tags and roll a new dev build.\n');
@@ -174,8 +174,8 @@
 
 String getGitOutput(String command, String explanation) {
   final ProcessResult result = _runGit(command);
-  if (result.stderr.isEmpty && result.exitCode == 0)
-    return result.stdout.trim();
+  if ((result.stderr as String).isEmpty && result.exitCode == 0)
+    return (result.stdout as String).trim();
   _reportGitFailureAndExit(result, explanation);
   return null; // for the analyzer's sake
 }
@@ -196,9 +196,9 @@
   } else {
     print('Failed to $explanation.');
   }
-  if (result.stdout.isNotEmpty)
+  if ((result.stdout as String).isNotEmpty)
     print('stdout from git:\n${result.stdout}\n');
-  if (result.stderr.isNotEmpty)
+  if ((result.stderr as String).isNotEmpty)
     print('stderr from git:\n${result.stderr}\n');
   exit(1);
 }
diff --git a/dev/tools/localization/encode_kn_arb_files.dart b/dev/tools/localization/encode_kn_arb_files.dart
index 1754ee3..ab648f0 100644
--- a/dev/tools/localization/encode_kn_arb_files.dart
+++ b/dev/tools/localization/encode_kn_arb_files.dart
@@ -32,7 +32,7 @@
 Map<String, dynamic> loadBundle(File file) {
   if (!FileSystemEntity.isFileSync(file.path))
     exitWithError('Unable to find input file: ${file.path}');
-  return json.decode(file.readAsStringSync());
+  return json.decode(file.readAsStringSync()) as Map<String, dynamic>;
 }
 
 void encodeBundleTranslations(Map<String, dynamic> bundle) {
@@ -41,7 +41,7 @@
     // to encode them.
     if (key.startsWith('@'))
       continue;
-    final String translation = bundle[key];
+    final String translation = bundle[key] as String;
     // Rewrite the string as a series of unicode characters in JSON format.
     // Like "\u0012\u0123\u1234".
     bundle[key] = translation.runes.map((int code) {
diff --git a/dev/tools/localization/gen_date_localizations.dart b/dev/tools/localization/gen_date_localizations.dart
index 62781dc..2a52fe7 100644
--- a/dev/tools/localization/gen_date_localizations.dart
+++ b/dev/tools/localization/gen_date_localizations.dart
@@ -108,7 +108,7 @@
   buffer.writeln('const Map<String, Map<String, String>> datePatterns = <String, Map<String, String>> {');
   patternFiles.forEach((String locale, File data) {
     if (_supportedLocales().contains(locale)) {
-      final Map<String, dynamic> patterns = json.decode(data.readAsStringSync());
+      final Map<String, dynamic> patterns = json.decode(data.readAsStringSync()) as Map<String, dynamic>;
       buffer.writeln("'$locale': <String, String>{");
       patterns.forEach((String key, dynamic value) {
         assert(value is String);
@@ -177,12 +177,13 @@
 
 Map<String, File> _listIntlData(Directory directory) {
   final Map<String, File> localeFiles = <String, File>{};
-  for (FileSystemEntity entity in directory.listSync()) {
-    final String filePath = entity.path;
-    if (FileSystemEntity.isFileSync(filePath) && filePath.endsWith('.json')) {
-      final String locale = path.basenameWithoutExtension(filePath);
-      localeFiles[locale] = entity;
-    }
+  final Iterable<File> files = directory
+    .listSync()
+    .whereType<File>()
+    .where((File file) => file.path.endsWith('.json'));
+  for (File file in files) {
+    final String locale = path.basenameWithoutExtension(file.path);
+    localeFiles[locale] = file;
   }
 
   final List<String> locales = localeFiles.keys.toList(growable: false);
diff --git a/dev/tools/localization/gen_l10n.dart b/dev/tools/localization/gen_l10n.dart
index 3bdad94..0d954cd 100644
--- a/dev/tools/localization/gen_l10n.dart
+++ b/dev/tools/localization/gen_l10n.dart
@@ -154,9 +154,9 @@
 }
 
 List<String> genMethodParameters(Map<String, dynamic> bundle, String key, String type) {
-  final Map<String, dynamic> attributesMap = bundle['@$key'];
+  final Map<String, dynamic> attributesMap = bundle['@$key'] as Map<String, dynamic>;
   if (attributesMap != null && attributesMap.containsKey('placeholders')) {
-    final Map<String, dynamic> placeholders = attributesMap['placeholders'];
+    final Map<String, dynamic> placeholders = attributesMap['placeholders'] as Map<String, dynamic>;
     return placeholders.keys.map((String parameter) => '$type $parameter').toList();
   }
   return <String>[];
@@ -164,14 +164,14 @@
 
 List<String> genIntlMethodArgs(Map<String, dynamic> bundle, String key) {
   final List<String> attributes = <String>['name: \'$key\''];
-  final Map<String, dynamic> attributesMap = bundle['@$key'];
+  final Map<String, dynamic> attributesMap = bundle['@$key'] as Map<String, dynamic>;
   if (attributesMap != null) {
     if (attributesMap.containsKey('description')) {
-      final String description = attributesMap['description'];
+      final String description = attributesMap['description'] as String;
       attributes.add('desc: ${generateString(description)}');
     }
     if (attributesMap.containsKey('placeholders')) {
-      final Map<String, dynamic> placeholders = attributesMap['placeholders'];
+      final Map<String, dynamic> placeholders = attributesMap['placeholders'] as Map<String, dynamic>;
       if (placeholders.isNotEmpty) {
         final String args = placeholders.keys.join(', ');
         attributes.add('args: <Object>[$args]');
@@ -183,15 +183,15 @@
 
 String genSimpleMethod(Map<String, dynamic> bundle, String key) {
   String genSimpleMethodMessage(Map<String, dynamic> bundle, String key) {
-    String message = bundle[key];
-    final Map<String, dynamic> attributesMap = bundle['@$key'];
-    final Map<String, dynamic> placeholders = attributesMap['placeholders'];
+    String message = bundle[key] as String;
+    final Map<String, dynamic> attributesMap = bundle['@$key'] as Map<String, dynamic>;
+    final Map<String, dynamic> placeholders = attributesMap['placeholders'] as Map<String, dynamic>;
     for (String placeholder in placeholders.keys)
       message = message.replaceAll('{$placeholder}', '\$$placeholder');
     return generateString(message);
   }
 
-  final Map<String, dynamic> attributesMap = bundle['@$key'];
+  final Map<String, dynamic> attributesMap = bundle['@$key'] as Map<String, dynamic>;
   if (attributesMap == null)
     exitWithError(
       'Resource attribute "@$key" was not found. Please ensure that each '
@@ -208,18 +208,18 @@
 
   return getterMethodTemplate
     .replaceAll('@methodName', key)
-    .replaceAll('@message', '${generateString(bundle[key])}')
+    .replaceAll('@message', '${generateString(bundle[key] as String)}')
     .replaceAll('@intlMethodArgs', genIntlMethodArgs(bundle, key).join(',\n      '));
 }
 
 String genPluralMethod(Map<String, dynamic> bundle, String key) {
-  final Map<String, dynamic> attributesMap = bundle['@$key'];
+  final Map<String, dynamic> attributesMap = bundle['@$key'] as Map<String, dynamic>;
   assert(attributesMap != null && attributesMap.containsKey('placeholders'));
-  final Iterable<String> placeholders = attributesMap['placeholders'].keys;
+  final Iterable<String> placeholders = attributesMap['placeholders'].keys as Iterable<String>;
 
   // To make it easier to parse the plurals message, temporarily replace each
   // "{placeholder}" parameter with "#placeholder#".
-  String message = bundle[key];
+  String message = bundle[key] as String;
   for (String placeholder in placeholders)
     message = message.replaceAll('{$placeholder}', '#$placeholder#');
 
@@ -354,13 +354,13 @@
     exit(0);
   }
 
-  final String arbPathString = results['arb-dir'];
-  final String outputFileString = results['output-localization-file'];
+  final String arbPathString = results['arb-dir'] as String;
+  final String outputFileString = results['output-localization-file'] as String;
 
   final Directory l10nDirectory = Directory(arbPathString);
-  final File templateArbFile = File(path.join(l10nDirectory.path, results['template-arb-file']));
+  final File templateArbFile = File(path.join(l10nDirectory.path, results['template-arb-file'] as String));
   final File outputFile = File(path.join(l10nDirectory.path, outputFileString));
-  final String stringsClassName = results['output-class'];
+  final String stringsClassName = results['output-class'] as String;
 
   if (!l10nDirectory.existsSync())
     exitWithError(
@@ -395,8 +395,8 @@
       final RegExp arbFilenameRE = RegExp(r'(\w+)\.arb$');
       if (arbFilenameRE.hasMatch(entityPath)) {
         final File arbFile = File(entityPath);
-        final Map<String, dynamic> arbContents = json.decode(arbFile.readAsStringSync());
-        String localeString = arbContents['@@locale'];
+        final Map<String, dynamic> arbContents = json.decode(arbFile.readAsStringSync()) as Map<String, dynamic>;
+        String localeString = arbContents['@@locale'] as String;
 
         if (localeString == null) {
           final RegExp arbFilenameLocaleRE = RegExp(r'^[^_]*_(\w+)\.arb$');
@@ -430,7 +430,7 @@
 
   Map<String, dynamic> bundle;
   try {
-    bundle = json.decode(templateArbFile.readAsStringSync());
+    bundle = json.decode(templateArbFile.readAsStringSync()) as Map<String, dynamic>;
   } on FileSystemException catch (e) {
     exitWithError('Unable to read input arb file: $e');
   } on FormatException catch (e) {
@@ -447,7 +447,7 @@
         'Invalid key format: $key \n It has to be in camel case, cannot start '
         'with a number, and cannot contain non-alphanumeric characters.'
       );
-    if (pluralValueRE.hasMatch(bundle[key]))
+    if (pluralValueRE.hasMatch(bundle[key] as String))
       classMethods.add(genPluralMethod(bundle, key));
     else
       classMethods.add(genSimpleMethod(bundle, key));
diff --git a/dev/tools/localization/gen_localizations.dart b/dev/tools/localization/gen_localizations.dart
index dac73a1..b10043f 100644
--- a/dev/tools/localization/gen_localizations.dart
+++ b/dev/tools/localization/gen_localizations.dart
@@ -136,7 +136,7 @@
 
     final Map<String, String> languageResources = localeToResources[languageLocale];
     for (String key in allKeys) {
-      final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
+      final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key] as Map<String, dynamic>;
       output.writeln(generateGetter(key, languageResources[key], attributes, languageLocale));
     }
     output.writeln('}');
@@ -158,7 +158,7 @@
         for (String key in scriptResources.keys.toList()..sort()) {
           if (languageResources[key] == scriptResources[key])
             continue;
-          final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
+          final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key] as Map<String, dynamic>;
           output.writeln(generateGetter(key, scriptResources[key], attributes, languageLocale));
         }
         output.writeln('}');
@@ -183,7 +183,7 @@
             // When script fallback contains the key, we compare to it instead of language fallback.
             if (scriptResources.containsKey(key) ? scriptResources[key] == localeResources[key] : languageResources[key] == localeResources[key])
               continue;
-            final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
+            final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key] as Map<String, dynamic>;
             output.writeln(generateGetter(key, localeResources[key], attributes, languageLocale));
           }
          output.writeln('}');
@@ -207,7 +207,7 @@
         for (String key in localeResources.keys) {
           if (languageResources[key] == localeResources[key])
             continue;
-          final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key];
+          final Map<String, dynamic> attributes = localeToResourceAttributes[canonicalLocale][key] as Map<String, dynamic>;
           output.writeln(generateGetter(key, localeResources[key], attributes, languageLocale));
         }
        output.writeln('}');
@@ -380,7 +380,7 @@
 /// Used by [generateGetter] below.
 String generateType(Map<String, dynamic> attributes) {
   if (attributes != null) {
-    switch (attributes['x-flutter-type']) {
+    switch (attributes['x-flutter-type'] as String) {
       case 'icuShortTimePattern':
         return 'TimeOfDayFormat';
       case 'scriptCategory':
@@ -401,7 +401,7 @@
   if (attributes != null) {
     if (attributes.containsKey('parameters'))
       return '${key}Raw';
-    switch (attributes['x-flutter-type']) {
+    switch (attributes['x-flutter-type'] as String) {
       case 'icuShortTimePattern':
         return '${key}Raw';
     }
@@ -443,7 +443,7 @@
     return null;
   // cupertino_en.arb doesn't use x-flutter-type.
   if (attributes != null) {
-    switch (attributes['x-flutter-type']) {
+    switch (attributes['x-flutter-type'] as String) {
       case 'icuShortTimePattern':
         if (!_icuTimeOfDayToEnum.containsKey(value)) {
           throw Exception(
diff --git a/dev/tools/localization/localizations_utils.dart b/dev/tools/localization/localizations_utils.dart
index 7312ebd..61d830d 100644
--- a/dev/tools/localization/localizations_utils.dart
+++ b/dev/tools/localization/localizations_utils.dart
@@ -114,10 +114,8 @@
 
   @override
   bool operator ==(Object other) {
-    if (!(other is LocaleInfo))
-      return false;
-    final LocaleInfo otherLocale = other;
-    return originalString == otherLocale.originalString;
+    return other is LocaleInfo
+        && other.originalString == originalString;
   }
 
   @override
@@ -167,13 +165,13 @@
       void populateResources(LocaleInfo locale, File file) {
         final Map<String, String> resources = localeToResources[locale];
         final Map<String, dynamic> attributes = localeToResourceAttributes[locale];
-        final Map<String, dynamic> bundle = json.decode(file.readAsStringSync());
+        final Map<String, dynamic> bundle = json.decode(file.readAsStringSync()) as Map<String, dynamic>;
         for (String key in bundle.keys) {
           // The ARB file resource "attributes" for foo are called @foo.
           if (key.startsWith('@'))
             attributes[key.substring(1)] = bundle[key];
           else
-            resources[key] = bundle[key];
+            resources[key] = bundle[key] as String;
         }
       }
       // Only pre-assume scriptCode if there is a country or script code to assume off of.
@@ -247,9 +245,9 @@
       defaultsTo: false,
     );
   final argslib.ArgResults args = argParser.parse(rawArgs);
-  final bool writeToFile = args['overwrite'];
-  final bool materialOnly = args['material'];
-  final bool cupertinoOnly = args['cupertino'];
+  final bool writeToFile = args['overwrite'] as bool;
+  final bool materialOnly = args['material'] as bool;
+  final bool cupertinoOnly = args['cupertino'] as bool;
 
   return GeneratorOptions(writeToFile: writeToFile, materialOnly: materialOnly, cupertinoOnly: cupertinoOnly);
 }
diff --git a/dev/tools/localization/localizations_validator.dart b/dev/tools/localization/localizations_validator.dart
index 5f1df38..17cd9c8 100644
--- a/dev/tools/localization/localizations_validator.dart
+++ b/dev/tools/localization/localizations_validator.dart
@@ -36,7 +36,7 @@
     throw ValidationError(errorMessages.toString());
   }
 
-  final Map<String, dynamic> bundle = json.decode(file.readAsStringSync());
+  final Map<String, dynamic> bundle = json.decode(file.readAsStringSync()) as Map<String, dynamic>;
 
   for (String resourceId in bundle.keys) {
     if (resourceId.startsWith('@'))
@@ -67,11 +67,11 @@
       continue;
     }
 
-    final String description = atResource['description'];
+    final String description = atResource['description'] as String;
     if (description == null)
       errorMessages.writeln('No description specified for $atResourceId');
 
-    final String plural = atResource['plural'];
+    final String plural = atResource['plural'] as String;
     final String resourceId = atResourceId.substring(1);
     if (plural != null) {
       final String resourceIdOther = '${resourceId}Other';
diff --git a/dev/tools/mega_gallery.dart b/dev/tools/mega_gallery.dart
index 31a392f..7dcaa66 100644
--- a/dev/tools/mega_gallery.dart
+++ b/dev/tools/mega_gallery.dart
@@ -25,7 +25,7 @@
 
   final ArgResults results = argParser.parse(args);
 
-  if (results['help']) {
+  if (results['help'] as bool) {
     print('Generate n copies of flutter_gallery.\n');
     print('usage: dart mega_gallery.dart <options>');
     print(argParser.usage);
@@ -33,9 +33,9 @@
   }
 
   final Directory source = Directory(_normalize('examples/flutter_gallery'));
-  final Directory out = Directory(_normalize(results['out']));
+  final Directory out = Directory(_normalize(results['out'] as String));
 
-  if (results['delete']) {
+  if (results['delete'] as bool) {
     if (out.existsSync()) {
       print('Deleting ${out.path}');
       out.deleteSync(recursive: true);
@@ -55,7 +55,7 @@
     final SourceStats stats = getStatsFor(_dir(source, 'lib'));
     copies = (kTargetLineCount / stats.lines).round();
   } else {
-    copies = int.parse(results['copies']);
+    copies = int.parse(results['copies'] as String);
   }
 
   print('Making $copies copies of flutter_gallery.');
@@ -89,7 +89,7 @@
   _file(out, '.dartignore').writeAsStringSync('');
 
   // Count source lines and number of files; tell how to run it.
-  print('  ${path.relative(results["out"])} : ${getStatsFor(out)}');
+  print('  ${path.relative(results["out"] as String)} : ${getStatsFor(out)}');
 }
 
 // TODO(devoncarew): Create an entry-point that builds a UI with all `n` copies.
diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart
index 5863b35..d5b07b0 100644
--- a/dev/tools/update_icons.dart
+++ b/dev/tools/update_icons.dart
@@ -158,12 +158,12 @@
   argParser.addFlag(kOptionDryRun, defaultsTo: false);
   final ArgResults argResults = argParser.parse(args);
 
-  final File iconFile = File(path.absolute(argResults[kOptionIconsPath]));
+  final File iconFile = File(path.absolute(argResults[kOptionIconsPath] as String));
   if (!iconFile.existsSync()) {
     stderr.writeln('Icons file not found: ${iconFile.path}');
     exit(1);
   }
-  final File codepointsFile = File(path.absolute(argResults[kOptionCodepointsPath]));
+  final File codepointsFile = File(path.absolute(argResults[kOptionCodepointsPath] as String));
   if (!codepointsFile.existsSync()) {
     stderr.writeln('Codepoints file not found: ${codepointsFile.path}');
     exit(1);
@@ -173,7 +173,7 @@
   final String codepointData = codepointsFile.readAsStringSync();
   final String newIconData = regenerateIconsFile(iconData, codepointData);
 
-  if (argResults[kOptionDryRun])
+  if (argResults[kOptionDryRun] as bool)
     stdout.writeln(newIconData);
   else
     iconFile.writeAsStringSync(newIconData);
diff --git a/dev/tools/vitool/bin/main.dart b/dev/tools/vitool/bin/main.dart
index cfdf9ab..29d24d2 100644
--- a/dev/tools/vitool/bin/main.dart
+++ b/dev/tools/vitool/bin/main.dart
@@ -56,7 +56,7 @@
 
   final ArgResults argResults = parser.parse(args);
 
-  if (argResults['help'] ||
+  if (argResults['help'] as bool ||
     !argResults.wasParsed('output') ||
     !argResults.wasParsed('asset-name') ||
     argResults.rest.isEmpty) {
@@ -71,20 +71,20 @@
   final StringBuffer generatedSb = StringBuffer();
 
   if (argResults.wasParsed('header')) {
-    generatedSb.write(File(argResults['header']).readAsStringSync());
+    generatedSb.write(File(argResults['header'] as String).readAsStringSync());
     generatedSb.write('\n');
   }
 
-  if (argResults['codegen_comment'])
+  if (argResults['codegen_comment'] as bool)
     generatedSb.write(kCodegenComment);
 
   if (argResults.wasParsed('part-of'))
     generatedSb.write('part of ${argResults['part-of']};\n');
 
   final Animation animation = Animation.fromFrameData(frames);
-  generatedSb.write(animation.toDart('_AnimatedIconData', argResults['asset-name']));
+  generatedSb.write(animation.toDart('_AnimatedIconData', argResults['asset-name'] as String));
 
-  final File outFile = File(argResults['output']);
+  final File outFile = File(argResults['output'] as String);
   outFile.writeAsStringSync(generatedSb.toString());
 }
 
diff --git a/dev/tools/vitool/lib/vitool.dart b/dev/tools/vitool/lib/vitool.dart
index b8dd447..52e07e5 100644
--- a/dev/tools/vitool/lib/vitool.dart
+++ b/dev/tools/vitool/lib/vitool.dart
@@ -204,7 +204,7 @@
   for (XmlNode node in children) {
     if (node.nodeType != XmlNodeType.ELEMENT)
       continue;
-    final XmlElement element = node;
+    final XmlElement element = node as XmlElement;
 
     if (element.name.local == 'path') {
       paths.add(SvgPath.fromElement(element).applyTransform(transform));
@@ -270,9 +270,9 @@
   bool operator ==(Object other) {
     if (runtimeType != other.runtimeType)
       return false;
-    final FrameData typedOther = other;
-    return size == typedOther.size
-        && const ListEquality<SvgPath>().equals(paths, typedOther.paths);
+    return other is FrameData
+        && other.size == size
+        && const ListEquality<SvgPath>().equals(other.paths, paths);
   }
 
   @override
@@ -322,10 +322,10 @@
   bool operator ==(Object other) {
     if (runtimeType != other.runtimeType)
       return false;
-    final SvgPath typedOther = other;
-    return id == typedOther.id
-        && opacity == typedOther.opacity
-        && const ListEquality<SvgPathCommand>().equals(commands, typedOther.commands);
+    return other is SvgPath
+        && other.id == id
+        && other.opacity == opacity
+        && const ListEquality<SvgPathCommand>().equals(other.commands, commands);
   }
 
   @override
@@ -371,9 +371,9 @@
   bool operator ==(Object other) {
     if (runtimeType != other.runtimeType)
       return false;
-    final SvgPathCommand typedOther = other;
-    return type == typedOther.type
-        && const ListEquality<Point<double>>().equals(points, typedOther.points);
+    return other is SvgPathCommand
+        && other.type == type
+        && const ListEquality<Point<double>>().equals(other.points, points);
   }
 
   @override
@@ -554,7 +554,7 @@
   return document.children.singleWhere(
     (XmlNode node) => node.nodeType  == XmlNodeType.ELEMENT &&
       _asElement(node).name.local == 'svg'
-  );
+  ) as XmlElement;
 }
 
-XmlElement _asElement(XmlNode node) => node;
+XmlElement _asElement(XmlNode node) => node as XmlElement;
diff --git a/dev/tools/vitool/test/vitool_test.dart b/dev/tools/vitool/test/vitool_test.dart
index 12fefd7..82d2020 100644
--- a/dev/tools/vitool/test/vitool_test.dart
+++ b/dev/tools/vitool/test/vitool_test.dart
@@ -622,7 +622,7 @@
     if (item.runtimeType != actual.runtimeType)
       return false;
 
-    final SvgPath other = item;
+    final SvgPath other = item as SvgPath;
     if (other.id != actual.id || other.opacity != actual.opacity)
       return false;
 
@@ -666,7 +666,7 @@
     if (item.runtimeType != expected.runtimeType)
       return false;
 
-    final PathAnimation other = item;
+    final PathAnimation other = item as PathAnimation;
 
     if (!const ListEquality<double>().equals(other.opacities, expected.opacities))
       return false;
