diff --git a/packages/flutter_tools/lib/src/android/android_builder.dart b/packages/flutter_tools/lib/src/android/android_builder.dart
index 17b5d5d..40ddbd6 100644
--- a/packages/flutter_tools/lib/src/android/android_builder.dart
+++ b/packages/flutter_tools/lib/src/android/android_builder.dart
@@ -68,7 +68,7 @@
         // Module projects artifacts are located in `build/host`.
         outputDirectory = outputDirectory.childDirectory('host');
       }
-      for (AndroidBuildInfo androidBuildInfo in androidBuildInfo) {
+      for (final AndroidBuildInfo androidBuildInfo in androidBuildInfo) {
         await buildGradleAar(
           project: project,
           androidBuildInfo: androidBuildInfo,
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 3b8d6b5..384e3b0 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -732,7 +732,7 @@
 Map<String, String> parseAdbDeviceProperties(String str) {
   final Map<String, String> properties = <String, String>{};
   final RegExp propertyExp = RegExp(r'\[(.*?)\]: \[(.*?)\]');
-  for (Match match in propertyExp.allMatches(str)) {
+  for (final Match match in propertyExp.allMatches(str)) {
     properties[match.group(1)] = match.group(2);
   }
   return properties;
@@ -932,7 +932,7 @@
     return;
   }
 
-  for (String line in text.trim().split('\n')) {
+  for (final String line in text.trim().split('\n')) {
     // Skip lines like: * daemon started successfully *
     if (line.startsWith('* daemon ')) {
       continue;
@@ -958,7 +958,7 @@
       final Map<String, String> info = <String, String>{};
       if (rest != null && rest.isNotEmpty) {
         rest = rest.trim();
-        for (String data in rest.split(' ')) {
+        for (final String data in rest.split(' ')) {
           if (data.contains(':')) {
             final List<String> fields = data.split(':');
             info[fields[0]] = fields[1];
@@ -1165,7 +1165,7 @@
     }
 
     final List<String> lines = LineSplitter.split(stdout).toList();
-    for (String line in lines) {
+    for (final String line in lines) {
       if (!line.startsWith(device.id)) {
         continue;
       }
@@ -1260,7 +1260,7 @@
 
   @override
   Future<void> dispose() async {
-    for (ForwardedPort port in forwardedPorts) {
+    for (final ForwardedPort port in forwardedPorts) {
       await unforward(port);
     }
   }
diff --git a/packages/flutter_tools/lib/src/android/android_emulator.dart b/packages/flutter_tools/lib/src/android/android_emulator.dart
index 5a7a04e..b7c0557 100644
--- a/packages/flutter_tools/lib/src/android/android_emulator.dart
+++ b/packages/flutter_tools/lib/src/android/android_emulator.dart
@@ -85,7 +85,7 @@
 /// Parse the given `emulator -list-avds` output in [text], and fill out the given list
 /// of emulators by reading information from the relevant ini files.
 void extractEmulatorAvdInfo(String text, List<AndroidEmulator> emulators) {
-  for (String id in text.trim().split('\n').where((String l) => l != '')) {
+  for (final String id in text.trim().split('\n').where((String l) => l != '')) {
     emulators.add(_loadEmulatorInfo(id));
   }
 }
@@ -125,7 +125,7 @@
       // Split into name/value
       .map<List<String>>((String l) => l.split('='));
 
-  for (List<String> property in properties) {
+  for (final List<String> property in properties) {
     results[property[0].trim()] = property[1].trim();
   }
 
diff --git a/packages/flutter_tools/lib/src/android/android_sdk.dart b/packages/flutter_tools/lib/src/android/android_sdk.dart
index 7c4ab74..50fc605 100644
--- a/packages/flutter_tools/lib/src/android/android_sdk.dart
+++ b/packages/flutter_tools/lib/src/android/android_sdk.dart
@@ -215,7 +215,7 @@
           .map<String>((String line) => line.trim())
           .where((String line) => line.isNotEmpty);
       final Map<String, String> properties = <String, String>{};
-      for (String line in propertiesFileLines) {
+      for (final String line in propertiesFileLines) {
         final List<String> parts = line.split(' = ');
         if (parts.length == 2) {
           properties[parts[0]] = parts[1];
diff --git a/packages/flutter_tools/lib/src/android/android_studio.dart b/packages/flutter_tools/lib/src/android/android_studio.dart
index 32014e2..f7ebfb4 100644
--- a/packages/flutter_tools/lib/src/android/android_studio.dart
+++ b/packages/flutter_tools/lib/src/android/android_studio.dart
@@ -183,7 +183,7 @@
             .directory(path)
             .listSync(followLinks: false)
             .whereType<Directory>();
-        for (Directory directory in directories) {
+        for (final Directory directory in directories) {
           final String name = directory.basename;
           // An exact match, or something like 'Android Studio 3.0 Preview.app'.
           if (name.startsWith('Android Studio') && name.endsWith('.app')) {
@@ -236,7 +236,7 @@
     // Read all $HOME/.AndroidStudio*/system/.home files. There may be several
     // pointing to the same installation, so we grab only the latest one.
     if (homeDirPath != null && globals.fs.directory(homeDirPath).existsSync()) {
-      for (FileSystemEntity entity in globals.fs.directory(homeDirPath).listSync(followLinks: false)) {
+      for (final FileSystemEntity entity in globals.fs.directory(homeDirPath).listSync(followLinks: false)) {
         if (entity is Directory && entity.basename.startsWith('.AndroidStudio')) {
           final AndroidStudio studio = AndroidStudio.fromHomeDot(entity);
           if (studio != null && !_hasStudioAt(studio.directory, newerThan: studio.version)) {
diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart
index 676599a..82364a1 100644
--- a/packages/flutter_tools/lib/src/android/gradle.dart
+++ b/packages/flutter_tools/lib/src/android/gradle.dart
@@ -116,7 +116,7 @@
   if (!appGradle.existsSync()) {
     return false;
   }
-  for (String line in appGradle.readAsLinesSync()) {
+  for (final String line in appGradle.readAsLinesSync()) {
     if (line.contains(RegExp(r'apply from: .*/flutter.gradle')) ||
         line.contains("def flutterPluginVersion = 'managed'")) {
       return true;
@@ -184,7 +184,7 @@
   existingVariants.add(settingsAarContent);
 
   bool exactMatch = false;
-  for (String fileContentVariant in existingVariants) {
+  for (final String fileContentVariant in existingVariants) {
     if (currentFileContent.trim() == fileContentVariant.trim()) {
       exactMatch = true;
       break;
@@ -465,7 +465,7 @@
   final File apkShaFile = apkDirectory.childFile('app.apk.sha1');
   apkShaFile.writeAsStringSync(_calculateSha(apkFiles.first));
 
-  for (File apkFile in apkFiles) {
+  for (final File apkFile in apkFiles) {
     final String appSize = (buildInfo.mode == BuildMode.debug)
       ? '' // Don't display the size when building a debug variant.
       : ' (${getSizeAsMB(apkFile.lengthSync())})';
@@ -618,7 +618,7 @@
 
     dependencies {''');
 
-  for (String buildMode in buildModes) {
+  for (final String buildMode in buildModes) {
     globals.printStatus('''
       ${buildMode}Implementation '$androidPackage:flutter_$buildMode:$buildNumber''');
   }
@@ -647,7 +647,7 @@
 
 String _hex(List<int> bytes) {
   final StringBuffer result = StringBuffer();
-  for (int part in bytes) {
+  for (final int part in bytes) {
     result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
   }
   return result.toString();
@@ -707,7 +707,7 @@
     return;
   }
   final List<String> plugins = flutterPluginFile.readAsStringSync().split('\n');
-  for (String plugin in plugins) {
+  for (final String plugin in plugins) {
     final List<String> pluginParts = plugin.split('=');
     if (pluginParts.length != 2) {
       continue;
@@ -882,7 +882,7 @@
   }
   final Iterable<xml.XmlElement> project = document.findElements('project');
   assert(project.isNotEmpty);
-  for (xml.XmlElement versionElement in document.findAllElements('version')) {
+  for (final xml.XmlElement versionElement in document.findAllElements('version')) {
     if (versionElement.parent == project.first) {
       return versionElement.text;
     }
@@ -919,7 +919,7 @@
       'flutter_embedding_$buildMode.pom',
     )
   );
-  for (String artifact in const <String>['pom', 'jar']) {
+  for (final String artifact in const <String>['pom', 'jar']) {
     // The Android embedding artifacts.
     _createSymlink(
       globals.fs.path.join(
diff --git a/packages/flutter_tools/lib/src/android/gradle_errors.dart b/packages/flutter_tools/lib/src/android/gradle_errors.dart
index be2c00a..9d5e63b 100644
--- a/packages/flutter_tools/lib/src/android/gradle_errors.dart
+++ b/packages/flutter_tools/lib/src/android/gradle_errors.dart
@@ -283,7 +283,7 @@
     );
     // Extract build types and product flavors.
     final Set<String> variants = <String>{};
-    for (String task in tasksRunResult.stdout.split('\n')) {
+    for (final String task in tasksRunResult.stdout.split('\n')) {
       final Match match = _assembleTaskPattern.matchAsPrefix(task);
       if (match != null) {
         final String variant = match.group(1).toLowerCase();
diff --git a/packages/flutter_tools/lib/src/aot.dart b/packages/flutter_tools/lib/src/aot.dart
index bbf4c0e..976eb09 100644
--- a/packages/flutter_tools/lib/src/aot.dart
+++ b/packages/flutter_tools/lib/src/aot.dart
@@ -89,7 +89,7 @@
       if (platform == TargetPlatform.ios) {
         // Determine which iOS architectures to build for.
         final Map<DarwinArch, String> iosBuilds = <DarwinArch, String>{};
-        for (DarwinArch arch in iosBuildArchs) {
+        for (final DarwinArch arch in iosBuildArchs) {
           iosBuilds[arch] = globals.fs.path.join(outputPath, getNameForDarwinArch(arch));
         }
 
@@ -224,7 +224,7 @@
     ));
     status?.stop();
     if (!result.success) {
-      for (ExceptionMeasurement measurement in result.exceptions.values) {
+      for (final ExceptionMeasurement measurement in result.exceptions.values) {
         globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart
index 27625a3..034f02d 100644
--- a/packages/flutter_tools/lib/src/application_package.dart
+++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -213,16 +213,16 @@
     final String packageId = manifests.first.getAttribute('package');
 
     String launchActivity;
-    for (xml.XmlElement activity in document.findAllElements('activity')) {
+    for (final xml.XmlElement activity in document.findAllElements('activity')) {
       final String enabled = activity.getAttribute('android:enabled');
       if (enabled != null && enabled == 'false') {
         continue;
       }
 
-      for (xml.XmlElement element in activity.findElements('intent-filter')) {
+      for (final xml.XmlElement element in activity.findElements('intent-filter')) {
         String actionName = '';
         String categoryName = '';
-        for (xml.XmlNode node in element.children) {
+        for (final xml.XmlNode node in element.children) {
           if (node is! xml.XmlElement) {
             continue;
           }
@@ -511,7 +511,7 @@
   static bool isAttributeWithValuePresent(_Element baseElement,
       String childElement, String attributeName, String attributeValue) {
     final Iterable<_Element> allElements = baseElement.allElements(childElement);
-    for (_Element oneElement in allElements) {
+    for (final _Element oneElement in allElements) {
       final String elementAttributeValue = oneElement
           ?.firstAttribute(attributeName)
           ?.value;
@@ -535,7 +535,7 @@
     final _Element manifest = _Element.fromLine(lines[manifestLine], null);
     _Element currentElement = manifest;
 
-    for (String line in lines.skip(manifestLine)) {
+    for (final String line in lines.skip(manifestLine)) {
       final String trimLine = line.trimLeft();
       final int level = line.length - trimLine.length;
 
@@ -564,7 +564,7 @@
     final Iterable<_Element> activities = application.allElements('activity');
 
     _Element launchActivity;
-    for (_Element activity in activities) {
+    for (final _Element activity in activities) {
       final _Attribute enabled = activity.firstAttribute('android:enabled');
       final Iterable<_Element> intentFilters = activity.allElements('intent-filter');
       final bool isEnabledByDefault = enabled == null;
@@ -573,7 +573,7 @@
         continue;
       }
 
-      for (_Element element in intentFilters) {
+      for (final _Element element in intentFilters) {
         final bool isMainAction = isAttributeWithValuePresent(
             element, 'action', 'android:name', '"android.intent.action.MAIN"');
         if (!isMainAction) {
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index 60f6ef6..e9d7c46 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -509,7 +509,7 @@
   String _genSnapshotPath() {
     const List<String> clangDirs = <String>['.', 'clang_x64', 'clang_x86', 'clang_i386'];
     final String genSnapshotName = _artifactToFileName(Artifact.genSnapshot);
-    for (String clangDir in clangDirs) {
+    for (final String clangDir in clangDirs) {
       final String genSnapshotPath = globals.fs.path.join(engineOutPath, clangDir, genSnapshotName);
       if (globals.processManager.canRun(genSnapshotPath)) {
         return genSnapshotPath;
diff --git a/packages/flutter_tools/lib/src/asset.dart b/packages/flutter_tools/lib/src/asset.dart
index 3c151c9..d1a4706 100644
--- a/packages/flutter_tools/lib/src/asset.dart
+++ b/packages/flutter_tools/lib/src/asset.dart
@@ -89,11 +89,11 @@
       return true;
     }
 
-    for (Directory directory in _wildcardDirectories.values) {
+    for (final Directory directory in _wildcardDirectories.values) {
       if (!directory.existsSync()) {
         return true; // directory was deleted.
       }
-      for (File file in directory.listSync().whereType<File>()) {
+      for (final File file in directory.listSync().whereType<File>()) {
         final DateTime dateTime = file.statSync().modified;
         if (dateTime == null) {
           continue;
@@ -166,7 +166,7 @@
     );
 
     // Add fonts and assets from packages.
-    for (String packageName in packageMap.map.keys) {
+    for (final String packageName in packageMap.map.keys) {
       final Uri package = packageMap.map[packageName];
       if (package != null && package.scheme == 'file') {
         final String packageManifestPath = globals.fs.path.fromUri(package.resolve('../pubspec.yaml'));
@@ -204,7 +204,7 @@
 
     // Save the contents of each image, image variant, and font
     // asset in entries.
-    for (_Asset asset in assetVariants.keys) {
+    for (final _Asset asset in assetVariants.keys) {
       if (!asset.assetFileExists && assetVariants[asset].isEmpty) {
         globals.printStatus('Error detected in pubspec.yaml:', emphasis: true);
         globals.printError('No file or variants found for $asset.\n');
@@ -220,7 +220,7 @@
         assert(!assetVariants[asset].contains(asset));
         assetVariants[asset].insert(0, asset);
       }
-      for (_Asset variant in assetVariants[asset]) {
+      for (final _Asset variant in assetVariants[asset]) {
         assert(variant.assetFileExists);
         entries[variant.entryUri.path] ??= DevFSFileContent(variant.assetFile);
       }
@@ -230,13 +230,13 @@
       if (flutterManifest.usesMaterialDesign && includeDefaultFonts)
         ..._getMaterialAssets(_fontSetMaterial),
     ];
-    for (_Asset asset in materialAssets) {
+    for (final _Asset asset in materialAssets) {
       assert(asset.assetFileExists);
       entries[asset.entryUri.path] ??= DevFSFileContent(asset.assetFile);
     }
 
     // Update wildcard directories we we can detect changes in them.
-    for (Uri uri in wildcardDirectories) {
+    for (final Uri uri in wildcardDirectories) {
       _wildcardDirectories[uri] ??= globals.fs.directory(uri);
     }
 
@@ -321,8 +321,8 @@
 List<_Asset> _getMaterialAssets(String fontSet) {
   final List<_Asset> result = <_Asset>[];
 
-  for (Map<String, dynamic> family in _getMaterialFonts(fontSet)) {
-    for (Map<dynamic, dynamic> font in family['fonts']) {
+  for (final Map<String, dynamic> family in _getMaterialFonts(fontSet)) {
+    for (final Map<dynamic, dynamic> font in family['fonts']) {
       final Uri entryUri = globals.fs.path.toUri(font['asset'] as String);
       result.add(_Asset(
         baseDir: globals.fs.path.join(Cache.flutterRoot, 'bin', 'cache', 'artifacts', 'material_fonts'),
@@ -358,7 +358,7 @@
   // sources, and might need to include a license for each one.)
   final Map<String, Set<String>> packageLicenses = <String, Set<String>>{};
   final Set<String> allPackages = <String>{};
-  for (String packageName in packageMap.map.keys) {
+  for (final String packageName in packageMap.map.keys) {
     final Uri package = packageMap.map[packageName];
     if (package == null || package.scheme != 'file') {
       continue;
@@ -369,7 +369,7 @@
     }
     final List<String> rawLicenses =
         file.readAsStringSync().split(_licenseSeparator);
-    for (String rawLicense in rawLicenses) {
+    for (final String rawLicense in rawLicenses) {
       List<String> packageNames;
       String licenseText;
       if (rawLicenses.length > 1) {
@@ -421,9 +421,9 @@
       .keys.toList()
     ..sort(_byBasename);
 
-  for (_Asset main in sortedKeys) {
+  for (final _Asset main in sortedKeys) {
     jsonObject[main.entryUri.path] = <String>[
-      for (_Asset variant in assetVariants[main])
+      for (final _Asset variant in assetVariants[main])
         variant.entryUri.path,
     ];
   }
@@ -458,9 +458,9 @@
   PackageMap packageMap,
 ) {
   final List<Font> packageFonts = <Font>[];
-  for (Font font in manifest.fonts) {
+  for (final Font font in manifest.fonts) {
     final List<FontAsset> packageFontAssets = <FontAsset>[];
-    for (FontAsset fontAsset in font.fontAssets) {
+    for (final FontAsset fontAsset in font.fontAssets) {
       final Uri assetUri = fontAsset.assetUri;
       if (assetUri.pathSegments.first == 'packages' &&
           !globals.fs.isFileSync(globals.fs.path.fromUri(packageMap.map[packageName].resolve('../${assetUri.path}')))) {
@@ -513,7 +513,7 @@
 
     if (_cache[directory] == null) {
       final List<String> paths = <String>[];
-      for (FileSystemEntity entity in globals.fs.directory(directory).listSync(recursive: true)) {
+      for (final FileSystemEntity entity in globals.fs.directory(directory).listSync(recursive: true)) {
         final String path = entity.path;
         if (globals.fs.isFileSync(path) && !_excluded.any((String exclude) => path.startsWith(exclude))) {
           paths.add(path);
@@ -521,7 +521,7 @@
       }
 
       final Map<String, List<String>> variants = <String, List<String>>{};
-      for (String path in paths) {
+      for (final String path in paths) {
         final String variantName = globals.fs.path.basename(path);
         if (directory == globals.fs.path.dirname(path)) {
           continue;
@@ -572,7 +572,7 @@
   final Map<_Asset, List<_Asset>> result = <_Asset, List<_Asset>>{};
 
   final _AssetDirectoryCache cache = _AssetDirectoryCache(excludeDirs);
-  for (Uri assetUri in flutterManifest.assets) {
+  for (final Uri assetUri in flutterManifest.assets) {
     if (assetUri.toString().endsWith('/')) {
       wildcardDirectories.add(assetUri);
       _parseAssetsFromFolder(packageMap, flutterManifest, assetBase,
@@ -586,8 +586,8 @@
   }
 
   // Add assets referenced in the fonts section of the manifest.
-  for (Font font in flutterManifest.fonts) {
-    for (FontAsset fontAsset in font.fontAssets) {
+  for (final Font font in flutterManifest.fonts) {
+    for (final FontAsset fontAsset in font.fontAssets) {
       final _Asset baseAsset = _resolveAsset(
         packageMap,
         assetBase,
@@ -626,7 +626,7 @@
 
   final List<FileSystemEntity> lister = globals.fs.directory(directoryPath).listSync();
 
-  for (FileSystemEntity entity in lister) {
+  for (final FileSystemEntity entity in lister) {
     if (entity is File) {
       final String relativePath = globals.fs.path.relative(entity.path, from: assetBase);
 
@@ -655,7 +655,7 @@
     packageName,
   );
   final List<_Asset> variants = <_Asset>[];
-  for (String path in cache.variantsFor(asset.assetFile.path)) {
+  for (final String path in cache.variantsFor(asset.assetFile.path)) {
     final String relativePath = globals.fs.path.relative(path, from: asset.baseDir);
     final Uri relativeUri = globals.fs.path.toUri(relativePath);
     final Uri entryUri = asset.symbolicPrefixUri == null
diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart
index 9d5c8fc..15e7bc9 100644
--- a/packages/flutter_tools/lib/src/base/build.dart
+++ b/packages/flutter_tools/lib/src/base/build.dart
@@ -185,7 +185,7 @@
     final bool stripSymbols = platform == TargetPlatform.ios && buildMode == BuildMode.release && bitcode;
     if (stripSymbols) {
       final IOSink sink = globals.fs.file('$assembly.stripped.S').openWrite();
-      for (String line in globals.fs.file(assembly).readAsLinesSync()) {
+      for (final String line in globals.fs.file(assembly).readAsLinesSync()) {
         if (line.startsWith('.section __DWARF')) {
           break;
         }
diff --git a/packages/flutter_tools/lib/src/base/file_system.dart b/packages/flutter_tools/lib/src/base/file_system.dart
index 4100d77..6e3ccce 100644
--- a/packages/flutter_tools/lib/src/base/file_system.dart
+++ b/packages/flutter_tools/lib/src/base/file_system.dart
@@ -42,7 +42,7 @@
     destDir.createSync(recursive: true);
   }
 
-  for (FileSystemEntity entity in srcDir.listSync()) {
+  for (final FileSystemEntity entity in srcDir.listSync()) {
     final String newPath = destDir.fileSystem.path.join(destDir.path, entity.basename);
     if (entity is File) {
       final File newFile = destDir.fileSystem.file(newPath);
diff --git a/packages/flutter_tools/lib/src/base/fingerprint.dart b/packages/flutter_tools/lib/src/base/fingerprint.dart
index 5fc0b2f..9ef80c7 100644
--- a/packages/flutter_tools/lib/src/base/fingerprint.dart
+++ b/packages/flutter_tools/lib/src/base/fingerprint.dart
@@ -87,7 +87,7 @@
   List<String> _getPaths() {
     final Set<String> paths = <String>{
       ..._paths,
-      for (String depfilePath in _depfilePaths)
+      for (final String depfilePath in _depfilePaths)
         ...readDepfile(depfilePath),
     };
     final FingerprintPathFilter filter = _pathFilter ?? (String path) => true;
@@ -108,7 +108,7 @@
     }
 
     _checksums = <String, String>{};
-    for (File file in files) {
+    for (final File file in files) {
       final List<int> bytes = file.readAsBytesSync();
       _checksums[file.path] = md5.convert(bytes).toString();
     }
diff --git a/packages/flutter_tools/lib/src/base/net.dart b/packages/flutter_tools/lib/src/base/net.dart
index 150e1a1..38fa19c 100644
--- a/packages/flutter_tools/lib/src/base/net.dart
+++ b/packages/flutter_tools/lib/src/base/net.dart
@@ -187,7 +187,7 @@
   @override
   void writeAll(Iterable<dynamic> objects, [ String separator = '' ]) {
     bool addSeparator = false;
-    for (dynamic object in objects) {
+    for (final dynamic object in objects) {
       if (addSeparator) {
         write(separator);
       }
diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index f07c758..b0cd1d4 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -248,7 +248,7 @@
   @override
   void zip(Directory data, File zipFile) {
     final Archive archive = Archive();
-    for (FileSystemEntity entity in data.listSync(recursive: true)) {
+    for (final FileSystemEntity entity in data.listSync(recursive: true)) {
       if (entity is! File) {
         continue;
       }
@@ -299,7 +299,7 @@
   }
 
   void _unpackArchive(Archive archive, Directory targetDirectory) {
-    for (ArchiveFile archiveFile in archive.files) {
+    for (final ArchiveFile archiveFile in archive.files) {
       // The archive package doesn't correctly set isFile.
       if (!archiveFile.isFile || archiveFile.name.endsWith('/')) {
         continue;
diff --git a/packages/flutter_tools/lib/src/base/process.dart b/packages/flutter_tools/lib/src/base/process.dart
index e2e6128..fb634e8 100644
--- a/packages/flutter_tools/lib/src/base/process.dart
+++ b/packages/flutter_tools/lib/src/base/process.dart
@@ -78,11 +78,11 @@
   globals.printTrace('Running shutdown hooks');
   _shutdownHooksRunning = true;
   try {
-    for (ShutdownStage stage in _shutdownHooks.keys.toList()..sort()) {
+    for (final ShutdownStage stage in _shutdownHooks.keys.toList()..sort()) {
       globals.printTrace('Shutdown hook priority ${stage.priority}');
       final List<ShutdownHook> hooks = _shutdownHooks.remove(stage);
       final List<Future<dynamic>> futures = <Future<dynamic>>[];
-      for (ShutdownHook shutdownHook in hooks) {
+      for (final ShutdownHook shutdownHook in hooks) {
         final FutureOr<dynamic> result = shutdownHook();
         if (result is Future<dynamic>) {
           futures.add(result);
diff --git a/packages/flutter_tools/lib/src/base/signals.dart b/packages/flutter_tools/lib/src/base/signals.dart
index 3899d4f..28b9e67 100644
--- a/packages/flutter_tools/lib/src/base/signals.dart
+++ b/packages/flutter_tools/lib/src/base/signals.dart
@@ -114,7 +114,7 @@
   }
 
   Future<void> _handleSignal(ProcessSignal s) async {
-    for (SignalHandler handler in _handlersList[s]) {
+    for (final SignalHandler handler in _handlersList[s]) {
       try {
         await asyncGuard<void>(() async => handler(s));
       } catch (e) {
diff --git a/packages/flutter_tools/lib/src/base/utils.dart b/packages/flutter_tools/lib/src/base/utils.dart
index 0cfcc72..b246d10 100644
--- a/packages/flutter_tools/lib/src/base/utils.dart
+++ b/packages/flutter_tools/lib/src/base/utils.dart
@@ -319,7 +319,7 @@
   hangingIndent ??= 0;
   final List<String> splitText = text.split('\n');
   final List<String> result = <String>[];
-  for (String line in splitText) {
+  for (final String line in splitText) {
     String trimmedText = line.trimLeft();
     final String leadingWhitespace = line.substring(0, line.length - trimmedText.length);
     List<String> notIndented;
@@ -433,7 +433,7 @@
     final RegExp characterOrCode = RegExp('(\u001b\[[0-9;]*m|.)', multiLine: true);
     List<_AnsiRun> result = <_AnsiRun>[];
     final StringBuffer current = StringBuffer();
-    for (Match match in characterOrCode.allMatches(input)) {
+    for (final Match match in characterOrCode.allMatches(input)) {
       current.write(match[0]);
       if (match[0].length < 4) {
         // This is a regular character, write it out.
@@ -461,7 +461,7 @@
 
   final List<String> result = <String>[];
   final int effectiveLength = max(columnWidth - start, kMinColumnWidth);
-  for (String line in text.split('\n')) {
+  for (final String line in text.split('\n')) {
     // If the line is short enough, even with ANSI codes, then we can just add
     // add it and move on.
     if (line.length <= effectiveLength || !shouldWrap) {
diff --git a/packages/flutter_tools/lib/src/base/version.dart b/packages/flutter_tools/lib/src/base/version.dart
index 5e79435..e89772c 100644
--- a/packages/flutter_tools/lib/src/base/version.dart
+++ b/packages/flutter_tools/lib/src/base/version.dart
@@ -52,7 +52,7 @@
   /// This is the highest-numbered stable version.
   static Version primary(List<Version> versions) {
     Version primary;
-    for (Version version in versions) {
+    for (final Version version in versions) {
       if (primary == null || (version > primary)) {
         primary = version;
       }
diff --git a/packages/flutter_tools/lib/src/build_runner/build_runner.dart b/packages/flutter_tools/lib/src/build_runner/build_runner.dart
index 082605f..0a9334e 100644
--- a/packages/flutter_tools/lib/src/build_runner/build_runner.dart
+++ b/packages/flutter_tools/lib/src/build_runner/build_runner.dart
@@ -78,7 +78,7 @@
       stringBuffer.writeln('dependencies:');
       final YamlMap builders = flutterProject.builders;
       if (builders != null) {
-        for (String name in builders.keys.cast<String>()) {
+        for (final String name in builders.keys.cast<String>()) {
           final Object node = builders[name];
           // For relative paths, make sure it is accounted for
           // parent directories.
diff --git a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
index de5f20d..df9c642 100644
--- a/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
+++ b/packages/flutter_tools/lib/src/build_runner/web_compilation_delegate.dart
@@ -60,7 +60,7 @@
     );
     client.startBuild();
     bool success = true;
-    await for (BuildResults results in client.buildResults) {
+    await for (final BuildResults results in client.buildResults) {
       final BuildResult result = results.results.firstWhere((BuildResult result) {
         return result.target == 'web';
       });
@@ -81,7 +81,7 @@
       final Iterable<Directory> childDirectories = rootDirectory
         .listSync()
         .whereType<Directory>();
-      for (Directory childDirectory in childDirectories) {
+      for (final Directory childDirectory in childDirectories) {
         final String path = globals.fs.path.join(testOutputDir, 'packages',
             globals.fs.path.basename(childDirectory.path));
         copyDirectorySync(childDirectory.childDirectory('lib'), globals.fs.directory(path));
@@ -135,7 +135,7 @@
   Stream<AssetId> findAssets(Glob glob, {String package}) async* {
     if (package == null || packageGraph.root.name == package) {
       final String generatedRoot = globals.fs.path.join(generatedDirectory.path, packageGraph.root.name);
-      await for (io.FileSystemEntity entity in glob.list(followLinks: true, root: packageGraph.root.path)) {
+      await for (final io.FileSystemEntity entity in glob.list(followLinks: true, root: packageGraph.root.path)) {
         if (entity is io.File && _isNotHidden(entity) && !globals.fs.path.isWithin(generatedRoot, entity.path)) {
           yield _fileToAssetId(entity, packageGraph.root);
         }
@@ -143,7 +143,7 @@
       if (!globals.fs.isDirectorySync(generatedRoot)) {
         return;
       }
-      await for (io.FileSystemEntity entity in glob.list(followLinks: true, root: generatedRoot)) {
+      await for (final io.FileSystemEntity entity in glob.list(followLinks: true, root: generatedRoot)) {
         if (entity is io.File && _isNotHidden(entity)) {
           yield _fileToAssetId(entity, packageGraph.root, globals.fs.path.relative(generatedRoot), true);
         }
diff --git a/packages/flutter_tools/lib/src/build_runner/web_fs.dart b/packages/flutter_tools/lib/src/build_runner/web_fs.dart
index 1e9c0bd..f4c97b6 100644
--- a/packages/flutter_tools/lib/src/build_runner/web_fs.dart
+++ b/packages/flutter_tools/lib/src/build_runner/web_fs.dart
@@ -154,7 +154,7 @@
       return true;
     }
     _client.startBuild();
-    await for (BuildResults results in _client.buildResults) {
+    await for (final BuildResults results in _client.buildResults) {
       final BuildResult result = results.results.firstWhere((BuildResult result) {
         return result.target == kBuildTargetName;
       });
@@ -367,7 +367,7 @@
   @override
   Future<Response> handle(Request request) async {
     Uri fileUri;
-    for (Uri uri in _searchPaths) {
+    for (final Uri uri in _searchPaths) {
       final Uri potential = uri.resolve(request.url.path);
       if (potential == null || !globals.fs.isFileSync(potential.toFilePath())) {
         continue;
@@ -445,7 +445,7 @@
           final Archive archive = TarDecoder().decodeBytes(dart2jsArchive.readAsBytesSync());
           partFiles = globals.fs.systemTempDirectory.createTempSync('flutter_tool.')
             ..createSync();
-          for (ArchiveFile file in archive) {
+          for (final ArchiveFile file in archive) {
             partFiles.childFile(file.name).writeAsBytesSync(file.content as List<int>);
           }
         }
@@ -664,7 +664,7 @@
       '--define', 'flutter_tools:shell=initializePlatform=$initializePlatform',
       // The following will cause build runner to only build tests that were requested.
       if (testTargets != null && testTargets.hasBuildFilters)
-        for (String buildFilter in testTargets.buildFilters)
+        for (final String buildFilter in testTargets.buildFilters)
           '--build-filter=$buildFilter',
     ];
 
diff --git a/packages/flutter_tools/lib/src/build_system/build_system.dart b/packages/flutter_tools/lib/src/build_system/build_system.dart
index 1f67a56..6f4f85a 100644
--- a/packages/flutter_tools/lib/src/build_system/build_system.dart
+++ b/packages/flutter_tools/lib/src/build_system/build_system.dart
@@ -138,7 +138,7 @@
       inputsFiles.sources,
       outputFiles.sources,
       <Node>[
-        for (Target target in dependencies) target._toNode(environment),
+        for (final Target target in dependencies) target._toNode(environment),
       ],
       environment,
       inputsFiles.containsNewDepfile,
@@ -160,11 +160,11 @@
   ) {
     final File stamp = _findStampFile(environment);
     final List<String> inputPaths = <String>[];
-    for (File input in inputs) {
+    for (final File input in inputs) {
       inputPaths.add(input.path);
     }
     final List<String> outputPaths = <String>[];
-    for (File output in outputs) {
+    for (final File output in outputs) {
       outputPaths.add(output.path);
     }
     final Map<String, Object> result = <String, Object>{
@@ -207,13 +207,13 @@
     return <String, Object>{
       'name': name,
       'dependencies': <String>[
-        for (Target target in dependencies) target.name,
+        for (final Target target in dependencies) target.name,
       ],
       'inputs': <String>[
-        for (File file in resolveInputs(environment).sources) file.path,
+        for (final File file in resolveInputs(environment).sources) file.path,
       ],
       'outputs': <String>[
-        for (File file in resolveOutputs(environment).sources) file.path,
+        for (final File file in resolveOutputs(environment).sources) file.path,
       ],
       'stamp': _findStampFile(environment).absolute.path,
     };
@@ -229,7 +229,7 @@
     List<String> depfiles, Environment environment, { bool implicit = true, bool inputs = true,
   }) {
     final SourceVisitor collector = SourceVisitor(environment, inputs);
-    for (Source source in config) {
+    for (final Source source in config) {
       source.accept(collector);
     }
     depfiles.forEach(collector.visitDepfile);
@@ -292,7 +292,7 @@
     String buildPrefix;
     final List<String> keys = defines.keys.toList()..sort();
     final StringBuffer buffer = StringBuffer();
-    for (String key in keys) {
+    for (final String key in keys) {
       buffer.write(key);
       buffer.write(defines[key]);
     }
@@ -502,10 +502,10 @@
     // these files are included as both inputs and outputs then it isn't
     // possible to construct a DAG describing the build.
     void updateGraph() {
-      for (File output in node.outputs) {
+      for (final File output in node.outputs) {
         outputFiles[output.path] = output;
       }
-      for (File input in node.inputs) {
+      for (final File input in node.inputs) {
         final String resolvedPath = input.absolute.path;
         if (outputFiles.containsKey(resolvedPath)) {
           continue;
@@ -550,7 +550,7 @@
 
       // Delete outputs from previous stages that are no longer a part of the
       // build.
-      for (String previousOutput in node.previousOutputs) {
+      for (final String previousOutput in node.previousOutputs) {
         if (outputFiles.containsKey(previousOutput)) {
           continue;
         }
@@ -614,7 +614,7 @@
     }
     visited.add(target);
     stack.add(target);
-    for (Target dependency in target.dependencies) {
+    for (final Target dependency in target.dependencies) {
       checkInternal(dependency, visited, stack);
     }
     stack.remove(target);
@@ -627,7 +627,7 @@
   final String buildDirectory = environment.buildDir.resolveSymbolicLinksSync();
   final String projectDirectory = environment.projectDir.resolveSymbolicLinksSync();
   final List<File> missingOutputs = <File>[];
-  for (File sourceFile in outputs) {
+  for (final File sourceFile in outputs) {
     if (!sourceFile.existsSync()) {
       missingOutputs.add(sourceFile);
       continue;
@@ -733,13 +733,13 @@
     FileHashStore fileHashStore,
   ) async {
     final Set<String> currentOutputPaths = <String>{
-      for (File file in outputs) file.path,
+      for (final File file in outputs) file.path,
     };
     // For each input, first determine if we've already computed the hash
     // for it. Then collect it to be sent off for hashing as a group.
     final List<File> sourcesToHash = <File>[];
     final List<File> missingInputs = <File>[];
-    for (File file in inputs) {
+    for (final File file in inputs) {
       if (!file.existsSync()) {
         missingInputs.add(file);
         continue;
@@ -760,7 +760,7 @@
 
     // For each output, first determine if we've already computed the hash
     // for it. Then collect it to be sent off for hashing as a group.
-    for (String previousOutput in previousOutputs) {
+    for (final String previousOutput in previousOutputs) {
       // output paths changed.
       if (!currentOutputPaths.contains(previousOutput)) {
         _dirty = true;
diff --git a/packages/flutter_tools/lib/src/build_system/depfile.dart b/packages/flutter_tools/lib/src/build_system/depfile.dart
index 6e777af..6ae6021 100644
--- a/packages/flutter_tools/lib/src/build_system/depfile.dart
+++ b/packages/flutter_tools/lib/src/build_system/depfile.dart
@@ -31,7 +31,7 @@
   /// file must be manually specified.
   factory Depfile.parseDart2js(File file, File output) {
     final List<File> inputs = <File>[];
-    for (String rawUri in file.readAsLinesSync()) {
+    for (final String rawUri in file.readAsLinesSync()) {
       if (rawUri.trim().isEmpty) {
         continue;
       }
@@ -72,7 +72,7 @@
   }
 
   void _writeFilesToBuffer(List<File> files, StringBuffer buffer) {
-    for (File outputFile in files) {
+    for (final File outputFile in files) {
       if (globals.platform.isWindows) {
         // Paths in a depfile have to be escaped on windows.
         final String escapedPath = outputFile.path.replaceAll(r'\', r'\\');
diff --git a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
index 72925ee..0879c7b 100644
--- a/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
+++ b/packages/flutter_tools/lib/src/build_system/file_hash_store.dart
@@ -24,7 +24,7 @@
     final int version = json['version'] as int;
     final List<Map<String, Object>> rawCachedFiles = (json['files'] as List<dynamic>).cast<Map<String, Object>>();
     final List<FileHash> cachedFiles = <FileHash>[
-      for (Map<String, Object> rawFile in rawCachedFiles) FileHash.fromJson(rawFile),
+      for (final Map<String, Object> rawFile in rawCachedFiles) FileHash.fromJson(rawFile),
     ];
     return FileStorage(version, cachedFiles);
   }
@@ -36,7 +36,7 @@
     final Map<String, Object> json = <String, Object>{
       'version': version,
       'files': <Object>[
-        for (FileHash file in files) file.toJson(),
+        for (final FileHash file in files) file.toJson(),
       ],
     };
     return utf8.encode(jsonEncode(json));
@@ -118,7 +118,7 @@
       cacheFile.deleteSync();
       return;
     }
-    for (FileHash fileHash in fileStorage.files) {
+    for (final FileHash fileHash in fileStorage.files) {
       previousHashes[fileHash.path] = fileHash.hash;
     }
     globals.printTrace('Done initializing file store');
@@ -132,7 +132,7 @@
       cacheFile.createSync(recursive: true);
     }
     final List<FileHash> fileHashes = <FileHash>[];
-    for (MapEntry<String, String> entry in currentHashes.entries) {
+    for (final MapEntry<String, String> entry in currentHashes.entries) {
       fileHashes.add(FileHash(entry.key, entry.value));
     }
     final FileStorage fileStorage = FileStorage(
@@ -158,7 +158,7 @@
     final List<File> dirty = <File>[];
     final Pool openFiles = Pool(kMaxOpenFiles);
     await Future.wait(<Future<void>>[
-       for (File file in files) _hashFile(file, dirty, openFiles)
+       for (final File file in files) _hashFile(file, dirty, openFiles)
     ]);
     return dirty;
   }
diff --git a/packages/flutter_tools/lib/src/build_system/source.dart b/packages/flutter_tools/lib/src/build_system/source.dart
index eb35f95..e0df5cb 100644
--- a/packages/flutter_tools/lib/src/build_system/source.dart
+++ b/packages/flutter_tools/lib/src/build_system/source.dart
@@ -146,7 +146,7 @@
     if (!globals.fs.directory(filePath).existsSync()) {
       throw Exception('$filePath does not exist!');
     }
-    for (FileSystemEntity entity in globals.fs.directory(filePath).listSync()) {
+    for (final FileSystemEntity entity in globals.fs.directory(filePath).listSync()) {
       final String filename = globals.fs.path.basename(entity.path);
       if (wildcardSegments.isEmpty) {
         sources.add(globals.fs.file(entity.absolute));
diff --git a/packages/flutter_tools/lib/src/build_system/targets/ios.dart b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
index 1d9152a..032e270 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/ios.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/ios.dart
@@ -59,7 +59,7 @@
       // If we're building multiple iOS archs the binaries need to be lipo'd
       // together.
       final List<Future<int>> pending = <Future<int>>[];
-      for (DarwinArch iosArch in iosArchs) {
+      for (final DarwinArch iosArch in iosArchs) {
         pending.add(snapshotter.build(
           platform: targetPlatform,
           buildMode: buildMode,
diff --git a/packages/flutter_tools/lib/src/build_system/targets/linux.dart b/packages/flutter_tools/lib/src/build_system/targets/linux.dart
index 706b788..8375ecd 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/linux.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/linux.dart
@@ -59,7 +59,7 @@
     );
     // The native linux artifacts are composed of 6 files and a directory (listed above)
     // which need to be copied to the target directory.
-    for (String artifact in _kLinuxArtifacts) {
+    for (final String artifact in _kLinuxArtifacts) {
       final String entityPath = globals.fs.path.join(basePath, artifact);
       // If this artifact is a file, just copy the source over.
       if (globals.fs.isFileSync(entityPath)) {
@@ -79,7 +79,7 @@
       }
       // If the artifact is the directory cpp_client_wrapper, recursively
       // copy every file from it.
-      for (File input in globals.fs.directory(entityPath)
+      for (final File input in globals.fs.directory(entityPath)
           .listSync(recursive: true)
           .whereType<File>()) {
         final String outputPath = globals.fs.path.join(
diff --git a/packages/flutter_tools/lib/src/build_system/targets/web.dart b/packages/flutter_tools/lib/src/build_system/targets/web.dart
index 97e0a00..00d9f63 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/web.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/web.dart
@@ -170,7 +170,7 @@
         '-Ddart.vm.profile=true'
       else
         '-Ddart.vm.product=true',
-      for (String dartDefine in parseDartDefines(environment))
+      for (final String dartDefine in parseDartDefines(environment))
         '-D$dartDefine',
       environment.buildDir.childFile('main.dart').path,
     ]);
@@ -224,7 +224,7 @@
 
   @override
   Future<void> build(Environment environment) async {
-    for (File outputFile in environment.buildDir.listSync(recursive: true).whereType<File>()) {
+    for (final File outputFile in environment.buildDir.listSync(recursive: true).whereType<File>()) {
       if (!globals.fs.path.basename(outputFile.path).contains('main.dart.js')) {
         continue;
       }
diff --git a/packages/flutter_tools/lib/src/build_system/targets/windows.dart b/packages/flutter_tools/lib/src/build_system/targets/windows.dart
index 5b05aa1..ce1ee7b 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/windows.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/windows.dart
@@ -41,7 +41,7 @@
   Future<void> build(Environment environment) async {
     // This path needs to match the prefix in the rule below.
     final String basePath = globals.artifacts.getArtifactPath(Artifact.windowsDesktopPath);
-    for (File input in globals.fs.directory(basePath)
+    for (final File input in globals.fs.directory(basePath)
         .listSync(recursive: true)
         .whereType<File>()) {
       final String outputPath = globals.fs.path.join(
diff --git a/packages/flutter_tools/lib/src/bundle.dart b/packages/flutter_tools/lib/src/bundle.dart
index 2a3c938..b496587 100644
--- a/packages/flutter_tools/lib/src/bundle.dart
+++ b/packages/flutter_tools/lib/src/bundle.dart
@@ -126,7 +126,7 @@
   final BuildResult result = await buildSystem.build(target, environment);
 
   if (!result.success) {
-    for (ExceptionMeasurement measurement in result.exceptions.values) {
+    for (final ExceptionMeasurement measurement in result.exceptions.values) {
         globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
diff --git a/packages/flutter_tools/lib/src/cache.dart b/packages/flutter_tools/lib/src/cache.dart
index 821f4c2..4320f34 100644
--- a/packages/flutter_tools/lib/src/cache.dart
+++ b/packages/flutter_tools/lib/src/cache.dart
@@ -108,7 +108,7 @@
       _artifacts.add(MacOSFuchsiaSDKArtifacts(this));
       _artifacts.add(FlutterRunnerSDKArtifacts(this));
       _artifacts.add(FlutterRunnerDebugSymbols(this));
-      for (String artifactName in IosUsbArtifacts.artifactNames) {
+      for (final String artifactName in IosUsbArtifacts.artifactNames) {
         _artifacts.add(IosUsbArtifacts(artifactName, this));
       }
     } else {
@@ -300,7 +300,7 @@
       return _dyLdLibEntry;
     }
     final List<String> paths = <String>[];
-    for (ArtifactSet artifact in _artifacts) {
+    for (final ArtifactSet artifact in _artifacts) {
       final Map<String, String> env = artifact.environment;
       if (env == null || !env.containsKey('DYLD_LIBRARY_PATH')) {
         continue;
@@ -378,7 +378,7 @@
     if (!_lockEnabled) {
       return;
     }
-    for (ArtifactSet artifact in _artifacts) {
+    for (final ArtifactSet artifact in _artifacts) {
       if (!requiredArtifacts.contains(artifact.developmentArtifact)) {
         globals.printTrace('Artifact $artifact is not required, skipping update.');
         continue;
@@ -409,7 +409,7 @@
     final bool includeAllPlatformsState = globals.cache.includeAllPlatforms;
     bool allAvailible = true;
     globals.cache.includeAllPlatforms = includeAllPlatforms;
-    for (ArtifactSet cachedArtifact in _artifacts) {
+    for (final ArtifactSet cachedArtifact in _artifacts) {
       if (cachedArtifact is EngineCachedArtifact) {
         allAvailible &= await cachedArtifact.checkForArtifacts(engineVersion);
       }
@@ -496,7 +496,7 @@
 
   /// Clear any zip/gzip files downloaded.
   void _removeDownloadedFiles() {
-    for (File f in downloadedFiles) {
+    for (final File f in downloadedFiles) {
       try {
         f.deleteSync();
       } on FileSystemException catch (e) {
@@ -606,7 +606,7 @@
     final Uri url = Uri.parse('${cache.storageBaseUrl}/flutter_infra/flutter/$version/$platformName.zip');
     await _downloadZipArchive('Downloading Web SDK...', url, location);
     // This is a temporary work-around for not being able to safely download into a shared directory.
-    for (FileSystemEntity entity in location.listSync(recursive: true)) {
+    for (final FileSystemEntity entity in location.listSync(recursive: true)) {
       if (entity is File) {
         final List<String> segments = globals.fs.path.split(entity.path);
         segments.remove('flutter_web_sdk');
@@ -643,21 +643,21 @@
   @override
   bool isUpToDateInner() {
     final Directory pkgDir = cache.getCacheDir('pkg');
-    for (String pkgName in getPackageDirs()) {
+    for (final String pkgName in getPackageDirs()) {
       final String pkgPath = globals.fs.path.join(pkgDir.path, pkgName);
       if (!globals.fs.directory(pkgPath).existsSync()) {
         return false;
       }
     }
 
-    for (List<String> toolsDir in getBinaryDirs()) {
+    for (final List<String> toolsDir in getBinaryDirs()) {
       final Directory dir = globals.fs.directory(globals.fs.path.join(location.path, toolsDir[0]));
       if (!dir.existsSync()) {
         return false;
       }
     }
 
-    for (String licenseDir in getLicenseDirs()) {
+    for (final String licenseDir in getLicenseDirs()) {
       final File file = globals.fs.file(globals.fs.path.join(location.path, licenseDir, 'LICENSE'));
       if (!file.existsSync()) {
         return false;
@@ -671,11 +671,11 @@
     final String url = '${cache.storageBaseUrl}/flutter_infra/flutter/$version/';
 
     final Directory pkgDir = cache.getCacheDir('pkg');
-    for (String pkgName in getPackageDirs()) {
+    for (final String pkgName in getPackageDirs()) {
       await _downloadZipArchive('Downloading package $pkgName...', Uri.parse(url + pkgName + '.zip'), pkgDir);
     }
 
-    for (List<String> toolsDir in getBinaryDirs()) {
+    for (final List<String> toolsDir in getBinaryDirs()) {
       final String cacheDir = toolsDir[0];
       final String urlPath = toolsDir[1];
       final Directory dir = globals.fs.directory(globals.fs.path.join(location.path, cacheDir));
@@ -684,7 +684,7 @@
       _makeFilesExecutable(dir);
 
       const List<String> frameworkNames = <String>['Flutter', 'FlutterMacOS'];
-      for (String frameworkName in frameworkNames) {
+      for (final String frameworkName in frameworkNames) {
         final File frameworkZip = globals.fs.file(globals.fs.path.join(dir.path, '$frameworkName.framework.zip'));
         if (frameworkZip.existsSync()) {
           final Directory framework = globals.fs.directory(globals.fs.path.join(dir.path, '$frameworkName.framework'));
@@ -695,7 +695,7 @@
     }
 
     final File licenseSource = cache.getLicenseFile();
-    for (String licenseDir in getLicenseDirs()) {
+    for (final String licenseDir in getLicenseDirs()) {
       final String licenseDestinationPath = globals.fs.path.join(location.path, licenseDir, 'LICENSE');
       await licenseSource.copy(licenseDestinationPath);
     }
@@ -706,7 +706,7 @@
     final String url = '${cache.storageBaseUrl}/flutter_infra/flutter/$engineVersion/';
 
     bool exists = false;
-    for (String pkgName in getPackageDirs()) {
+    for (final String pkgName in getPackageDirs()) {
       exists = await _doesRemoteExist('Checking package $pkgName is available...',
           Uri.parse(url + pkgName + '.zip'));
       if (!exists) {
@@ -714,7 +714,7 @@
       }
     }
 
-    for (List<String> toolsDir in getBinaryDirs()) {
+    for (final List<String> toolsDir in getBinaryDirs()) {
       final String cacheDir = toolsDir[0];
       final String urlPath = toolsDir[1];
       exists = await _doesRemoteExist('Checking $cacheDir tools are available...',
@@ -728,7 +728,7 @@
 
   void _makeFilesExecutable(Directory dir) {
     os.chmod(dir, 'a+r,a+x');
-    for (FileSystemEntity entity in dir.listSync(recursive: true)) {
+    for (final FileSystemEntity entity in dir.listSync(recursive: true)) {
       if (entity is File) {
         final FileStat stat = entity.statSync();
         final bool isUserExecutable = ((stat.mode >> 6) & 0x1) == 1;
@@ -1000,7 +1000,7 @@
     if (!globals.fs.directory(wrapperDir).existsSync()) {
       return false;
     }
-    for (String scriptName in _gradleScripts) {
+    for (final String scriptName in _gradleScripts) {
       final File scriptFile = globals.fs.file(globals.fs.path.join(wrapperDir.path, scriptName));
       if (!scriptFile.existsSync()) {
         return false;
@@ -1189,7 +1189,7 @@
     if (executables == null) {
       return true;
     }
-    for (String executable in executables) {
+    for (final String executable in executables) {
       if (!location.childFile(executable).existsSync()) {
         return false;
       }
diff --git a/packages/flutter_tools/lib/src/codegen.dart b/packages/flutter_tools/lib/src/codegen.dart
index 75e1072..6be4fed 100644
--- a/packages/flutter_tools/lib/src/codegen.dart
+++ b/packages/flutter_tools/lib/src/codegen.dart
@@ -118,7 +118,7 @@
     codeGenerator.updatePackages(flutterProject);
     final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
     codegenDaemon.startBuild();
-    await for (CodegenStatus codegenStatus in codegenDaemon.buildResults) {
+    await for (final CodegenStatus codegenStatus in codegenDaemon.buildResults) {
       if (codegenStatus == CodegenStatus.Failed) {
         globals.printError('Code generation failed, build may have compile errors.');
         break;
diff --git a/packages/flutter_tools/lib/src/commands/analyze_base.dart b/packages/flutter_tools/lib/src/commands/analyze_base.dart
index 568e117..63fb3dc 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_base.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_base.dart
@@ -86,8 +86,8 @@
   bool get hasConflict => values.length > 1;
   bool get hasConflictAffectingFlutterRepo {
     assert(globals.fs.path.isAbsolute(Cache.flutterRoot));
-    for (List<String> targetSources in values.values) {
-      for (String source in targetSources) {
+    for (final List<String> targetSources in values.values) {
+      for (final String source in targetSources) {
         assert(globals.fs.path.isAbsolute(source));
         if (globals.fs.path.isWithin(Cache.flutterRoot, source)) {
           return true;
@@ -100,11 +100,11 @@
     assert(hasConflict);
     final List<String> targets = values.keys.toList();
     targets.sort((String a, String b) => values[b].length.compareTo(values[a].length));
-    for (String target in targets) {
+    for (final String target in targets) {
       final int count = values[target].length;
       result.writeln('  $count ${count == 1 ? 'source wants' : 'sources want'} "$target":');
       bool canonical = false;
-      for (String source in values[target]) {
+      for (final String source in values[target]) {
         result.writeln('    $source');
         if (source == canonicalSource) {
           canonical = true;
@@ -140,7 +140,7 @@
         .readAsStringSync()
         .split('\n')
         .where((String line) => !line.startsWith(RegExp(r'^ *#')));
-      for (String line in lines) {
+      for (final String line in lines) {
         final int colon = line.indexOf(':');
         if (colon > 0) {
           final String packageName = line.substring(0, colon);
@@ -165,7 +165,7 @@
   }
 
   void checkForConflictingDependencies(Iterable<Directory> pubSpecDirectories, PackageDependencyTracker dependencies) {
-    for (Directory directory in pubSpecDirectories) {
+    for (final Directory directory in pubSpecDirectories) {
       final String pubSpecYamlPath = globals.fs.path.join(directory.path, 'pubspec.yaml');
       final File pubSpecYamlFile = globals.fs.file(pubSpecYamlPath);
       if (pubSpecYamlFile.existsSync()) {
@@ -219,7 +219,7 @@
   String generateConflictReport() {
     assert(hasConflicts);
     final StringBuffer result = StringBuffer();
-    for (String package in packages.keys.where((String package) => packages[package].hasConflict)) {
+    for (final String package in packages.keys.where((String package) => packages[package].hasConflict)) {
       result.writeln('Package "$package" has conflicts:');
       packages[package].describeConflict(result);
     }
@@ -228,7 +228,7 @@
 
   Map<String, String> asPackageMap() {
     final Map<String, String> result = <String, String>{};
-    for (String package in packages.keys) {
+    for (final String package in packages.keys) {
       result[package] = packages[package].target;
     }
     return result;
diff --git a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
index 2e9802c..c6271d5 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_continuously.dart
@@ -43,7 +43,7 @@
       analysisTarget = 'Flutter repository';
 
       globals.printTrace('Analyzing Flutter repository:');
-      for (String projectPath in repoRoots) {
+      for (final String projectPath in repoRoots) {
         globals.printTrace('  ${globals.fs.path.relative(projectPath)}');
       }
     } else {
@@ -91,7 +91,7 @@
 
       // Remove errors for deleted files, sort, and print errors.
       final List<AnalysisError> errors = <AnalysisError>[];
-      for (String path in analysisErrors.keys.toList()) {
+      for (final String path in analysisErrors.keys.toList()) {
         if (globals.fs.isFileSync(path)) {
           errors.addAll(analysisErrors[path]);
         } else {
@@ -112,7 +112,7 @@
 
       errors.sort();
 
-      for (AnalysisError error in errors) {
+      for (final AnalysisError error in errors) {
         globals.printStatus(error.toString());
         if (error.code != null) {
           globals.printTrace('error code: ${error.code}');
diff --git a/packages/flutter_tools/lib/src/commands/analyze_once.dart b/packages/flutter_tools/lib/src/commands/analyze_once.dart
index aaa44df..db2b724 100644
--- a/packages/flutter_tools/lib/src/commands/analyze_once.dart
+++ b/packages/flutter_tools/lib/src/commands/analyze_once.dart
@@ -41,7 +41,7 @@
     final Set<String> directories = Set<String>.from(argResults.rest
         .map<String>((String path) => globals.fs.path.canonicalize(path)));
     if (directories.isNotEmpty) {
-      for (String directory in directories) {
+      for (final String directory in directories) {
         final FileSystemEntityType type = globals.fs.typeSync(directory);
 
         if (type == FileSystemEntityType.notFound) {
@@ -138,7 +138,7 @@
       globals.printStatus('');
     }
     errors.sort();
-    for (AnalysisError error in errors) {
+    for (final AnalysisError error in errors) {
       globals.printStatus(error.toString(), hangingIndent: 7);
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart
index 583412b..75fc58d 100644
--- a/packages/flutter_tools/lib/src/commands/assemble.dart
+++ b/packages/flutter_tools/lib/src/commands/assemble.dart
@@ -115,11 +115,11 @@
     }
     final String name = argResults.rest.first;
     final Map<String, Target> targetMap = <String, Target>{
-      for (Target target in _kDefaultTargets)
+      for (final Target target in _kDefaultTargets)
         target.name: target
     };
     final List<Target> results = <Target>[
-      for (String targetName in argResults.rest)
+      for (final String targetName in argResults.rest)
         if (targetMap.containsKey(targetName))
           targetMap[targetName]
     ];
@@ -153,7 +153,7 @@
 
   Map<String, String> _parseDefines(List<String> values) {
     final Map<String, String> results = <String, String>{};
-    for (String chunk in values) {
+    for (final String chunk in values) {
       final int indexEquals = chunk.indexOf('=');
       if (indexEquals == -1) {
         throwToolExit('Improperly formatted define flag: $chunk');
@@ -179,7 +179,7 @@
         : null,
     ));
     if (!result.success) {
-      for (ExceptionMeasurement measurement in result.exceptions.values) {
+      for (final ExceptionMeasurement measurement in result.exceptions.values) {
         globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
@@ -209,7 +209,7 @@
   final File file = globals.fs.file(path);
   final StringBuffer buffer = StringBuffer();
   // These files are already sorted.
-  for (File file in files) {
+  for (final File file in files) {
     buffer.writeln(file.path);
   }
   final String newContents = buffer.toString();
diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart
index 3ce4a89..421b425 100644
--- a/packages/flutter_tools/lib/src/commands/attach.dart
+++ b/packages/flutter_tools/lib/src/commands/attach.dart
@@ -226,7 +226,7 @@
         } catch (_) {
           isolateDiscoveryProtocol?.dispose();
           final List<ForwardedPort> ports = device.portForwarder.forwardedPorts.toList();
-          for (ForwardedPort port in ports) {
+          for (final ForwardedPort port in ports) {
             await device.portForwarder.unforward(port);
           }
           rethrow;
@@ -329,7 +329,7 @@
       }
     } finally {
       final List<ForwardedPort> ports = device.portForwarder.forwardedPorts.toList();
-      for (ForwardedPort port in ports) {
+      for (final ForwardedPort port in ports) {
         await device.portForwarder.unforward(port);
       }
     }
diff --git a/packages/flutter_tools/lib/src/commands/build_aar.dart b/packages/flutter_tools/lib/src/commands/build_aar.dart
index 84a83d8..7b798c6 100644
--- a/packages/flutter_tools/lib/src/commands/build_aar.dart
+++ b/packages/flutter_tools/lib/src/commands/build_aar.dart
@@ -101,7 +101,7 @@
       ? stringArg('build-number')
       : '1.0';
 
-    for (String buildMode in const <String>['debug', 'profile', 'release']) {
+    for (final String buildMode in const <String>['debug', 'profile', 'release']) {
       if (boolArg(buildMode)) {
         androidBuildInfo.add(AndroidBuildInfo(
           BuildInfo(BuildMode.fromName(buildMode), stringArg('flavor')),
diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
index bd48a12..3ac3b48 100644
--- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
+++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart
@@ -158,7 +158,7 @@
     bundleBuilder ??= BundleBuilder();
     cache ??= globals.cache;
 
-    for (BuildMode mode in buildModes) {
+    for (final BuildMode mode in buildModes) {
       globals.printStatus('Building framework for $iosProject in ${getNameForBuildMode(mode)} mode...');
       final String xcodeBuildConfiguration = toTitleCase(getNameForBuildMode(mode));
       final Directory modeDirectory = outputDirectory.childDirectory(xcodeBuildConfiguration);
@@ -470,8 +470,8 @@
       final Directory iPhoneBuildConfiguration = iPhoneBuildOutput.childDirectory('$xcodeBuildConfiguration-iphoneos');
       final Directory simulatorBuildConfiguration = simulatorBuildOutput.childDirectory('$xcodeBuildConfiguration-iphonesimulator');
 
-      for (Directory builtProduct in iPhoneBuildConfiguration.listSync(followLinks: false).whereType<Directory>()) {
-        for (FileSystemEntity podProduct in builtProduct.listSync(followLinks: false)) {
+      for (final Directory builtProduct in iPhoneBuildConfiguration.listSync(followLinks: false).whereType<Directory>()) {
+        for (final FileSystemEntity podProduct in builtProduct.listSync(followLinks: false)) {
           final String podFrameworkName = podProduct.basename;
           if (globals.fs.path.extension(podFrameworkName) == '.framework') {
             final String binaryName = globals.fs.path.basenameWithoutExtension(podFrameworkName);
diff --git a/packages/flutter_tools/lib/src/commands/clean.dart b/packages/flutter_tools/lib/src/commands/clean.dart
index 5d7bc07..db78584 100644
--- a/packages/flutter_tools/lib/src/commands/clean.dart
+++ b/packages/flutter_tools/lib/src/commands/clean.dart
@@ -73,7 +73,7 @@
     try {
       final Directory xcodeWorkspace = xcodeProject.xcodeWorkspace;
       final XcodeProjectInfo projectInfo = await xcodeProjectInterpreter.getInfo(xcodeWorkspace.parent.path);
-      for (String scheme in projectInfo.schemes) {
+      for (final String scheme in projectInfo.schemes) {
         xcodeProjectInterpreter.cleanWorkspace(xcodeWorkspace.path, scheme);
       }
     } catch (error) {
diff --git a/packages/flutter_tools/lib/src/commands/config.dart b/packages/flutter_tools/lib/src/commands/config.dart
index d1626ac..c4ab2c8 100644
--- a/packages/flutter_tools/lib/src/commands/config.dart
+++ b/packages/flutter_tools/lib/src/commands/config.dart
@@ -30,7 +30,7 @@
       negatable: false,
       hide: !verboseHelp,
       help: 'Print config values as json.');
-    for (Feature feature in allFeatures) {
+    for (final Feature feature in allFeatures) {
       if (feature.configSetting == null) {
         continue;
       }
@@ -69,7 +69,7 @@
     // are available.
     final Map<String, Feature> featuresByName = <String, Feature>{};
     final String channel = FlutterVersion.instance.channel;
-    for (Feature feature in allFeatures) {
+    for (final Feature feature in allFeatures) {
       if (feature.configSetting != null) {
         featuresByName[feature.configSetting] = feature;
       }
@@ -105,7 +105,7 @@
     }
 
     if (boolArg('clear-features')) {
-      for (Feature feature in allFeatures) {
+      for (final Feature feature in allFeatures) {
         if (feature.configSetting != null) {
           globals.config.removeValue(feature.configSetting);
         }
@@ -140,7 +140,7 @@
       _updateConfig('build-dir', buildDir);
     }
 
-    for (Feature feature in allFeatures) {
+    for (final Feature feature in allFeatures) {
       if (feature.configSetting == null) {
         continue;
       }
@@ -163,7 +163,7 @@
   Future<void> handleMachine() async {
     // Get all the current values.
     final Map<String, dynamic> results = <String, dynamic>{};
-    for (String key in globals.config.keys) {
+    for (final String key in globals.config.keys) {
       results[key] = globals.config.getValue(key);
     }
 
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index 823da6a..3de6c2b 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -44,7 +44,7 @@
 
 _ProjectType _stringToProjectType(String value) {
   _ProjectType result;
-  for (_ProjectType type in _ProjectType.values) {
+  for (final _ProjectType type in _ProjectType.values) {
     if (value == getEnumName(type)) {
       result = type;
       break;
@@ -306,7 +306,7 @@
 
     if (argResults.rest.length > 1) {
       String message = 'Multiple output directories specified.';
-      for (String arg in argResults.rest) {
+      for (final String arg in argResults.rest) {
         if (arg.startsWith('-')) {
           message += '\nTry moving $arg to be immediately following $name';
           break;
diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart
index 0c30d60..1b7cf43 100644
--- a/packages/flutter_tools/lib/src/commands/daemon.dart
+++ b/packages/flutter_tools/lib/src/commands/daemon.dart
@@ -204,7 +204,7 @@
 
   void shutdown({ dynamic error }) {
     _commandSubscription?.cancel();
-    for (Domain domain in _domainMap.values) {
+    for (final Domain domain in _domainMap.values) {
       domain.dispose();
     }
     if (!_onExitCompleter.isCompleted) {
@@ -791,15 +791,15 @@
   /// of properties (id, name, platform, ...).
   Future<List<Map<String, dynamic>>> getDevices([ Map<String, dynamic> args ]) async {
     return <Map<String, dynamic>>[
-      for (PollingDeviceDiscovery discoverer in _discoverers)
-        for (Device device in await discoverer.devices)
+      for (final PollingDeviceDiscovery discoverer in _discoverers)
+        for (final Device device in await discoverer.devices)
           await _deviceToMap(device),
     ];
   }
 
   /// Enable device events.
   Future<void> enable(Map<String, dynamic> args) {
-    for (PollingDeviceDiscovery discoverer in _discoverers) {
+    for (final PollingDeviceDiscovery discoverer in _discoverers) {
       discoverer.startPolling();
     }
     return Future<void>.value();
@@ -807,7 +807,7 @@
 
   /// Disable device events.
   Future<void> disable(Map<String, dynamic> args) {
-    for (PollingDeviceDiscovery discoverer in _discoverers) {
+    for (final PollingDeviceDiscovery discoverer in _discoverers) {
       discoverer.stopPolling();
     }
     return Future<void>.value();
@@ -845,14 +845,14 @@
 
   @override
   void dispose() {
-    for (PollingDeviceDiscovery discoverer in _discoverers) {
+    for (final PollingDeviceDiscovery discoverer in _discoverers) {
       discoverer.dispose();
     }
   }
 
   /// Return the device matching the deviceId field in the args.
   Future<Device> _getDevice(String deviceId) async {
-    for (PollingDeviceDiscovery discoverer in _discoverers) {
+    for (final PollingDeviceDiscovery discoverer in _discoverers) {
       final Device device = (await discoverer.devices).firstWhere((Device device) => device.id == deviceId, orElse: () => null);
       if (device != null) {
         return device;
diff --git a/packages/flutter_tools/lib/src/commands/devices.dart b/packages/flutter_tools/lib/src/commands/devices.dart
index dbae667..5b478e9 100644
--- a/packages/flutter_tools/lib/src/commands/devices.dart
+++ b/packages/flutter_tools/lib/src/commands/devices.dart
@@ -38,7 +38,7 @@
       final List<String> diagnostics = await deviceManager.getDeviceDiagnostics();
       if (diagnostics.isNotEmpty) {
         globals.printStatus('');
-        for (String diagnostic in diagnostics) {
+        for (final String diagnostic in diagnostics) {
           globals.printStatus('• $diagnostic', hangingIndent: 2);
         }
       }
diff --git a/packages/flutter_tools/lib/src/commands/generate.dart b/packages/flutter_tools/lib/src/commands/generate.dart
index 7b23bae..6d58bea 100644
--- a/packages/flutter_tools/lib/src/commands/generate.dart
+++ b/packages/flutter_tools/lib/src/commands/generate.dart
@@ -26,7 +26,7 @@
     final FlutterProject flutterProject = FlutterProject.current();
     final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
     codegenDaemon.startBuild();
-    await for (CodegenStatus codegenStatus in codegenDaemon.buildResults) {
+    await for (final CodegenStatus codegenStatus in codegenDaemon.buildResults) {
       if (codegenStatus == CodegenStatus.Failed) {
         globals.printError('Code generation failed.');
         break;
@@ -44,7 +44,7 @@
       return null;
     }
     final Directory errorCache = errorCacheParent.childDirectory('error_cache');
-    for (File errorFile in errorCache.listSync(recursive: true).whereType<File>()) {
+    for (final File errorFile in errorCache.listSync(recursive: true).whereType<File>()) {
       try {
         final List<Object> errorData = json.decode(errorFile.readAsStringSync()) as List<Object>;
         final List<Object> stackData = errorData[1] as List<Object>;
diff --git a/packages/flutter_tools/lib/src/commands/ide_config.dart b/packages/flutter_tools/lib/src/commands/ide_config.dart
index fd1c6fc..f42899a 100644
--- a/packages/flutter_tools/lib/src/commands/ide_config.dart
+++ b/packages/flutter_tools/lib/src/commands/ide_config.dart
@@ -126,7 +126,7 @@
 
     final Set<String> manifest = <String>{};
     final Iterable<File> flutterFiles = _flutterRoot.listSync(recursive: true).whereType<File>();
-    for (File srcFile in flutterFiles) {
+    for (final File srcFile in flutterFiles) {
       final String relativePath = globals.fs.path.relative(srcFile.path, from: _flutterRoot.absolute.path);
 
       // Skip template files in both the ide_templates and templates
@@ -186,7 +186,7 @@
     // Look for any files under the template dir that don't exist in the manifest and remove
     // them.
     final Iterable<File> templateFiles = _templateDirectory.listSync(recursive: true).whereType<File>();
-    for (File templateFile in templateFiles) {
+    for (final File templateFile in templateFiles) {
       final String relativePath = globals.fs.path.relative(
         templateFile.absolute.path,
         from: _templateDirectory.absolute.path,
diff --git a/packages/flutter_tools/lib/src/commands/precache.dart b/packages/flutter_tools/lib/src/commands/precache.dart
index d9a6dd2..10b0316 100644
--- a/packages/flutter_tools/lib/src/commands/precache.dart
+++ b/packages/flutter_tools/lib/src/commands/precache.dart
@@ -66,7 +66,7 @@
       globals.cache.useUnsignedMacBinaries = true;
     }
     final Set<DevelopmentArtifact> requiredArtifacts = <DevelopmentArtifact>{};
-    for (DevelopmentArtifact artifact in DevelopmentArtifact.values) {
+    for (final DevelopmentArtifact artifact in DevelopmentArtifact.values) {
       // Don't include unstable artifacts on stable branches.
       if (!FlutterVersion.instance.isMaster && artifact.unstable) {
         continue;
diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart
index 0fe5581..e428579 100644
--- a/packages/flutter_tools/lib/src/commands/run.dart
+++ b/packages/flutter_tools/lib/src/commands/run.dart
@@ -245,7 +245,7 @@
       deviceType = 'multiple';
       deviceOsVersion = 'multiple';
       isEmulator = false;
-      for (Device device in devices) {
+      for (final Device device in devices) {
         final TargetPlatform platform = await device.targetPlatform;
         anyAndroidDevices = anyAndroidDevices || (platform == TargetPlatform.android);
         anyIOSDevices = anyIOSDevices || (platform == TargetPlatform.ios);
@@ -426,7 +426,7 @@
                            'channel.', null);
     }
 
-    for (Device device in devices) {
+    for (final Device device in devices) {
       if (!device.supportsFastStart && boolArg('fast-start')) {
         globals.printStatus(
           'Using --fast-start option with device ${device.name}, but this device '
@@ -456,7 +456,7 @@
     }
 
     if (hotMode) {
-      for (Device device in devices) {
+      for (final Device device in devices) {
         if (!device.supportsHotReload) {
           throwToolExit('Hot reload is not supported by ${device.name}. Run with --no-hot.');
         }
@@ -470,7 +470,7 @@
     }
     final FlutterProject flutterProject = FlutterProject.current();
     final List<FlutterDevice> flutterDevices = <FlutterDevice>[
-      for (Device device in devices)
+      for (final Device device in devices)
         await FlutterDevice.create(
           device,
           flutterProject: flutterProject,
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index 21e2e0f..efdaecc 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -222,7 +222,7 @@
     if (flutterProject.hasBuilders) {
       final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
       codegenDaemon.startBuild();
-      await for (CodegenStatus status in codegenDaemon.buildResults) {
+      await for (final CodegenStatus status in codegenDaemon.buildResults) {
         if (status == CodegenStatus.Succeeded) {
           break;
         }
@@ -296,7 +296,7 @@
       return true;
     }
 
-    for (DevFSFileContent entry in entries.values.whereType<DevFSFileContent>()) {
+    for (final DevFSFileContent entry in entries.values.whereType<DevFSFileContent>()) {
       // Calling isModified to access file stats first in order for isModifiedAfter
       // to work.
       if (entry.isModified && entry.isModifiedAfter(lastModified)) {
diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart
index 169e276..b892a4f 100644
--- a/packages/flutter_tools/lib/src/commands/update_packages.dart
+++ b/packages/flutter_tools/lib/src/commands/update_packages.dart
@@ -134,7 +134,7 @@
     if (isVerifyOnly) {
       bool needsUpdate = false;
       globals.printStatus('Verifying pubspecs...');
-      for (Directory directory in packages) {
+      for (final Directory directory in packages) {
         PubspecYaml pubspec;
         try {
           pubspec = PubspecYaml(directory);
@@ -153,7 +153,7 @@
         }
         // all dependencies in the pubspec sorted lexically.
         final Map<String, String> checksumDependencies = <String, String>{};
-        for (PubspecLine data in pubspec.inputData) {
+        for (final PubspecLine data in pubspec.inputData) {
           if (data is PubspecDependency && data.kind == DependencyKind.normal) {
             checksumDependencies[data.name] = data.version;
           }
@@ -194,7 +194,7 @@
       final List<PubspecYaml> pubspecs = <PubspecYaml>[];
       final Map<String, PubspecDependency> dependencies = <String, PubspecDependency>{};
       final Set<String> specialDependencies = <String>{};
-      for (Directory directory in packages) { // these are all the directories with pubspec.yamls we care about
+      for (final Directory directory in packages) { // these are all the directories with pubspec.yamls we care about
         globals.printTrace('Reading pubspec.yaml from: ${directory.path}');
         PubspecYaml pubspec;
         try {
@@ -203,7 +203,7 @@
           throwToolExit(message);
         }
         pubspecs.add(pubspec); // remember it for later
-        for (PubspecDependency dependency in pubspec.allDependencies) { // this is all the explicit dependencies
+        for (final PubspecDependency dependency in pubspec.allDependencies) { // this is all the explicit dependencies
           if (dependencies.containsKey(dependency.name)) {
             // If we've seen the dependency before, make sure that we are
             // importing it the same way. There's several ways to import a
@@ -272,13 +272,13 @@
       // The transitive dependency tree for the fake package does not contain
       // dependencies between Flutter SDK packages and pub packages. We add them
       // here.
-      for (PubspecYaml pubspec in pubspecs) {
+      for (final PubspecYaml pubspec in pubspecs) {
         final String package = pubspec.name;
         specialDependencies.add(package);
         tree._versions[package] = pubspec.version;
         assert(!tree._dependencyTree.containsKey(package));
         tree._dependencyTree[package] = <String>{};
-        for (PubspecDependency dependency in pubspec.dependencies) {
+        for (final PubspecDependency dependency in pubspec.dependencies) {
           if (dependency.kind == DependencyKind.normal) {
             tree._dependencyTree[package].add(dependency.name);
           }
@@ -305,7 +305,7 @@
       // to specific versions because they are explicitly pinned by their
       // constraints. Here we list the names we earlier established we didn't
       // need to pin because they come from the Dart or Flutter SDKs.
-      for (PubspecYaml pubspec in pubspecs) {
+      for (final PubspecYaml pubspec in pubspecs) {
         pubspec.apply(tree, specialDependencies);
       }
 
@@ -318,7 +318,7 @@
     final Stopwatch timer = Stopwatch()..start();
     int count = 0;
 
-    for (Directory dir in packages) {
+    for (final Directory dir in packages) {
       await pub.get(context: PubContext.updatePackages, directory: dir.path, checkLastModified: false);
       count += 1;
     }
@@ -356,7 +356,7 @@
       if (link.from != null) {
         visited.add(link.from.to);
       }
-      for (String dependency in tree._dependencyTree[link.to]) {
+      for (final String dependency in tree._dependencyTree[link.to]) {
         if (!visited.contains(dependency)) {
           traversalQueue.addFirst(_DependencyLink(from: link, to: dependency));
         }
@@ -483,7 +483,7 @@
     // the dependency. So we track what is the "current" (or "last") dependency
     // that we are dealing with using this variable.
     PubspecDependency lastDependency;
-    for (String line in lines) {
+    for (final String line in lines) {
       if (lastDependency == null) {
         // First we look to see if we're transitioning to a new top-level section.
         // The PubspecHeader.parse static method can recognize those headers.
@@ -614,7 +614,7 @@
     // overridden by subsequent entries in the same file and any that have the
     // magic comment flagging them as auto-generated transitive dependencies
     // that we added in a previous run.
-    for (PubspecLine data in inputData) {
+    for (final PubspecLine data in inputData) {
       if (data is PubspecDependency && data.kind != DependencyKind.overridden && !data.isTransitive && !data.isDevDependency) {
         yield data;
       }
@@ -623,7 +623,7 @@
 
   /// This returns all regular dependencies and all dev dependencies.
   Iterable<PubspecDependency> get allDependencies sync* {
-    for (PubspecLine data in inputData) {
+    for (final PubspecLine data in inputData) {
       if (data is PubspecDependency && data.kind != DependencyKind.overridden && !data.isTransitive) {
         yield data;
       }
@@ -652,7 +652,7 @@
     // blank lines, and trailing blank lines, and ensuring the file ends with a
     // newline. This cleanup lets us be a little more aggressive while building
     // the output.
-    for (PubspecLine data in inputData) {
+    for (final PubspecLine data in inputData) {
       if (data is PubspecHeader) {
         // This line was a header of some sort.
         //
@@ -754,10 +754,10 @@
     // Create a new set to hold the list of packages we've already processed, so
     // that we don't redundantly process them multiple times.
     final Set<String> done = <String>{};
-    for (String package in directDependencies) {
+    for (final String package in directDependencies) {
       transitiveDependencies.addAll(versions.getTransitiveDependenciesFor(package, seen: done, exclude: implied));
     }
-    for (String package in devDependencies) {
+    for (final String package in devDependencies) {
       transitiveDevDependencies.addAll(versions.getTransitiveDependenciesFor(package, seen: done, exclude: implied));
     }
 
@@ -770,10 +770,10 @@
     }
 
     // Add a line for each transitive dependency and transitive dev dependency using our magic string to recognize them later.
-    for (String package in transitiveDependenciesAsList) {
+    for (final String package in transitiveDependenciesAsList) {
       transitiveDependencyOutput.add(computeTransitiveDependencyLineFor(package));
     }
-    for (String package in transitiveDevDependenciesAsList) {
+    for (final String package in transitiveDevDependenciesAsList) {
       transitiveDevDependencyOutput.add(computeTransitiveDependencyLineFor(package));
     }
 
@@ -1148,10 +1148,10 @@
   if (_kManuallyPinnedDependencies.isNotEmpty) {
     globals.printStatus('WARNING: the following packages use hard-coded version constraints:');
     final Set<String> allTransitive = <String>{
-      for (PubspecDependency dependency in dependencies)
+      for (final PubspecDependency dependency in dependencies)
         dependency.name,
     };
-    for (String package in _kManuallyPinnedDependencies.keys) {
+    for (final String package in _kManuallyPinnedDependencies.keys) {
       // Don't add pinned dependency if it is not in the set of all transitive dependencies.
       if (!allTransitive.contains(package)) {
         globals.printStatus('Skipping $package because it was not transitive');
@@ -1162,7 +1162,7 @@
       globals.printStatus('  - $package: $version');
     }
   }
-  for (PubspecDependency dependency in dependencies) {
+  for (final PubspecDependency dependency in dependencies) {
     if (!dependency.pointsToSdk) {
       dependency.describeForFakePubspec(result, overrides);
     }
@@ -1256,7 +1256,7 @@
       // because they were omitted from pubspec.yaml used for 'pub upgrade' run.
       return;
     }
-    for (String dependency in _dependencyTree[package]) {
+    for (final String dependency in _dependencyTree[package]) {
       if (!seen.contains(dependency)) {
         if (!exclude.contains(dependency)) {
           yield dependency;
@@ -1279,7 +1279,7 @@
   int lowerCheck = 0;
   int upperCheck = 0;
   final List<String> sortedNames = names.toList()..sort();
-  for (String name in sortedNames) {
+  for (final String name in sortedNames) {
     final String version = getVersion(name);
     assert(version != '');
     if (version == null) {
@@ -1287,7 +1287,7 @@
     }
     final String value = '$name: $version';
     // Each code unit is 16 bits.
-    for (int codeUnit in value.codeUnits) {
+    for (final int codeUnit in value.codeUnits) {
       final int upper = codeUnit >> 8;
       final int lower = codeUnit & 0xFF;
       lowerCheck = (lowerCheck + upper) % 255;
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 30a03bb..af7ce54 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -198,7 +198,7 @@
   PackageUriMapper(String scriptPath, String packagesPath, String fileSystemScheme, List<String> fileSystemRoots) {
     final Map<String, Uri> packageMap = PackageMap(globals.fs.path.absolute(packagesPath)).map;
     final String scriptUri = Uri.file(scriptPath, windows: globals.platform.isWindows).toString();
-    for (String packageName in packageMap.keys) {
+    for (final String packageName in packageMap.keys) {
       final String prefix = packageMap[packageName].toString();
       // Only perform a multi-root mapping if there are multiple roots.
       if (fileSystemScheme != null
@@ -227,7 +227,7 @@
       return null;
     }
     final String scriptUri = Uri.file(scriptPath, windows: globals.platform.isWindows).toString();
-    for (String uriPrefix in _uriPrefixes) {
+    for (final String uriPrefix in _uriPrefixes) {
       if (scriptUri.startsWith(uriPrefix)) {
         return Uri.parse('package:$_packageName/${scriptUri.substring(uriPrefix.length)}');
       }
@@ -314,7 +314,7 @@
       sdkRoot,
       '--target=$targetModel',
       '-Ddart.developer.causal_async_stacks=$causalAsyncStacks',
-      for (Object dartDefine in dartDefines)
+      for (final Object dartDefine in dartDefines)
         '-D$dartDefine',
       ..._buildModeOptions(buildMode),
       if (trackWidgetCreation) '--track-widget-creation',
@@ -336,7 +336,7 @@
         depFilePath,
       ],
       if (fileSystemRoots != null)
-        for (String root in fileSystemRoots) ...<String>[
+        for (final String root in fileSystemRoots) ...<String>[
           '--filesystem-root',
           root,
         ],
@@ -608,7 +608,7 @@
         : '';
     _server.stdin.writeln('recompile $mainUri$inputKey');
     globals.printTrace('<- recompile $mainUri$inputKey');
-    for (Uri fileUri in request.invalidatedFiles) {
+    for (final Uri fileUri in request.invalidatedFiles) {
       _server.stdin.writeln(_mapFileUri(fileUri.toString(), packageUriMapper));
       globals.printTrace('${_mapFileUri(fileUri.toString(), packageUriMapper)}');
     }
@@ -651,7 +651,7 @@
       '--incremental',
       '--target=$targetModel',
       '-Ddart.developer.causal_async_stacks=$causalAsyncStacks',
-      for (Object dartDefine in dartDefines)
+      for (final Object dartDefine in dartDefines)
         '-D$dartDefine',
       if (outputPath != null) ...<String>[
         '--output-dill',
@@ -667,7 +667,7 @@
       ..._buildModeOptions(buildMode),
       if (trackWidgetCreation) '--track-widget-creation',
       if (fileSystemRoots != null)
-        for (String root in fileSystemRoots) ...<String>[
+        for (final String root in fileSystemRoots) ...<String>[
           '--filesystem-root',
           root,
         ],
@@ -824,7 +824,7 @@
     }
 
     if (fileSystemRoots != null) {
-      for (String root in fileSystemRoots) {
+      for (final String root in fileSystemRoots) {
         if (filename.startsWith(root)) {
           return Uri(
               scheme: fileSystemScheme, path: filename.substring(root.length))
diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart
index 375fdd3..a2a5c4e 100644
--- a/packages/flutter_tools/lib/src/dart/pub.dart
+++ b/packages/flutter_tools/lib/src/dart/pub.dart
@@ -29,7 +29,7 @@
 // We have server-side tooling that assumes the values are consistent.
 class PubContext {
   PubContext._(this._values) {
-    for (String item in _values) {
+    for (final String item in _values) {
       if (!_validContext.hasMatch(item)) {
         throw ArgumentError.value(
             _values, 'value', 'Must match RegExp ${_validContext.pattern}');
diff --git a/packages/flutter_tools/lib/src/desktop_device.dart b/packages/flutter_tools/lib/src/desktop_device.dart
index 0922824..65a2339 100644
--- a/packages/flutter_tools/lib/src/desktop_device.dart
+++ b/packages/flutter_tools/lib/src/desktop_device.dart
@@ -130,7 +130,7 @@
     bool succeeded = true;
     // Walk a copy of _runningProcesses, since the exit handler removes from the
     // set.
-    for (Process process in Set<Process>.from(_runningProcesses)) {
+    for (final Process process in Set<Process>.from(_runningProcesses)) {
       succeeded &= process.kill();
     }
     return succeeded;
diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart
index d7ac151..9109845 100644
--- a/packages/flutter_tools/lib/src/device.dart
+++ b/packages/flutter_tools/lib/src/device.dart
@@ -118,7 +118,7 @@
     }
 
     // Match on a id or name starting with [deviceId].
-    for (Device device in devices.where(startsWithDeviceId)) {
+    for (final Device device in devices.where(startsWithDeviceId)) {
       yield device;
     }
   }
@@ -136,8 +136,8 @@
 
   /// Return the list of all connected devices.
   Stream<Device> getAllConnectedDevices() async* {
-    for (DeviceDiscovery discoverer in _platformDiscoverers) {
-      for (Device device in await discoverer.devices) {
+    for (final DeviceDiscovery discoverer in _platformDiscoverers) {
+      for (final Device device in await discoverer.devices) {
         yield device;
       }
     }
@@ -151,7 +151,7 @@
   /// Get diagnostics about issues with any connected devices.
   Future<List<String>> getDeviceDiagnostics() async {
     return <String>[
-      for (DeviceDiscovery discoverer in _platformDiscoverers)
+      for (final DeviceDiscovery discoverer in _platformDiscoverers)
         ...await discoverer.getDiagnostics(),
     ];
   }
@@ -178,7 +178,7 @@
     // compilers, and web requires an entirely different resident runner.
     if (hasSpecifiedAllDevices) {
       devices = <Device>[
-        for (Device device in devices)
+        for (final Device device in devices)
           if (await device.targetPlatform != TargetPlatform.fuchsia_arm64 &&
               await device.targetPlatform != TargetPlatform.fuchsia_x64 &&
               await device.targetPlatform != TargetPlatform.web_javascript)
@@ -191,7 +191,7 @@
     // 'android' folder then don't attempt to launch with an Android device.
     if (devices.length > 1 && !hasSpecifiedDeviceId) {
       devices = <Device>[
-        for (Device device in devices)
+        for (final Device device in devices)
           if (isDeviceSupportedForProject(device, flutterProject))
             device,
       ];
@@ -460,7 +460,7 @@
 
     // Extract device information
     final List<List<String>> table = <List<String>>[];
-    for (Device device in devices) {
+    for (final Device device in devices) {
       String supportIndicator = device.isSupported() ? '' : ' (unsupported)';
       final TargetPlatform targetPlatform = await device.targetPlatform;
       if (await device.isLocalEmulator) {
@@ -478,12 +478,12 @@
     // Calculate column widths
     final List<int> indices = List<int>.generate(table[0].length - 1, (int i) => i);
     List<int> widths = indices.map<int>((int i) => 0).toList();
-    for (List<String> row in table) {
+    for (final List<String> row in table) {
       widths = indices.map<int>((int i) => math.max(widths[i], row[i].length)).toList();
     }
 
     // Join columns into lines of text
-    for (List<String> row in table) {
+    for (final List<String> row in table) {
       yield indices.map<String>((int i) => row[i].padRight(widths[i])).join(' • ') + ' • ${row.last}';
     }
   }
diff --git a/packages/flutter_tools/lib/src/doctor.dart b/packages/flutter_tools/lib/src/doctor.dart
index ccaf690..366e2f1 100644
--- a/packages/flutter_tools/lib/src/doctor.dart
+++ b/packages/flutter_tools/lib/src/doctor.dart
@@ -147,7 +147,7 @@
   /// Return a list of [ValidatorTask] objects and starts validation on all
   /// objects in [validators].
   List<ValidatorTask> startValidatorTasks() => <ValidatorTask>[
-    for (DoctorValidator validator in validators)
+    for (final DoctorValidator validator in validators)
       ValidatorTask(
         validator,
         // We use an asyncGuard() here to be absolutely certain that
@@ -178,7 +178,7 @@
     bool missingComponent = false;
     bool sawACrash = false;
 
-    for (DoctorValidator validator in validators) {
+    for (final DoctorValidator validator in validators) {
       final StringBuffer lineBuffer = StringBuffer();
       ValidationResult result;
       try {
@@ -248,7 +248,7 @@
     bool doctorResult = true;
     int issues = 0;
 
-    for (ValidatorTask validatorTask in startValidatorTasks()) {
+    for (final ValidatorTask validatorTask in startValidatorTasks()) {
       final DoctorValidator validator = validatorTask.validator;
       final Status status = Status.withSpinner(
         timeout: timeoutConfiguration.fastOperation,
@@ -291,12 +291,12 @@
             hangingIndent: result.leadingBox.length + 1);
       }
 
-      for (ValidationMessage message in result.messages) {
+      for (final ValidationMessage message in result.messages) {
         if (message.type != ValidationMessageType.information || verbose == true) {
           int hangingIndent = 2;
           int indent = 4;
           final String indicator = showColor ? message.coloredIndicator : message.indicator;
-          for (String line in '$indicator ${message.message}'.split('\n')) {
+          for (final String line in '$indicator ${message.message}'.split('\n')) {
             globals.printStatus(line, hangingIndent: hangingIndent, indent: indent, emphasis: true);
             // Only do hanging indent for the first line.
             hangingIndent = 0;
@@ -402,7 +402,7 @@
   @override
   Future<ValidationResult> validate() async {
     final List<ValidatorTask> tasks = <ValidatorTask>[
-      for (DoctorValidator validator in subValidators)
+      for (final DoctorValidator validator in subValidators)
         ValidatorTask(
           validator,
           asyncGuard<ValidationResult>(() => validator.validate()),
@@ -410,7 +410,7 @@
     ];
 
     final List<ValidationResult> results = <ValidationResult>[];
-    for (ValidatorTask subValidator in tasks) {
+    for (final ValidatorTask subValidator in tasks) {
       _currentSlowWarning = subValidator.validator.slowWarning;
       try {
         results.add(await subValidator.result);
@@ -429,7 +429,7 @@
     final List<ValidationMessage> mergedMessages = <ValidationMessage>[];
     String statusInfo;
 
-    for (ValidationResult result in results) {
+    for (final ValidationResult result in results) {
       statusInfo ??= result.statusInfo;
       switch (result.type) {
         case ValidationType.installed:
@@ -753,7 +753,7 @@
       validators.add(validator);
     }
 
-    for (FileSystemEntity dir in globals.fs.directory(homeDirPath).listSync()) {
+    for (final FileSystemEntity dir in globals.fs.directory(homeDirPath).listSync()) {
       if (dir is Directory) {
         final String name = globals.fs.path.basename(dir.path);
         IntelliJValidator._idToTitle.forEach((String id, String title) {
@@ -808,10 +808,10 @@
               .map<List<FileSystemEntity>>((Directory dir) => dir.existsSync() ? dir.listSync() : <FileSystemEntity>[])
               .expand<FileSystemEntity>((List<FileSystemEntity> mappedDirs) => mappedDirs)
               .whereType<Directory>();
-      for (Directory dir in installDirs) {
+      for (final Directory dir in installDirs) {
         checkForIntelliJ(dir);
         if (!dir.path.endsWith('.app')) {
-          for (FileSystemEntity subdir in dir.listSync()) {
+          for (final FileSystemEntity subdir in dir.listSync()) {
             if (subdir is Directory) {
               checkForIntelliJ(subdir);
             }
diff --git a/packages/flutter_tools/lib/src/emulator.dart b/packages/flutter_tools/lib/src/emulator.dart
index d29f281..3cfcac6 100644
--- a/packages/flutter_tools/lib/src/emulator.dart
+++ b/packages/flutter_tools/lib/src/emulator.dart
@@ -250,7 +250,7 @@
 
     // Extract emulators information
     final List<List<String>> table = <List<String>>[
-      for (Emulator emulator in emulators)
+      for (final Emulator emulator in emulators)
         <String>[
           emulator.id ?? '',
           emulator.name ?? '',
@@ -262,7 +262,7 @@
     // Calculate column widths
     final List<int> indices = List<int>.generate(table[0].length - 1, (int i) => i);
     List<int> widths = indices.map<int>((int i) => 0).toList();
-    for (List<String> row in table) {
+    for (final List<String> row in table) {
       widths = indices.map<int>((int i) => math.max(widths[i], row[i].length)).toList();
     }
 
diff --git a/packages/flutter_tools/lib/src/flutter_manifest.dart b/packages/flutter_tools/lib/src/flutter_manifest.dart
index f3351a3..36c25ef 100644
--- a/packages/flutter_tools/lib/src/flutter_manifest.dart
+++ b/packages/flutter_tools/lib/src/flutter_manifest.dart
@@ -197,7 +197,7 @@
       return const <Uri>[];
     }
     final List<Uri> results = <Uri>[];
-    for (Object asset in assets) {
+    for (final Object asset in assets) {
       if (asset is! String || asset == null || asset == '') {
         globals.printError('Asset manifest contains a null or empty uri.');
         continue;
@@ -225,7 +225,7 @@
     }
 
     final List<Font> fonts = <Font>[];
-    for (Map<String, dynamic> fontFamily in _rawFontsDescriptor) {
+    for (final Map<String, dynamic> fontFamily in _rawFontsDescriptor) {
       final YamlList fontFiles = fontFamily['fonts'] as YamlList;
       final String familyName = fontFamily['family'] as String;
       if (familyName == null) {
@@ -238,7 +238,7 @@
       }
 
       final List<FontAsset> fontAssets = <FontAsset>[];
-      for (Map<dynamic, dynamic> fontFile in fontFiles.cast<Map<dynamic, dynamic>>()) {
+      for (final Map<dynamic, dynamic> fontFile in fontFiles.cast<Map<dynamic, dynamic>>()) {
         final String asset = fontFile['asset'] as String;
         if (asset == null) {
           globals.printError('Warning: Missing asset in fonts for $familyName', emphasis: true);
@@ -431,7 +431,7 @@
       continue;
     }
     final YamlMap fontMap = fontListEntry as YamlMap;
-    for (dynamic key in fontMap.keys.where((dynamic key) => key != 'family' && key != 'fonts')) {
+    for (final dynamic key in fontMap.keys.where((dynamic key) => key != 'family' && key != 'fonts')) {
       errors.add('Unexpected child "$key" found under "fonts".');
     }
     if (fontMap['family'] != null && fontMap['family'] is! String) {
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
index 24f1419..9ccc04c 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_build.dart
@@ -148,7 +148,7 @@
   await destFile.create(recursive: true);
   final IOSink outFile = destFile.openWrite();
 
-  for (String path in assets.entries.keys) {
+  for (final String path in assets.entries.keys) {
     outFile.write('data/$appName/$path=$assetDir/$path\n');
   }
   await outFile.flush();
diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
index 5ae5a89..21e1fbe 100644
--- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart
@@ -164,7 +164,7 @@
 @visibleForTesting
 List<FuchsiaDevice> parseListDevices(String text) {
   final List<FuchsiaDevice> devices = <FuchsiaDevice>[];
-  for (String rawLine in text.trim().split('\n')) {
+  for (final String rawLine in text.trim().split('\n')) {
     final String line = rawLine.trim();
     // ['ip', 'device name']
     final List<String> words = line.split(' ');
@@ -501,7 +501,7 @@
       return null;
     }
     final List<int> ports = <int>[];
-    for (String path in findOutput.split('\n')) {
+    for (final String path in findOutput.split('\n')) {
       if (path == '') {
         continue;
       }
@@ -512,7 +512,7 @@
         return null;
       }
       final String lsOutput = lsResult.stdout;
-      for (String line in lsOutput.split('\n')) {
+      for (final String line in lsOutput.split('\n')) {
         if (line == '') {
           continue;
         }
@@ -557,7 +557,7 @@
   // TODO(jonahwilliams): replacing this with the hub will require an update
   // to the flutter_runner.
   Future<int> findIsolatePort(String isolateName, List<int> ports) async {
-    for (int port in ports) {
+    for (final int port in ports) {
       try {
         // Note: The square-bracket enclosure for using the IPv6 loopback
         // didn't appear to work, but when assigning to the IPv4 loopback device,
@@ -567,7 +567,7 @@
         final VMService vmService = await VMService.connect(uri);
         await vmService.getVM();
         await vmService.refreshViews();
-        for (FlutterView flutterView in vmService.vm.views) {
+        for (final FlutterView flutterView in vmService.vm.views) {
           if (flutterView.uiIsolate == null) {
             continue;
           }
@@ -647,7 +647,7 @@
 
   Future<void> _findIsolate() async {
     final List<int> ports = await _device.servicePorts();
-    for (int port in ports) {
+    for (final int port in ports) {
       VMService service;
       if (_ports.containsKey(port)) {
         service = _ports[port];
@@ -664,7 +664,7 @@
       }
       await service.getVM();
       await service.refreshViews();
-      for (FlutterView flutterView in service.vm.views) {
+      for (final FlutterView flutterView in service.vm.views) {
         if (flutterView.uiIsolate == null) {
           continue;
         }
@@ -753,7 +753,7 @@
 
   @override
   Future<void> dispose() async {
-    for (ForwardedPort port in forwardedPorts) {
+    for (final ForwardedPort port in forwardedPorts) {
       await unforward(port);
     }
   }
diff --git a/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart b/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
index 5357a9f..21ab56f 100644
--- a/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
+++ b/packages/flutter_tools/lib/src/fuchsia/tiles_ctl.dart
@@ -26,7 +26,7 @@
       globals.printTrace('tiles_ctl is not running');
       return -1;
     }
-    for (MapEntry<int, String> entry in runningApps.entries) {
+    for (final MapEntry<int, String> entry in runningApps.entries) {
       if (entry.value.contains('$appName#meta')) {
         return entry.key;
       }
@@ -70,7 +70,7 @@
       return null;
     }
     // Find lines beginning with 'Tile'
-    for (String line in result.stdout.split('\n')) {
+    for (final String line in result.stdout.split('\n')) {
       final List<String> words = line.split(' ');
       if (words.isNotEmpty && words[0] == 'Tile') {
         final int key = int.tryParse(words[2]);
diff --git a/packages/flutter_tools/lib/src/intellij/intellij.dart b/packages/flutter_tools/lib/src/intellij/intellij.dart
index aa2fd20..48a9a50 100644
--- a/packages/flutter_tools/lib/src/intellij/intellij.dart
+++ b/packages/flutter_tools/lib/src/intellij/intellij.dart
@@ -22,7 +22,7 @@
     String title, {
     Version minVersion,
   }) {
-    for (String packageName in packageNames) {
+    for (final String packageName in packageNames) {
       if (!_hasPackage(packageName)) {
         continue;
       }
diff --git a/packages/flutter_tools/lib/src/ios/devices.dart b/packages/flutter_tools/lib/src/ios/devices.dart
index 5b5fd27..c9b4341 100644
--- a/packages/flutter_tools/lib/src/ios/devices.dart
+++ b/packages/flutter_tools/lib/src/ios/devices.dart
@@ -660,7 +660,7 @@
 
   @override
   void dispose() {
-    for (StreamSubscription<ServiceEvent> loggingSubscription in _loggingSubscriptions) {
+    for (final StreamSubscription<ServiceEvent> loggingSubscription in _loggingSubscriptions) {
       loggingSubscription.cancel();
     }
     _idevicesyslogProcess?.kill();
@@ -747,7 +747,7 @@
 
   @override
   Future<void> dispose() async {
-    for (ForwardedPort forwardedPort in _forwardedPorts) {
+    for (final ForwardedPort forwardedPort in _forwardedPorts) {
       forwardedPort.dispose();
     }
   }
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 7974313..a220b42 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -371,7 +371,7 @@
   }
 
   if (autoSigningConfigs != null) {
-    for (MapEntry<String, String> signingConfig in autoSigningConfigs.entries) {
+    for (final MapEntry<String, String> signingConfig in autoSigningConfigs.entries) {
       buildCommands.add('${signingConfig.key}=${signingConfig.value}');
     }
     buildCommands.add('-allowProvisioningUpdates');
@@ -379,7 +379,7 @@
   }
 
   final List<FileSystemEntity> contents = app.project.hostAppRoot.listSync();
-  for (FileSystemEntity entity in contents) {
+  for (final FileSystemEntity entity in contents) {
     if (globals.fs.path.extension(entity.path) == '.xcworkspace') {
       buildCommands.addAll(<String>[
         '-workspace', globals.fs.path.basename(entity.path),
@@ -426,7 +426,7 @@
 
     Future<void> listenToScriptOutputLine() async {
       final List<String> lines = await scriptOutputPipeFile.readAsLines();
-      for (String line in lines) {
+      for (final String line in lines) {
         if (line == 'done' || line == 'all done') {
           buildSubStatus?.stop();
           buildSubStatus = null;
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart
index 748d1dc..72b7aa6 100644
--- a/packages/flutter_tools/lib/src/ios/simulators.dart
+++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -112,10 +112,10 @@
 
     final Map<String, dynamic> devicesSection = await _list(SimControlListSection.devices);
 
-    for (String deviceCategory in devicesSection.keys) {
+    for (final String deviceCategory in devicesSection.keys) {
       final Object devicesData = devicesSection[deviceCategory];
       if (devicesData != null && devicesData is List<dynamic>) {
-        for (Map<String, dynamic> data in devicesData.map<Map<String, dynamic>>(castStringKeyedMap)) {
+        for (final Map<String, dynamic> data in devicesData.map<Map<String, dynamic>>(castStringKeyedMap)) {
           devices.add(SimDevice(deviceCategory, data));
         }
       }
@@ -809,7 +809,7 @@
 
   @override
   Future<void> dispose() async {
-    for (ForwardedPort port in _ports) {
+    for (final ForwardedPort port in _ports) {
       await unforward(port);
     }
   }
diff --git a/packages/flutter_tools/lib/src/ios/xcodeproj.dart b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
index ff966cb..09b50ca 100644
--- a/packages/flutter_tools/lib/src/ios/xcodeproj.dart
+++ b/packages/flutter_tools/lib/src/ios/xcodeproj.dart
@@ -106,7 +106,7 @@
 
   localsBuffer.writeln('#!/bin/sh');
   localsBuffer.writeln('# This is a generated file; do not edit or check into version control.');
-  for (String line in xcodeBuildSettings) {
+  for (final String line in xcodeBuildSettings) {
     localsBuffer.writeln('export "$line"');
   }
 
@@ -372,7 +372,7 @@
 
 Map<String, String> parseXcodeBuildSettings(String showBuildSettingsOutput) {
   final Map<String, String> settings = <String, String>{};
-  for (Match match in showBuildSettingsOutput.split('\n').map<Match>(_settingExpr.firstMatch)) {
+  for (final Match match in showBuildSettingsOutput.split('\n').map<Match>(_settingExpr.firstMatch)) {
     if (match != null) {
       settings[match[1]] = match[2];
     }
@@ -402,7 +402,7 @@
     final List<String> buildConfigurations = <String>[];
     final List<String> schemes = <String>[];
     List<String> collector;
-    for (String line in output.split('\n')) {
+    for (final String line in output.split('\n')) {
       if (line.isEmpty) {
         collector = null;
         continue;
@@ -454,7 +454,7 @@
   /// regard to case.
   bool hasBuildConfiguratinForBuildMode(String buildMode) {
     buildMode = buildMode.toLowerCase();
-    for (String name in buildConfigurations) {
+    for (final String name in buildConfigurations) {
       if (name.toLowerCase() == buildMode) {
         return true;
       }
diff --git a/packages/flutter_tools/lib/src/linux/makefile.dart b/packages/flutter_tools/lib/src/linux/makefile.dart
index 3569082..94331ac 100644
--- a/packages/flutter_tools/lib/src/linux/makefile.dart
+++ b/packages/flutter_tools/lib/src/linux/makefile.dart
@@ -11,7 +11,7 @@
 ///
 /// Returns `null` if it cannot be found.
 String makefileExecutableName(LinuxProject project) {
-  for (String line in project.makeFile.readAsLinesSync()) {
+  for (final String line in project.makeFile.readAsLinesSync()) {
     if (line.startsWith(_kBinaryNameVariable)) {
       return line.split(_kBinaryNameVariable).last.trim();
     }
diff --git a/packages/flutter_tools/lib/src/mdns_discovery.dart b/packages/flutter_tools/lib/src/mdns_discovery.dart
index 033e097..dea4976 100644
--- a/packages/flutter_tools/lib/src/mdns_discovery.dart
+++ b/packages/flutter_tools/lib/src/mdns_discovery.dart
@@ -75,7 +75,7 @@
 
       String domainName;
       if (applicationId != null) {
-        for (String name in uniqueDomainNames) {
+        for (final String name in uniqueDomainNames) {
           if (name.toLowerCase().startsWith(applicationId.toLowerCase())) {
             domainName = name;
             break;
@@ -206,10 +206,10 @@
   }
 
   void _logInterfaces(List<NetworkInterface> interfaces) {
-    for (NetworkInterface interface in interfaces) {
+    for (final NetworkInterface interface in interfaces) {
       if (globals.logger.isVerbose) {
         globals.printTrace('Found interface "${interface.name}":');
-        for (InternetAddress address in interface.addresses) {
+        for (final InternetAddress address in interface.addresses) {
           final String linkLocal = address.isLinkLocal ? 'link local' : '';
           globals.printTrace('\tBound address: "${address.address}" $linkLocal');
         }
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 22f506b..cd7eb43 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -321,10 +321,10 @@
   final StringBuffer flutterPluginsBuffer = StringBuffer('# $info\n');
 
   final Set<String> pluginNames = <String>{};
-  for (Plugin plugin in plugins) {
+  for (final Plugin plugin in plugins) {
     pluginNames.add(plugin.name);
   }
-  for (Plugin plugin in plugins) {
+  for (final Plugin plugin in plugins) {
     flutterPluginsBuffer.write('${plugin.name}=${escapePath(plugin.path)}\n');
     directAppDependencies.add(<String, dynamic>{
       'name': plugin.name,
@@ -439,7 +439,7 @@
 
 List<Map<String, dynamic>> _extractPlatformMaps(List<Plugin> plugins, String type) {
   final List<Map<String, dynamic>> pluginConfigs = <Map<String, dynamic>>[];
-  for (Plugin p in plugins) {
+  for (final Plugin p in plugins) {
     final PluginPlatform platformPlugin = p.platforms[type];
     if (platformPlugin != null) {
       pluginConfigs.add(platformPlugin.toMap());
@@ -484,7 +484,7 @@
       templateContext['needsShim'] = false;
       // If a plugin is using an embedding version older than 2.0 and the app is using 2.0,
       // then add shim for the old plugins.
-      for (Map<String, dynamic> plugin in androidPlugins) {
+      for (final Map<String, dynamic> plugin in androidPlugins) {
         if (plugin['supportsEmbeddingV1'] as bool && !(plugin['supportsEmbeddingV2'] as bool)) {
           templateContext['needsShim'] = true;
           if (project.isModule) {
@@ -504,7 +504,7 @@
       break;
     case AndroidEmbeddingVersion.v1:
     default:
-      for (Map<String, dynamic> plugin in androidPlugins) {
+      for (final Map<String, dynamic> plugin in androidPlugins) {
         if (!(plugin['supportsEmbeddingV1'] as bool) && plugin['supportsEmbeddingV2'] as bool) {
           throwToolExit(
             'The plugin `${plugin['name']}` requires your app to be migrated to '
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index 234a266..6d14011 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -699,7 +699,7 @@
       throwToolExit('Error reading $appManifestFile even though it exists. '
                     'Please ensure that you have read permission to this file and try again.');
     }
-    for (xml.XmlElement metaData in document.findAllElements('meta-data')) {
+    for (final xml.XmlElement metaData in document.findAllElements('meta-data')) {
       final String name = metaData.getAttribute('android:name');
       if (name == 'flutterEmbedding') {
         final String embeddingVersionString = metaData.getAttribute('android:value');
@@ -764,7 +764,7 @@
   if (!file.existsSync()) {
     return null;
   }
-  for (String line in file.readAsLinesSync()) {
+  for (final String line in file.readAsLinesSync()) {
     final Match match = regExp.firstMatch(line);
     if (match != null) {
       return match;
diff --git a/packages/flutter_tools/lib/src/protocol_discovery.dart b/packages/flutter_tools/lib/src/protocol_discovery.dart
index 6133048..a13878e 100644
--- a/packages/flutter_tools/lib/src/protocol_discovery.dart
+++ b/packages/flutter_tools/lib/src/protocol_discovery.dart
@@ -157,7 +157,7 @@
 
   StreamController<T> get _streamController {
     _streamControllerInstance ??= StreamController<T>.broadcast(onListen: () {
-      for (dynamic event in _events) {
+      for (final dynamic event in _events) {
         assert(T is! List);
         if (event is T) {
           _streamControllerInstance.add(event);
diff --git a/packages/flutter_tools/lib/src/proxy_validator.dart b/packages/flutter_tools/lib/src/proxy_validator.dart
index 3a8931e..95896f2 100644
--- a/packages/flutter_tools/lib/src/proxy_validator.dart
+++ b/packages/flutter_tools/lib/src/proxy_validator.dart
@@ -34,7 +34,7 @@
         messages.add(ValidationMessage.hint('NO_PROXY is not set'));
       } else {
         messages.add(ValidationMessage('NO_PROXY is $_noProxy'));
-        for (String host in const <String>['127.0.0.1', 'localhost']) {
+        for (final String host in const <String>['127.0.0.1', 'localhost']) {
           final ValidationMessage msg = _noProxy.contains(host)
               ? ValidationMessage('NO_PROXY contains $host')
               : ValidationMessage.hint('NO_PROXY does not contain $host');
diff --git a/packages/flutter_tools/lib/src/reporting/github_template.dart b/packages/flutter_tools/lib/src/reporting/github_template.dart
index 367232e..ff35e3b 100644
--- a/packages/flutter_tools/lib/src/reporting/github_template.dart
+++ b/packages/flutter_tools/lib/src/reporting/github_template.dart
@@ -99,7 +99,7 @@
         description.writeln('### Plugins');
         // Format is:
         // camera=/path/to/.pub-cache/hosted/pub.dartlang.org/camera-0.5.7+2/
-        for (String plugin in project.flutterPluginsFile.readAsLinesSync()) {
+        for (final String plugin in project.flutterPluginsFile.readAsLinesSync()) {
           final List<String> pluginParts = plugin.split('=');
           if (pluginParts.length != 2) {
             continue;
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 15e4b03..9e46694 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -249,7 +249,7 @@
       return;
     }
     final List<Future<void>> futures = <Future<void>>[];
-    for (FlutterView view in flutterViews) {
+    for (final FlutterView view in flutterViews) {
       if (view != null && view.uiIsolate != null) {
         assert(!view.uiIsolate.pauseEvent.isPauseEvent);
         futures.add(view.uiIsolate.flutterExit());
@@ -283,7 +283,7 @@
     final Uri deviceEntryUri = devFS.baseUri.resolveUri(globals.fs.path.toUri(entryPath));
     final Uri devicePackagesUri = devFS.baseUri.resolve('.packages');
     return <Future<Map<String, dynamic>>>[
-      for (FlutterView view in views)
+      for (final FlutterView view in views)
         view.uiIsolate.reloadSources(
           pause: pause,
           rootLibUri: deviceEntryUri,
@@ -302,68 +302,68 @@
   }
 
   Future<void> debugDumpApp() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterDebugDumpApp();
     }
   }
 
   Future<void> debugDumpRenderTree() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterDebugDumpRenderTree();
     }
   }
 
   Future<void> debugDumpLayerTree() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterDebugDumpLayerTree();
     }
   }
 
   Future<void> debugDumpSemanticsTreeInTraversalOrder() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterDebugDumpSemanticsTreeInTraversalOrder();
     }
   }
 
   Future<void> debugDumpSemanticsTreeInInverseHitTestOrder() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterDebugDumpSemanticsTreeInInverseHitTestOrder();
     }
   }
 
   Future<void> toggleDebugPaintSizeEnabled() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterToggleDebugPaintSizeEnabled();
     }
   }
 
   Future<void> toggleDebugCheckElevationsEnabled() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterToggleDebugCheckElevationsEnabled();
     }
   }
 
   Future<void> debugTogglePerformanceOverlayOverride() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterTogglePerformanceOverlayOverride();
     }
   }
 
   Future<void> toggleWidgetInspector() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterToggleWidgetInspector();
     }
   }
 
   Future<void> toggleProfileWidgetBuilds() async {
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterToggleProfileWidgetBuilds();
     }
   }
 
   Future<String> togglePlatform({ String from }) async {
     final String to = nextPlatform(from, featureFlags);
-    for (FlutterView view in views) {
+    for (final FlutterView view in views) {
       await view.uiIsolate.flutterPlatformOverride(to);
     }
     return to;
@@ -578,7 +578,7 @@
 
 /// Returns `true` if any of the devices is running Android Q.
 Future<bool> hasDeviceRunningAndroidQ(List<FlutterDevice> flutterDevices) async {
-  for (FlutterDevice flutterDevice in flutterDevices) {
+  for (final FlutterDevice flutterDevice in flutterDevices) {
     final String sdkNameAndVersion = await flutterDevice.device.sdkNameAndVersion;
     if (sdkNameAndVersion != null && sdkNameAndVersion.startsWith('Android 10')) {
       return true;
@@ -755,77 +755,77 @@
 
   Future<void> refreshViews() async {
     final List<Future<void>> futures = <Future<void>>[
-      for (FlutterDevice device in flutterDevices) device.refreshViews(),
+      for (final FlutterDevice device in flutterDevices) device.refreshViews(),
     ];
     await Future.wait(futures);
   }
 
   Future<void> debugDumpApp() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugDumpApp();
     }
   }
 
   Future<void> debugDumpRenderTree() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugDumpRenderTree();
     }
   }
 
   Future<void> debugDumpLayerTree() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugDumpLayerTree();
     }
   }
 
   Future<void> debugDumpSemanticsTreeInTraversalOrder() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugDumpSemanticsTreeInTraversalOrder();
     }
   }
 
   Future<void> debugDumpSemanticsTreeInInverseHitTestOrder() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugDumpSemanticsTreeInInverseHitTestOrder();
     }
   }
 
   Future<void> debugToggleDebugPaintSizeEnabled() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.toggleDebugPaintSizeEnabled();
     }
   }
 
   Future<void> debugToggleDebugCheckElevationsEnabled() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.toggleDebugCheckElevationsEnabled();
     }
   }
 
   Future<void> debugTogglePerformanceOverlayOverride() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.debugTogglePerformanceOverlayOverride();
     }
   }
 
   Future<void> debugToggleWidgetInspector() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.toggleWidgetInspector();
     }
   }
 
   Future<void> debugToggleProfileWidgetBuilds() async {
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.toggleProfileWidgetBuilds();
     }
   }
@@ -845,7 +845,7 @@
       if (supportsServiceProtocol && isRunningDebug) {
         await device.refreshViews();
         try {
-          for (FlutterView view in device.views) {
+          for (final FlutterView view in device.views) {
             await view.uiIsolate.flutterDebugAllowBanner(false);
           }
         } catch (error) {
@@ -859,7 +859,7 @@
       } finally {
         if (supportsServiceProtocol && isRunningDebug) {
           try {
-            for (FlutterView view in device.views) {
+            for (final FlutterView view in device.views) {
               await view.uiIsolate.flutterDebugAllowBanner(true);
             }
           } catch (error) {
@@ -882,7 +882,7 @@
     await refreshViews();
     final String from = await flutterDevices[0].views[0].uiIsolate.flutterPlatformOverride();
     String to;
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       to = await device.togglePlatform(from: from);
     }
     globals.printStatus('Switched operating system to $to');
@@ -913,7 +913,7 @@
     _finished = Completer<int>();
 
     bool viewFound = false;
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       await device.connect(
         reloadSources: reloadSources,
         restart: restart,
@@ -935,7 +935,7 @@
     }
 
     // Listen for service protocol connection to close.
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       // This hooks up callbacks for when the connection stops in the future.
       // We don't want to wait for them. We don't handle errors in those callbacks'
       // futures either because they just print to logger and is not critical.
@@ -993,7 +993,7 @@
 
   Future<void> exitApp() async {
     final List<Future<void>> futures = <Future<void>>[
-      for (FlutterDevice device in flutterDevices)  device.exitApps(),
+      for (final FlutterDevice device in flutterDevices)  device.exitApps(),
     ];
     await Future.wait(futures);
     appFinished();
@@ -1116,7 +1116,7 @@
   /// Unregisters terminal signal and keystroke handlers.
   void stop() {
     assert(residentRunner.stayResident);
-    for (MapEntry<io.ProcessSignal, Object> entry in _signalTokens.entries) {
+    for (final MapEntry<io.ProcessSignal, Object> entry in _signalTokens.entries) {
       signals.removeHandler(entry.key, entry.value);
     }
     _signalTokens.clear();
@@ -1154,7 +1154,7 @@
         final List<FlutterView> views = residentRunner.flutterDevices
             .expand((FlutterDevice d) => d.views).toList();
         globals.printStatus('Connected ${pluralize('view', views.length)}:');
-        for (FlutterView v in views) {
+        for (final FlutterView v in views) {
           globals.printStatus('${v.uiIsolate.name} (${v.uiIsolate.id})', indent: 2);
         }
         return true;
@@ -1189,7 +1189,7 @@
         await residentRunner.exit();
         return true;
       case 's':
-        for (FlutterDevice device in residentRunner.flutterDevices) {
+        for (final FlutterDevice device in residentRunner.flutterDevices) {
           if (device.device.supportsScreenshot) {
             await residentRunner.screenshot(device);
           }
diff --git a/packages/flutter_tools/lib/src/run_cold.dart b/packages/flutter_tools/lib/src/run_cold.dart
index 02f95ae..1211452 100644
--- a/packages/flutter_tools/lib/src/run_cold.dart
+++ b/packages/flutter_tools/lib/src/run_cold.dart
@@ -60,7 +60,7 @@
       }
     }
 
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       final int result = await device.runCold(
         coldRunner: this,
         route: route,
@@ -90,7 +90,7 @@
 
     globals.printTrace('Application running.');
 
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       if (device.vmService == null) {
         continue;
       }
@@ -142,12 +142,12 @@
       }
       return 2;
     }
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       device.initLogReader();
     }
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         globals.printTrace('Connected to $view.');
       }
     }
@@ -170,7 +170,7 @@
 
   @override
   Future<void> cleanupAtFinish() async {
-    for (FlutterDevice flutterDevice in flutterDevices) {
+    for (final FlutterDevice flutterDevice in flutterDevices) {
       await flutterDevice.device.dispose();
     }
 
@@ -181,7 +181,7 @@
   void printHelp({ @required bool details }) {
     bool haveDetails = false;
     bool haveAnything = false;
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       final String dname = device.device.name;
       if (device.vmService != null) {
         globals.printStatus('An Observatory debugger and profiler on $dname is '
@@ -209,7 +209,7 @@
 
   @override
   Future<void> preExit() async {
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       // If we're running in release mode, stop the app using the device logic.
       if (device.vmService == null) {
         await device.device.stopApp(device.package);
diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart
index e8d9337..2eadea5 100644
--- a/packages/flutter_tools/lib/src/run_hot.dart
+++ b/packages/flutter_tools/lib/src/run_hot.dart
@@ -137,7 +137,7 @@
     String klass,
     bool isStatic,
   ) async {
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       if (device.generator != null) {
         final CompilerOutput compilerOutput =
             await device.generator.compileExpression(expression, definitions,
@@ -155,7 +155,7 @@
     final Stopwatch stopwatch = Stopwatch()..start();
     final UpdateFSReport results = UpdateFSReport(success: true);
     final List<Uri> invalidated =  <Uri>[Uri.parse(libraryId)];
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       results.incorporateResults(await device.updateDevFS(
         mainPath: mainPath,
         target: target,
@@ -178,7 +178,7 @@
         getReloadPath(fullRestart: false),
         from: projectRootPath,
       );
-      for (FlutterDevice device in flutterDevices) {
+      for (final FlutterDevice device in flutterDevices) {
         final List<Future<Map<String, dynamic>>> reportFutures = device.reloadSources(
           entryPath, pause: false,
         );
@@ -190,8 +190,8 @@
       return OperationResult(1, error.toString());
     }
 
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         await view.uiIsolate.flutterFastReassemble(classId);
       }
     }
@@ -227,7 +227,7 @@
       return 2;
     }
 
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       device.initLogReader();
     }
     try {
@@ -257,13 +257,13 @@
     }
 
     await refreshViews();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       // VM must have accepted the kernel binary, there will be no reload
       // report, so we let incremental compiler know that source code was accepted.
       if (device.generator != null) {
         device.generator.accept();
       }
-      for (FlutterView view in device.views) {
+      for (final FlutterView view in device.views) {
         globals.printTrace('Connected to $view.');
       }
     }
@@ -330,7 +330,7 @@
 
     firstBuildTime = DateTime.now();
 
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       final int result = await device.runHot(
         hotRunner: this,
         route: route,
@@ -349,7 +349,7 @@
   Future<List<Uri>> _initDevFS() async {
     final String fsName = globals.fs.path.basename(projectRootPath);
     return <Uri>[
-      for (FlutterDevice device in flutterDevices)
+      for (final FlutterDevice device in flutterDevices)
         await device.setupDevFS(
           fsName,
           globals.fs.directory(projectRootPath),
@@ -378,7 +378,7 @@
       asyncScanning: hotRunnerConfig.asyncScanning,
     );
     final UpdateFSReport results = UpdateFSReport(success: true);
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       results.incorporateResults(await device.updateDevFS(
         mainPath: mainPath,
         target: target,
@@ -397,14 +397,14 @@
   }
 
   void _resetDirtyAssets() {
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       device.devFS.assetPathsToEvict.clear();
     }
   }
 
   Future<void> _cleanupDevFS() async {
     final List<Future<void>> futures = <Future<void>>[];
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       if (device.devFS != null) {
         // Cleanup the devFS, but don't wait indefinitely.
         // We ignore any errors, because it's not clear what we would do anyway.
@@ -426,7 +426,7 @@
     Uri assetsDirectoryUri,
   ) {
     return Future.wait(<Future<void>>[
-      for (FlutterView view in device.views)
+      for (final FlutterView view in device.views)
         view.runFromSource(entryUri, packagesUri, assetsDirectoryUri),
     ]);
   }
@@ -434,7 +434,7 @@
   Future<void> _launchFromDevFS(String mainScript) async {
     final String entryUri = globals.fs.path.relative(mainScript, from: projectRootPath);
     final List<Future<void>> futures = <Future<void>>[];
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       final Uri deviceEntryUri = device.devFS.baseUri.resolveUri(
         globals.fs.path.toUri(entryUri));
       final Uri devicePackagesUri = device.devFS.baseUri.resolve('.packages');
@@ -448,8 +448,8 @@
     await Future.wait(futures);
     if (benchmarkMode) {
       futures.clear();
-      for (FlutterDevice device in flutterDevices) {
-        for (FlutterView view in device.views) {
+      for (final FlutterDevice device in flutterDevices) {
+        for (final FlutterView view in device.views) {
           futures.add(view.flushUIThreadTasks());
         }
       }
@@ -471,7 +471,7 @@
     // compiler for full application recompilation on restart.
     final UpdateFSReport updatedDevFS = await _updateDevFS(fullRestart: true);
     if (!updatedDevFS.success) {
-      for (FlutterDevice device in flutterDevices) {
+      for (final FlutterDevice device in flutterDevices) {
         if (device.generator != null) {
           await device.generator.reject();
         }
@@ -479,7 +479,7 @@
       return OperationResult(1, 'DevFS synchronization failed');
     }
     _resetDirtyAssets();
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       // VM must have accepted the kernel binary, there will be no reload
       // report, so we let incremental compiler know that source code was accepted.
       if (device.generator != null) {
@@ -488,8 +488,8 @@
     }
     // Check if the isolate is paused and resume it.
     final List<Future<void>> futures = <Future<void>>[];
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         if (view.uiIsolate == null) {
           continue;
         }
@@ -522,12 +522,12 @@
     // In benchmark mode, make sure all stream notifications have finished.
     if (benchmarkMode) {
       final List<Future<void>> isolateNotifications = <Future<void>>[];
-      for (FlutterDevice device in flutterDevices) {
-        for (FlutterView view in device.views) {
+      for (final FlutterDevice device in flutterDevices) {
+        for (final FlutterView view in device.views) {
           isolateNotifications.add(
             view.owner.vm.vmService.onIsolateEvent
               .then((Stream<ServiceEvent> serviceEvents) async {
-              await for (ServiceEvent serviceEvent in serviceEvents) {
+              await for (final ServiceEvent serviceEvent in serviceEvents) {
                 if (serviceEvent.owner.name.contains('_spawn')
                   && serviceEvent.kind == ServiceEvent.kIsolateExit) {
                   return;
@@ -575,7 +575,7 @@
     if (!(reloadReport['success'] as bool)) {
       if (printErrors) {
         globals.printError('Hot reload was rejected:');
-        for (Map<String, dynamic> notice in reloadReport['details']['notices']) {
+        for (final Map<String, dynamic> notice in reloadReport['details']['notices']) {
           globals.printError('${notice['message']}');
         }
       }
@@ -747,8 +747,8 @@
     String reason,
     void Function(String message) onSlow,
   }) async {
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         if (view.uiIsolate == null) {
           return OperationResult(2, 'Application isolate not found', fatal: true);
         }
@@ -785,7 +785,7 @@
         from: projectRootPath,
       );
       final List<Future<DeviceReloadReport>> allReportsFutures = <Future<DeviceReloadReport>>[];
-      for (FlutterDevice device in flutterDevices) {
+      for (final FlutterDevice device in flutterDevices) {
         if (_runningFromSnapshot) {
           // Asset directory has to be set only once when we switch from
           // running from snapshot to running from uploaded files.
@@ -809,7 +809,7 @@
         ));
       }
       final List<DeviceReloadReport> reports = await Future.wait(allReportsFutures);
-      for (DeviceReloadReport report in reports) {
+      for (final DeviceReloadReport report in reports) {
         final Map<String, dynamic> reloadReport = report.reports[0];
         if (!validateReloadReport(reloadReport)) {
           // Reload failed.
@@ -859,10 +859,10 @@
     final Stopwatch reassembleTimer = Stopwatch()..start();
     // Reload the isolate.
     final List<Future<void>> allDevices = <Future<void>>[];
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       globals.printTrace('Sending reload events to ${device.device.name}');
       final List<Future<ServiceObject>> futuresViews = <Future<ServiceObject>>[];
-      for (FlutterView view in device.views) {
+      for (final FlutterView view in device.views) {
         globals.printTrace('Sending reload event to "${view.uiIsolate.name}"');
         futuresViews.add(view.uiIsolate.reload());
       }
@@ -878,8 +878,8 @@
     final List<FlutterView> reassembleViews = <FlutterView>[];
     String serviceEventKind;
     int pausedIsolatesFound = 0;
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         // Check if the isolate is paused, and if so, don't reassemble. Ignore the
         // PostPauseEvent event - the client requesting the pause will resume the app.
         final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
@@ -910,7 +910,7 @@
     globals.printTrace('Reassembling application');
     bool failedReassemble = false;
     final List<Future<void>> futures = <Future<void>>[
-      for (FlutterView view in reassembleViews)
+      for (final FlutterView view in reassembleViews)
         () async {
           try {
             await view.uiIsolate.flutterReassemble();
@@ -933,7 +933,7 @@
         globals.printTrace('This is taking a long time; will now check for paused isolates.');
         int postReloadPausedIsolatesFound = 0;
         String serviceEventKind;
-        for (FlutterView view in reassembleViews) {
+        for (final FlutterView view in reassembleViews) {
           await view.uiIsolate.reload();
           final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
           if (pauseEvent != null && pauseEvent.isPauseEvent) {
@@ -1030,8 +1030,8 @@
   }
 
   bool _isPaused() {
-    for (FlutterDevice device in flutterDevices) {
-      for (FlutterView view in device.views) {
+    for (final FlutterDevice device in flutterDevices) {
+      for (final FlutterView view in device.views) {
         if (view.uiIsolate != null) {
           final ServiceEvent pauseEvent = view.uiIsolate.pauseEvent;
           if (pauseEvent != null && pauseEvent.isPauseEvent) {
@@ -1055,7 +1055,7 @@
       TerminalColor.red,
     );
     globals.printStatus(message);
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       final String dname = device.device.name;
       globals.printStatus('An Observatory debugger and profiler on $dname is '
         'available at: ${device.vmService.httpAddress}');
@@ -1073,7 +1073,7 @@
 
   Future<void> _evictDirtyAssets() {
     final List<Future<Map<String, dynamic>>> futures = <Future<Map<String, dynamic>>>[];
-    for (FlutterDevice device in flutterDevices) {
+    for (final FlutterDevice device in flutterDevices) {
       if (device.devFS.assetPathsToEvict.isEmpty) {
         continue;
       }
@@ -1081,7 +1081,7 @@
         globals.printError('Application isolate not found for $device');
         continue;
       }
-      for (String assetPath in device.devFS.assetPathsToEvict) {
+      for (final String assetPath in device.devFS.assetPathsToEvict) {
         futures.add(device.views.first.uiIsolate.flutterEvictAsset(assetPath));
       }
       device.devFS.assetPathsToEvict.clear();
@@ -1109,7 +1109,7 @@
 
   @override
   Future<void> cleanupAtFinish() async {
-    for (FlutterDevice flutterDevice in flutterDevices) {
+    for (final FlutterDevice flutterDevice in flutterDevices) {
       await flutterDevice.device.dispose();
     }
     await _cleanupDevFS();
@@ -1161,7 +1161,7 @@
     final Stopwatch stopwatch = Stopwatch()..start();
     final List<Uri> urisToScan = <Uri>[
       // Don't watch pub cache directories to speed things up a little.
-      for (Uri uri in urisToMonitor)
+      for (final Uri uri in urisToMonitor)
         if (_isNotInPubCache(uri)) uri,
 
       // We need to check the .packages file too since it is not used in compilation.
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index a04e402..0d81d6f 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -445,7 +445,7 @@
             : null;
     if (argParser.options.containsKey(FlutterOptions.kEnableExperiment) &&
         argResults[FlutterOptions.kEnableExperiment] != null) {
-      for (String expFlag in stringsArg(FlutterOptions.kEnableExperiment)) {
+      for (final String expFlag in stringsArg(FlutterOptions.kEnableExperiment)) {
         final String flag = '--enable-experiment=' + expFlag;
         if (extraFrontEndOptions != null) {
           extraFrontEndOptions += ',' + flag;
@@ -743,7 +743,7 @@
     final Set<DevelopmentArtifact> artifacts = <DevelopmentArtifact>{
       DevelopmentArtifact.universal,
     };
-    for (Device device in devices) {
+    for (final Device device in devices) {
       final TargetPlatform targetPlatform = await device.targetPlatform;
       final DevelopmentArtifact developmentArtifact = _artifactFromTargetPlatform(targetPlatform);
       if (developmentArtifact != null) {
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
index ca6d672..7731bd0 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command_runner.dart
@@ -206,7 +206,7 @@
       }
 
       Command<void> command = commands[error.commands.first];
-      for (String commandName in error.commands.skip(1)) {
+      for (final String commandName in error.commands.skip(1)) {
         command = command.subcommands[commandName];
       }
 
@@ -386,7 +386,7 @@
     tmpBasename = tmpBasename.substring(tmpBasename.indexOf('_') + 1);
     // Strip suffix for various archs.
     final List<String> suffixes = <String>['_arm', '_arm64', '_x86', '_x64'];
-    for (String suffix in suffixes) {
+    for (final String suffix in suffixes) {
       tmpBasename = tmpBasename.replaceFirst(RegExp('$suffix\$'), '');
     }
     return 'host_' + tmpBasename;
diff --git a/packages/flutter_tools/lib/src/template.dart b/packages/flutter_tools/lib/src/template.dart
index f47f450..e37fddd 100644
--- a/packages/flutter_tools/lib/src/template.dart
+++ b/packages/flutter_tools/lib/src/template.dart
@@ -33,7 +33,7 @@
 
     final List<FileSystemEntity> templateFiles = templateSource.listSync(recursive: true);
 
-    for (FileSystemEntity entity in templateFiles) {
+    for (final FileSystemEntity entity in templateFiles) {
       if (entity is! File) {
         // We are only interesting in template *file* URIs.
         continue;
diff --git a/packages/flutter_tools/lib/src/test/coverage_collector.dart b/packages/flutter_tools/lib/src/test/coverage_collector.dart
index b9dad72..2d8e6a8 100644
--- a/packages/flutter_tools/lib/src/test/coverage_collector.dart
+++ b/packages/flutter_tools/lib/src/test/coverage_collector.dart
@@ -188,7 +188,7 @@
 Future<Map<String, dynamic>> _getAllCoverage(VMService service, bool Function(String) libraryPredicate) async {
   await service.getVM();
   final List<Map<String, dynamic>> coverage = <Map<String, dynamic>>[];
-  for (Isolate isolateRef in service.vm.isolates) {
+  for (final Isolate isolateRef in service.vm.isolates) {
     await isolateRef.load();
     final Map<String, dynamic> scriptList = await isolateRef.invokeRpcRaw('getScripts', params: <String, dynamic>{'isolateId': isolateRef.id});
     final List<Future<void>> futures = <Future<void>>[];
@@ -204,7 +204,7 @@
     if (scriptList['scripts'] == null) {
       continue;
     }
-    for (Map<String, dynamic> script in scriptList['scripts']) {
+    for (final Map<String, dynamic> script in scriptList['scripts']) {
       if (!libraryPredicate(script['uri'] as String)) {
         continue;
       }
@@ -243,9 +243,9 @@
   List<Map<String, dynamic>> coverage,
 ) {
   final Map<String, Map<int, int>> hitMaps = <String, Map<int, int>>{};
-  for (String scriptId in scripts.keys) {
+  for (final String scriptId in scripts.keys) {
     final Map<String, dynamic> sourceReport = sourceReports[scriptId];
-    for (Map<String, dynamic> range in sourceReport['ranges']) {
+    for (final Map<String, dynamic> range in sourceReport['ranges']) {
       final Map<String, dynamic> coverage = castStringKeyedMap(range['coverage']);
       // Coverage reports may sometimes be null for a Script.
       if (coverage == null) {
@@ -264,14 +264,14 @@
         continue;
       }
       if (hits != null) {
-        for (int hit in hits) {
+        for (final int hit in hits) {
           final int line = _lineAndColumn(hit, tokenPositions)[0];
           final int current = hitMap[line] ?? 0;
           hitMap[line] = current + 1;
         }
       }
       if (misses != null) {
-        for (int miss in misses) {
+        for (final int miss in misses) {
           final int line = _lineAndColumn(miss, tokenPositions)[0];
           hitMap[line] ??= 0;
         }
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 8b73b57..c47af1e 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -678,7 +678,7 @@
     } finally {
       globals.printTrace('test $ourTestCount: cleaning up...');
       // Finalizers are treated like a stack; run them in reverse order.
-      for (Finalizer finalizer in finalizers.reversed) {
+      for (final Finalizer finalizer in finalizers.reversed) {
         try {
           await finalizer();
         } catch (error, stack) {
@@ -850,7 +850,7 @@
     void reportObservatoryUri(Uri uri),
   }) {
     const String observatoryString = 'Observatory listening on ';
-    for (Stream<List<int>> stream in <Stream<List<int>>>[
+    for (final Stream<List<int>> stream in <Stream<List<int>>>[
       process.stderr,
       process.stdout,
     ]) {
diff --git a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
index 7aa705b..c638f67 100644
--- a/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_web_platform.dart
@@ -440,7 +440,7 @@
   /// the longest matching prefix wins.
   void add(String path, shelf.Handler handler) {
     _Node node = _paths;
-    for (String component in p.url.split(path)) {
+    for (final String component in p.url.split(path)) {
       node = node.children.putIfAbsent(component, () => _Node());
     }
     node.handler = handler;
@@ -489,7 +489,7 @@
     // Start this canceled because we don't want it to start ticking until we
     // get some response from the iframe.
     _timer = RestartableTimer(const Duration(seconds: 3), () {
-      for (RunnerSuiteController controller in _controllers) {
+      for (final RunnerSuiteController controller in _controllers) {
         controller.setDebugging(true);
       }
     })
@@ -503,7 +503,7 @@
           if (!_closed) {
             _timer.reset();
           }
-          for (RunnerSuiteController controller in _controllers) {
+          for (final RunnerSuiteController controller in _controllers) {
             controller.setDebugging(false);
           }
 
@@ -933,7 +933,7 @@
     .transform<String>(utf8.decoder)
     .transform<String>(const LineSplitter())
     .map<Object>(jsonDecode);
-  await for (Object command in commands) {
+  await for (final Object command in commands) {
     if (command is Map<String, dynamic>) {
       File imageFile = File(command['imageFile']);
       Uri goldenKey = Uri.parse(command['key']);
diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart
index 593603d..490cf50 100644
--- a/packages/flutter_tools/lib/src/test/runner.dart
+++ b/packages/flutter_tools/lib/src/test/runner.dart
@@ -61,9 +61,9 @@
     else
       ...<String>['-r', 'compact'],
     '--concurrency=$concurrency',
-    for (String name in names)
+    for (final String name in names)
       ...<String>['--name', name],
-    for (String plainName in plainNames)
+    for (final String plainName in plainNames)
       ...<String>['--plain-name', plainName],
     '--test-randomize-ordering-seed=$randomSeed',
   ];
diff --git a/packages/flutter_tools/lib/src/tracing.dart b/packages/flutter_tools/lib/src/tracing.dart
index 623a10d..020d068 100644
--- a/packages/flutter_tools/lib/src/tracing.dart
+++ b/packages/flutter_tools/lib/src/tracing.dart
@@ -51,7 +51,7 @@
           }
         });
         bool done = false;
-        for (FlutterView view in vmService.vm.views) {
+        for (final FlutterView view in vmService.vm.views) {
           if (await view.uiIsolate.flutterAlreadyPaintedFirstUsefulFrame()) {
             done = true;
             break;
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index 9d0450e..99adc78 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -856,7 +856,7 @@
   void _removeDeadIsolates(List<Isolate> newIsolates) {
     // Build a set of new isolates.
     final Set<String> newIsolateSet = <String>{};
-    for (Isolate iso in newIsolates) {
+    for (final Isolate iso in newIsolates) {
       newIsolateSet.add(iso.id);
     }
 
diff --git a/packages/flutter_tools/lib/src/vscode/vscode.dart b/packages/flutter_tools/lib/src/vscode/vscode.dart
index 6410493..b110046 100644
--- a/packages/flutter_tools/lib/src/vscode/vscode.dart
+++ b/packages/flutter_tools/lib/src/vscode/vscode.dart
@@ -204,7 +204,7 @@
 
     final List<VsCode> results = <VsCode>[];
 
-    for (_VsCodeInstallLocation searchLocation in searchLocations) {
+    for (final _VsCodeInstallLocation searchLocation in searchLocations) {
       if (globals.fs.isDirectorySync(searchLocation.installPath)) {
         final String extensionDirectory =
             globals.fs.path.join(homeDirPath, searchLocation.extensionsFolder, 'extensions');
diff --git a/packages/flutter_tools/lib/src/web/compile.dart b/packages/flutter_tools/lib/src/web/compile.dart
index 8f024d2..c062031 100644
--- a/packages/flutter_tools/lib/src/web/compile.dart
+++ b/packages/flutter_tools/lib/src/web/compile.dart
@@ -53,7 +53,7 @@
       },
     ));
     if (!result.success) {
-      for (ExceptionMeasurement measurement in result.exceptions.values) {
+      for (final ExceptionMeasurement measurement in result.exceptions.values) {
         globals.printError('Target ${measurement.target} failed: ${measurement.exception}',
           stackTrace: measurement.fatal
             ? measurement.stackTrace
diff --git a/packages/flutter_tools/lib/src/web/devfs_web.dart b/packages/flutter_tools/lib/src/web/devfs_web.dart
index c28815b..e24ef5e 100644
--- a/packages/flutter_tools/lib/src/web/devfs_web.dart
+++ b/packages/flutter_tools/lib/src/web/devfs_web.dart
@@ -177,7 +177,7 @@
     final Uint8List codeBytes = codeFile.readAsBytesSync();
     final Uint8List sourcemapBytes = sourcemapFile.readAsBytesSync();
     final Map<String, dynamic> manifest = castStringKeyedMap(json.decode(manifestFile.readAsStringSync()));
-    for (String filePath in manifest.keys) {
+    for (final String filePath in manifest.keys) {
       if (filePath == null) {
         globals.printTrace('Invalid manfiest file: $filePath');
         continue;
diff --git a/packages/flutter_tools/lib/src/windows/windows_device.dart b/packages/flutter_tools/lib/src/windows/windows_device.dart
index 1161d6d..f7f0b65 100644
--- a/packages/flutter_tools/lib/src/windows/windows_device.dart
+++ b/packages/flutter_tools/lib/src/windows/windows_device.dart
@@ -93,7 +93,7 @@
   if (result.exitCode != 0) {
     return null;
   }
-  for (String rawProcess in result.stdout.split('\n')) {
+  for (final String rawProcess in result.stdout.split('\n')) {
     final String process = rawProcess.trim();
     if (!process.contains(processName)) {
       continue;
