diff --git a/dev/benchmarks/platform_channels_benchmarks/lib/main.dart b/dev/benchmarks/platform_channels_benchmarks/lib/main.dart
index 3876d6e..2b43fea 100644
--- a/dev/benchmarks/platform_channels_benchmarks/lib/main.dart
+++ b/dev/benchmarks/platform_channels_benchmarks/lib/main.dart
@@ -11,30 +11,20 @@
 import 'package:microbenchmarks/common.dart';
 
 List<Object?> _makeTestBuffer(int size) {
-  final List<Object?> answer = <Object?>[];
-  for (int i = 0; i < size; ++i) {
-    switch (i % 9) {
-      case 0:
-        answer.add(1);
-      case 1:
-        answer.add(math.pow(2, 65));
-      case 2:
-        answer.add(1234.0);
-      case 3:
-        answer.add(null);
-      case 4:
-        answer.add(<int>[1234]);
-      case 5:
-        answer.add(<String, int>{'hello': 1234});
-      case 6:
-        answer.add('this is a test');
-      case 7:
-        answer.add(true);
-      case 8:
-        answer.add(Uint8List(64));
-    }
-  }
-  return answer;
+  return <Object?>[
+    for (int i = 0; i < size; i++)
+      switch (i % 9) {
+        0 => 1,
+        1 => math.pow(2, 65),
+        2 => 1234.0,
+        3 => null,
+        4 => <int>[1234],
+        5 => <String, int>{'hello': 1234},
+        6 => 'this is a test',
+        7 => true,
+        _ => Uint8List(64),
+      },
+  ];
 }
 
 Future<double> _runBasicStandardSmall(
diff --git a/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart b/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart
index 91c96f1..4c4534a 100644
--- a/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart
+++ b/dev/bots/suite_runners/run_verify_binaries_codesigned_tests.dart
@@ -139,28 +139,21 @@
   String flutterRoot,
   {@visibleForTesting ProcessManager processManager = const LocalProcessManager()
 }) async {
-  final Set<String> foundFiles = <String>{};
-  final String cacheDirectory =  path.join(flutterRoot, 'bin', 'cache');
-
-  for (final String binaryPath
-      in await findBinaryPaths(cacheDirectory, processManager: processManager)) {
-    if (binariesWithEntitlements(flutterRoot).contains(binaryPath)) {
-      foundFiles.add(binaryPath);
-    } else if (binariesWithoutEntitlements(flutterRoot).contains(binaryPath)) {
-      foundFiles.add(binaryPath);
-    } else {
-      throw Exception(
-          'Found unexpected binary in cache: $binaryPath');
-    }
-  }
-
+  final List<String> binaryPaths = await findBinaryPaths(
+    path.join(flutterRoot, 'bin', 'cache'),
+    processManager: processManager,
+  );
   final List<String> allExpectedFiles = binariesWithEntitlements(flutterRoot) + binariesWithoutEntitlements(flutterRoot);
+  final Set<String> foundFiles = <String>{
+    for (final String binaryPath in binaryPaths)
+      if (allExpectedFiles.contains(binaryPath)) binaryPath
+      else throw Exception('Found unexpected binary in cache: $binaryPath'),
+  };
+
   if (foundFiles.length < allExpectedFiles.length) {
-    final List<String> unfoundFiles = allExpectedFiles
-        .where(
-          (String file) => !foundFiles.contains(file),
-        )
-        .toList();
+    final List<String> unfoundFiles = <String>[
+      for (final String file in allExpectedFiles) if (!foundFiles.contains(file)) file,
+    ];
     print(
       'Expected binaries not found in cache:\n\n${unfoundFiles.join('\n')}\n\n'
       'If this commit is removing binaries from the cache, this test should be fixed by\n'
diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index cb1dab7..cf4cac0 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -913,18 +913,14 @@
         final Uint8List libappBytes = libapp.content as Uint8List; // bytes decompressed here
         final String libappStrings = utf8.decode(libappBytes, allowMalformed: true);
         await runCommand(flutter, <String>['clean'], workingDirectory: tracingDirectory);
-        final List<String> results = <String>[];
-        for (final String pattern in allowed) {
-          if (!libappStrings.contains(pattern)) {
-            results.add('When building with --$modeArgument, expected to find "$pattern" in libapp.so but could not find it.');
-          }
-        }
-        for (final String pattern in disallowed) {
-          if (libappStrings.contains(pattern)) {
-            results.add('When building with --$modeArgument, expected to not find "$pattern" in libapp.so but did find it.');
-          }
-        }
-        return results;
+        return <String>[
+          for (final String pattern in allowed)
+            if (!libappStrings.contains(pattern))
+              'When building with --$modeArgument, expected to find "$pattern" in libapp.so but could not find it.',
+          for (final String pattern in disallowed)
+            if (libappStrings.contains(pattern))
+              'When building with --$modeArgument, expected to not find "$pattern" in libapp.so but did find it.',
+        ];
       } catch (error, stackTrace) {
         return <String>[
           error.toString(),
@@ -1332,11 +1328,9 @@
 
   if (collectMetrics) {
     try {
-      final List<String> testList = <String>[];
-      final Map<int, TestSpecs> allTestSpecs = test.allTestSpecs;
-      for (final TestSpecs testSpecs in allTestSpecs.values) {
-        testList.add(testSpecs.toJson());
-      }
+      final List<String> testList = <String>[
+        for (final TestSpecs testSpecs in test.allTestSpecs.values) testSpecs.toJson(),
+      ];
       if (testList.isNotEmpty) {
         final String testJson = json.encode(testList);
         final File testResults = fileSystem.file(
diff --git a/dev/conductor/core/lib/src/next.dart b/dev/conductor/core/lib/src/next.dart
index 1b5669d..4c0552c 100644
--- a/dev/conductor/core/lib/src/next.dart
+++ b/dev/conductor/core/lib/src/next.dart
@@ -110,12 +110,10 @@
           break;
         }
 
-        final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[];
-        for (final pb.Cherrypick cherrypick in state.engine.cherrypicks) {
-          if (!finishedStates.contains(cherrypick.state)) {
-            unappliedCherrypicks.add(cherrypick);
-          }
-        }
+        final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[
+          for (final pb.Cherrypick cherrypick in state.engine.cherrypicks)
+            if (!finishedStates.contains(cherrypick.state)) cherrypick,
+        ];
 
         if (unappliedCherrypicks.isEmpty) {
           stdio.printStatus('All engine cherrypicks have been auto-applied by the conductor.\n');
@@ -206,12 +204,10 @@
           );
         }
 
-        final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[];
-        for (final pb.Cherrypick cherrypick in state.framework.cherrypicks) {
-          if (!finishedStates.contains(cherrypick.state)) {
-            unappliedCherrypicks.add(cherrypick);
-          }
-        }
+        final List<pb.Cherrypick> unappliedCherrypicks = <pb.Cherrypick>[
+          for (final pb.Cherrypick cherrypick in state.framework.cherrypicks)
+            if (!finishedStates.contains(cherrypick.state)) cherrypick,
+        ];
 
         if (state.framework.cherrypicks.isEmpty) {
           stdio.printStatus(
diff --git a/dev/conductor/core/lib/src/repository.dart b/dev/conductor/core/lib/src/repository.dart
index 26d7514..87c0017 100644
--- a/dev/conductor/core/lib/src/repository.dart
+++ b/dev/conductor/core/lib/src/repository.dart
@@ -183,15 +183,11 @@
       workingDirectory: (await checkoutDirectory).path,
     );
 
-    final List<String> remoteBranches = <String>[];
-    for (final String line in output.split('\n')) {
-      final RegExpMatch? match = _lsRemotePattern.firstMatch(line);
-      if (match != null) {
-        remoteBranches.add(match.group(1)!);
-      }
-    }
-
-    return remoteBranches;
+    return <String>[
+      for (final String line in output.split('\n'))
+        if (_lsRemotePattern.firstMatch(line) case final RegExpMatch match)
+          match.group(1)!,
+    ];
   }
 
   /// Ensure the repository is cloned to disk and initialized with proper state.
diff --git a/dev/devicelab/lib/tasks/microbenchmarks.dart b/dev/devicelab/lib/tasks/microbenchmarks.dart
index 8b7a659..aa38ab9 100644
--- a/dev/devicelab/lib/tasks/microbenchmarks.dart
+++ b/dev/devicelab/lib/tasks/microbenchmarks.dart
@@ -39,8 +39,8 @@
             if (enableImpeller != null && !enableImpeller) '--no-enable-impeller',
             '-d',
             device.deviceId,
+            benchmarkPath,
           ];
-          options.add(benchmarkPath);
           return startFlutter(
             'run',
             options: options,
diff --git a/dev/integration_tests/android_semantics_testing/lib/src/common.dart b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
index fa9e3f5..4af3328 100644
--- a/dev/integration_tests/android_semantics_testing/lib/src/common.dart
+++ b/dev/integration_tests/android_semantics_testing/lib/src/common.dart
@@ -154,14 +154,11 @@
     if (actions == null) {
       return const <AndroidSemanticsAction>[];
     }
-    final List<AndroidSemanticsAction> convertedActions = <AndroidSemanticsAction>[];
-    for (final int id in actions) {
-      final AndroidSemanticsAction? action = AndroidSemanticsAction.deserialize(id);
-      if (action != null) {
-        convertedActions.add(action);
-      }
-    }
-    return convertedActions;
+    return <AndroidSemanticsAction>[
+      for (final int id in actions)
+        if (AndroidSemanticsAction.deserialize(id) case final AndroidSemanticsAction action)
+          action,
+    ];
   }
 
   @override
diff --git a/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart b/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
index ab40925..a90c128 100644
--- a/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
+++ b/dev/integration_tests/flutter_gallery/lib/demo/calculator/logic.dart
@@ -121,10 +121,8 @@
     : this(<ExpressionToken>[], ExpressionState.Start);
 
   CalcExpression.result(FloatToken result)
-    : _list = <ExpressionToken?>[],
-      state = ExpressionState.Result {
-    _list.add(result);
-  }
+    : _list = <ExpressionToken?>[result],
+      state = ExpressionState.Result;
 
   /// The tokens comprising the expression.
   final List<ExpressionToken?> _list;
diff --git a/dev/integration_tests/new_gallery/lib/demos/cupertino/cupertino_search_text_field_demo.dart b/dev/integration_tests/new_gallery/lib/demos/cupertino/cupertino_search_text_field_demo.dart
index 611b749..800af16 100644
--- a/dev/integration_tests/new_gallery/lib/demos/cupertino/cupertino_search_text_field_demo.dart
+++ b/dev/integration_tests/new_gallery/lib/demos/cupertino/cupertino_search_text_field_demo.dart
@@ -84,15 +84,11 @@
 
   Widget _buildPlatformList() {
     if (_searchPlatform.isNotEmpty) {
-      final List<String> tempList = <String>[];
-      for (int i = 0; i < filteredPlatforms.length; i++) {
-        if (filteredPlatforms[i]
-            .toLowerCase()
-            .contains(_searchPlatform.toLowerCase())) {
-          tempList.add(filteredPlatforms[i]);
-        }
-      }
-      filteredPlatforms = tempList;
+      final String search = _searchPlatform.toLowerCase();
+      filteredPlatforms = <String>[
+        for (final String platform in filteredPlatforms)
+          if (platform.toLowerCase().contains(search)) platform
+      ];
     }
     return ListView.builder(
       itemCount: filteredPlatforms.length,
diff --git a/dev/integration_tests/new_gallery/lib/demos/material/data_table_demo.dart b/dev/integration_tests/new_gallery/lib/demos/material/data_table_demo.dart
index d88ca63..ad4c46e 100644
--- a/dev/integration_tests/new_gallery/lib/demos/material/data_table_demo.dart
+++ b/dev/integration_tests/new_gallery/lib/demos/material/data_table_demo.dart
@@ -26,14 +26,10 @@
   /// Takes a list of [_Dessert]s and saves the row indices of selected rows
   /// into a [Set].
   void setDessertSelections(List<_Dessert> desserts) {
-    final Set<int> updatedSet = <int>{};
-    for (int i = 0; i < desserts.length; i += 1) {
-      final _Dessert dessert = desserts[i];
-      if (dessert.selected) {
-        updatedSet.add(i);
-      }
-    }
-    _dessertSelections = updatedSet;
+    _dessertSelections = <int>{
+      for (final (int i, _Dessert dessert) in desserts.indexed)
+        if (dessert.selected) i,
+    };
     notifyListeners();
   }
 
diff --git a/dev/tools/examples_smoke_test.dart b/dev/tools/examples_smoke_test.dart
index 84660fd..8eff94d 100644
--- a/dev/tools/examples_smoke_test.dart
+++ b/dev/tools/examples_smoke_test.dart
@@ -116,19 +116,18 @@
   });
 
   // Collect the examples, and import them all as separate symbols.
-  final List<String> imports = <String>[];
-  imports.add('''import 'package:flutter/widgets.dart';''');
-  imports.add('''import 'package:flutter/scheduler.dart';''');
-  imports.add('''import 'package:flutter_test/flutter_test.dart';''');
-  imports.add('''import 'package:integration_test/integration_test.dart';''');
-  final List<ExampleInfo> infoList = <ExampleInfo>[];
-  for (final File example in examples) {
-    final ExampleInfo info = ExampleInfo(example, examplesLibDir);
-    infoList.add(info);
-    imports.add('''import 'package:flutter_api_samples/${info.importPath}' as ${info.importName};''');
-  }
-  imports.sort();
+  final List<ExampleInfo> infoList = <ExampleInfo>[
+    for (final File example in examples) ExampleInfo(example, examplesLibDir),
+  ];
   infoList.sort((ExampleInfo a, ExampleInfo b) => a.importPath.compareTo(b.importPath));
+  final List<String> imports = <String>[
+    "import 'package:flutter/widgets.dart';",
+    "import 'package:flutter/scheduler.dart';",
+    "import 'package:flutter_test/flutter_test.dart';",
+    "import 'package:integration_test/integration_test.dart';",
+    for (final ExampleInfo info in infoList)
+      "import 'package:flutter_api_samples/${info.importPath}' as ${info.importName};"
+  ]..sort();
 
   final StringBuffer buffer = StringBuffer();
   buffer.writeln('// Temporary generated file. Do not commit.');
diff --git a/dev/tools/update_icons.dart b/dev/tools/update_icons.dart
index 9d56f54..1007f72 100644
--- a/dev/tools/update_icons.dart
+++ b/dev/tools/update_icons.dart
@@ -388,15 +388,10 @@
 @visibleForTesting
 bool testIsStable(Map<String, String> newCodepoints, Map<String, String> oldCodepoints) {
   final int oldCodepointsCount = oldCodepoints.length;
-  final List<String> unstable = <String>[];
-
-  oldCodepoints.forEach((String key, String value) {
-    if (newCodepoints.containsKey(key)) {
-      if (value != newCodepoints[key]) {
-        unstable.add(key);
-      }
-    }
-  });
+  final List<String> unstable = <String>[
+    for (final MapEntry<String, String>(:String key, :String value) in oldCodepoints.entries)
+      if (newCodepoints.containsKey(key) && value != newCodepoints[key]) key,
+  ];
 
   if (unstable.isNotEmpty) {
     stderr.writeln('❌ out of $oldCodepointsCount existing codepoints, ${unstable.length} were unstable: $unstable');
diff --git a/packages/flutter/lib/src/cupertino/dialog.dart b/packages/flutter/lib/src/cupertino/dialog.dart
index bcbf5cd..8094248 100644
--- a/packages/flutter/lib/src/cupertino/dialog.dart
+++ b/packages/flutter/lib/src/cupertino/dialog.dart
@@ -1485,22 +1485,15 @@
 
   @override
   Widget build(BuildContext context) {
-
-    final List<Widget> interactiveButtons = <Widget>[];
-    for (int i = 0; i < children.length; i += 1) {
-      interactiveButtons.add(
-        _PressableActionButton(
-          child: children[i],
-        ),
-      );
-    }
-
     return CupertinoScrollbar(
       controller: scrollController,
       child: SingleChildScrollView(
         controller: scrollController,
         child: _CupertinoDialogActionsRenderWidget(
-          actionButtons: interactiveButtons,
+          actionButtons: <Widget>[
+            for (final Widget child in children)
+              _PressableActionButton(child: child),
+          ],
           dividerThickness: _kDividerThickness,
           hasCancelButton: hasCancelButton,
           isActionSheet: isActionSheet,
diff --git a/packages/flutter/lib/src/foundation/timeline.dart b/packages/flutter/lib/src/foundation/timeline.dart
index 0f71c36..f5b2c72 100644
--- a/packages/flutter/lib/src/foundation/timeline.dart
+++ b/packages/flutter/lib/src/foundation/timeline.dart
@@ -311,12 +311,10 @@
   /// are read back, they do not affect the timings of the work being
   /// benchmarked.
   List<double> extractElements() {
-    final List<double> result = <double>[];
-    _chain.forEach(result.addAll);
-    for (int i = 0; i < _pointer; i++) {
-      result.add(_slice[i]);
-    }
-    return result;
+    return <double>[
+      for (final Float64List list in _chain) ...list,
+      for (int i = 0; i < _pointer; i++) _slice[i],
+    ];
   }
 }
 
@@ -349,16 +347,11 @@
   /// are read back, they do not affect the timings of the work being
   /// benchmarked.
   List<String> extractElements() {
-    final List<String> result = <String>[];
-    for (final List<String?> slice in _chain) {
-      for (final String? element in slice) {
-        result.add(element!);
-      }
-    }
-    for (int i = 0; i < _pointer; i++) {
-      result.add(_slice[i]!);
-    }
-    return result;
+    return <String>[
+      for (final List<String?> slice in _chain)
+        for (final String? value in slice) value!,
+      for (int i = 0; i < _pointer; i++) _slice[i]!,
+    ];
   }
 }
 
diff --git a/packages/flutter/lib/src/material/menu_anchor.dart b/packages/flutter/lib/src/material/menu_anchor.dart
index 503286e..630b92a 100644
--- a/packages/flutter/lib/src/material/menu_anchor.dart
+++ b/packages/flutter/lib/src/material/menu_anchor.dart
@@ -2125,37 +2125,22 @@
         keySeparator = '+';
     }
     if (serialized.trigger != null) {
-      final List<String> modifiers = <String>[];
       final LogicalKeyboardKey trigger = serialized.trigger!;
-      if (_usesSymbolicModifiers) {
-        // macOS/iOS platform convention uses this ordering, with ⌘ always last.
-        if (serialized.control!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.control, localizations));
-        }
-        if (serialized.alt!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.alt, localizations));
-        }
-        if (serialized.shift!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.shift, localizations));
-        }
-        if (serialized.meta!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.meta, localizations));
-        }
-      } else {
-        // These should be in this order, to match the LogicalKeySet version.
-        if (serialized.alt!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.alt, localizations));
-        }
-        if (serialized.control!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.control, localizations));
-        }
-        if (serialized.meta!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.meta, localizations));
-        }
-        if (serialized.shift!) {
-          modifiers.add(_getModifierLabel(LogicalKeyboardKey.shift, localizations));
-        }
-      }
+      final List<String> modifiers = <String>[
+        if (_usesSymbolicModifiers) ...<String>[
+          // MacOS/iOS platform convention uses this ordering, with ⌘ always last.
+          if (serialized.control!) _getModifierLabel(LogicalKeyboardKey.control, localizations),
+          if (serialized.alt!)     _getModifierLabel(LogicalKeyboardKey.alt, localizations),
+          if (serialized.shift!)   _getModifierLabel(LogicalKeyboardKey.shift, localizations),
+          if (serialized.meta!)    _getModifierLabel(LogicalKeyboardKey.meta, localizations),
+        ] else ...<String>[
+          // This order matches the LogicalKeySet version.
+          if (serialized.alt!)     _getModifierLabel(LogicalKeyboardKey.alt, localizations),
+          if (serialized.control!) _getModifierLabel(LogicalKeyboardKey.control, localizations),
+          if (serialized.meta!)    _getModifierLabel(LogicalKeyboardKey.meta, localizations),
+          if (serialized.shift!)   _getModifierLabel(LogicalKeyboardKey.shift, localizations),
+        ],
+      ];
       String? shortcutTrigger;
       final int logicalKeyId = trigger.keyId;
       if (_shortcutGraphicEquivalents.containsKey(trigger)) {
diff --git a/packages/flutter/lib/src/material/navigation_drawer.dart b/packages/flutter/lib/src/material/navigation_drawer.dart
index edd9946..bc4cd21 100644
--- a/packages/flutter/lib/src/material/navigation_drawer.dart
+++ b/packages/flutter/lib/src/material/navigation_drawer.dart
@@ -141,7 +141,6 @@
         children.whereType<NavigationDrawerDestination>().toList().length;
 
     int destinationIndex = 0;
-    final List<Widget> wrappedChildren = <Widget>[];
     Widget wrapChild(Widget child, int index) => _SelectableAnimatedBuilder(
         duration: const Duration(milliseconds: 500),
         isSelected: index == selectedIndex,
@@ -162,14 +161,11 @@
           );
         });
 
-    for (int i = 0; i < children.length; i++) {
-      if (children[i] is! NavigationDrawerDestination) {
-        wrappedChildren.add(children[i]);
-      } else {
-        wrappedChildren.add(wrapChild(children[i], destinationIndex));
-        destinationIndex += 1;
-      }
-    }
+    final List<Widget> wrappedChildren = <Widget>[
+      for (final Widget child in children)
+        if (child is! NavigationDrawerDestination) child
+        else wrapChild(child, destinationIndex++),
+    ];
     final NavigationDrawerThemeData navigationDrawerTheme = NavigationDrawerTheme.of(context);
 
     return Drawer(
diff --git a/packages/flutter/lib/src/painting/box_border.dart b/packages/flutter/lib/src/painting/box_border.dart
index 0155ac9..e41e926 100644
--- a/packages/flutter/lib/src/painting/box_border.dart
+++ b/packages/flutter/lib/src/painting/box_border.dart
@@ -492,20 +492,12 @@
   }
 
   Set<Color> _distinctVisibleColors() {
-    final Set<Color> distinctVisibleColors = <Color>{};
-    if (top.style != BorderStyle.none) {
-      distinctVisibleColors.add(top.color);
-    }
-    if (right.style != BorderStyle.none) {
-      distinctVisibleColors.add(right.color);
-    }
-    if (bottom.style != BorderStyle.none) {
-      distinctVisibleColors.add(bottom.color);
-    }
-    if (left.style != BorderStyle.none) {
-      distinctVisibleColors.add(left.color);
-    }
-    return distinctVisibleColors;
+    return <Color>{
+      if (top.style != BorderStyle.none) top.color,
+      if (right.style != BorderStyle.none) right.color,
+      if (bottom.style != BorderStyle.none) bottom.color,
+      if (left.style != BorderStyle.none) left.color,
+    };
   }
 
   // [BoxBorder.paintNonUniformBorder] is about 20% faster than [paintBorder],
@@ -840,21 +832,12 @@
   }
 
   Set<Color> _distinctVisibleColors() {
-    final Set<Color> distinctVisibleColors = <Color>{};
-    if (top.style != BorderStyle.none) {
-      distinctVisibleColors.add(top.color);
-    }
-    if (end.style != BorderStyle.none) {
-      distinctVisibleColors.add(end.color);
-    }
-    if (bottom.style != BorderStyle.none) {
-      distinctVisibleColors.add(bottom.color);
-    }
-    if (start.style != BorderStyle.none) {
-      distinctVisibleColors.add(start.color);
-    }
-
-    return distinctVisibleColors;
+    return <Color>{
+      if (top.style != BorderStyle.none) top.color,
+      if (end.style != BorderStyle.none) end.color,
+      if (bottom.style != BorderStyle.none) bottom.color,
+      if (start.style != BorderStyle.none) start.color,
+    };
   }
 
 
diff --git a/packages/flutter/lib/src/rendering/table.dart b/packages/flutter/lib/src/rendering/table.dart
index 442bc5d..abe6e4b 100644
--- a/packages/flutter/lib/src/rendering/table.dart
+++ b/packages/flutter/lib/src/rendering/table.dart
@@ -1260,19 +1260,13 @@
       return <DiagnosticsNode>[DiagnosticsNode.message('table is empty')];
     }
 
-    final List<DiagnosticsNode> children = <DiagnosticsNode>[];
-    for (int y = 0; y < rows; y += 1) {
-      for (int x = 0; x < columns; x += 1) {
-        final int xy = x + y * columns;
-        final RenderBox? child = _children[xy];
-        final String name = 'child ($x, $y)';
-        if (child != null) {
-          children.add(child.toDiagnosticsNode(name: name));
-        } else {
-          children.add(DiagnosticsProperty<Object>(name, null, ifNull: 'is null', showSeparator: false));
-        }
-      }
-    }
-    return children;
+    return <DiagnosticsNode>[
+      for (int y = 0; y < rows; y += 1)
+        for (int x = 0; x < columns; x += 1)
+          if (_children[x + y * columns] case final RenderBox child)
+            child.toDiagnosticsNode(name: 'child ($x, $y)')
+          else
+            DiagnosticsProperty<Object>('child ($x, $y)', null, ifNull: 'is null', showSeparator: false),
+    ];
   }
 }
diff --git a/packages/flutter/lib/src/services/binding.dart b/packages/flutter/lib/src/services/binding.dart
index e6105ed..1482510 100644
--- a/packages/flutter/lib/src/services/binding.dart
+++ b/packages/flutter/lib/src/services/binding.dart
@@ -205,20 +205,15 @@
   // This is run in another isolate created by _addLicenses above.
   static List<LicenseEntry> _parseLicenses(String rawLicenses) {
     final String licenseSeparator = '\n${'-' * 80}\n';
-    final List<LicenseEntry> result = <LicenseEntry>[];
-    final List<String> licenses = rawLicenses.split(licenseSeparator);
-    for (final String license in licenses) {
-      final int split = license.indexOf('\n\n');
-      if (split >= 0) {
-        result.add(LicenseEntryWithLineBreaks(
-          license.substring(0, split).split('\n'),
-          license.substring(split + 2),
-        ));
-      } else {
-        result.add(LicenseEntryWithLineBreaks(const <String>[], license));
-      }
-    }
-    return result;
+    return <LicenseEntry>[
+      for (final String license in rawLicenses.split(licenseSeparator))
+        if (license.indexOf('\n\n') case final int split when split >= 0)
+          LicenseEntryWithLineBreaks(
+            license.substring(0, split).split('\n'),
+            license.substring(split + 2),
+          )
+        else LicenseEntryWithLineBreaks(const <String>[], license),
+    ];
   }
 
   @override
diff --git a/packages/flutter/lib/src/services/hardware_keyboard.dart b/packages/flutter/lib/src/services/hardware_keyboard.dart
index 4fea3a7..390c0fe 100644
--- a/packages/flutter/lib/src/services/hardware_keyboard.dart
+++ b/packages/flutter/lib/src/services/hardware_keyboard.dart
@@ -625,14 +625,13 @@
   }
 
   List<String> _debugPressedKeysDetails() {
-    if (_pressedKeys.isEmpty) {
-      return <String>['Empty'];
-    }
-    final List<String> details = <String>[];
-    for (final PhysicalKeyboardKey physicalKey in _pressedKeys.keys) {
-      details.add('$physicalKey: ${_pressedKeys[physicalKey]}');
-    }
-    return details;
+    return <String>[
+      if (_pressedKeys.isEmpty)
+        'Empty'
+      else
+        for (final PhysicalKeyboardKey physicalKey in _pressedKeys.keys)
+          '$physicalKey: ${_pressedKeys[physicalKey]}',
+    ];
   }
 
   /// Process a new [KeyEvent] by recording the state changes and dispatching
diff --git a/packages/flutter/lib/src/services/spell_check.dart b/packages/flutter/lib/src/services/spell_check.dart
index 24e36c3..c07e63c 100644
--- a/packages/flutter/lib/src/services/spell_check.dart
+++ b/packages/flutter/lib/src/services/spell_check.dart
@@ -180,20 +180,13 @@
       return null;
     }
 
-    List<SuggestionSpan> suggestionSpans = <SuggestionSpan>[];
-
-    for (final dynamic result in rawResults) {
-      final Map<String, dynamic> resultMap =
-        Map<String,dynamic>.from(result as Map<dynamic, dynamic>);
-      suggestionSpans.add(
+    List<SuggestionSpan> suggestionSpans = <SuggestionSpan>[
+      for (final Map<dynamic, dynamic> resultMap in rawResults.cast<Map<dynamic, dynamic>>())
         SuggestionSpan(
-          TextRange(
-            start: resultMap['startIndex'] as int,
-            end: resultMap['endIndex'] as int),
-          (resultMap['suggestions'] as List<dynamic>).cast<String>(),
-        )
-      );
-    }
+          TextRange(start: resultMap['startIndex'] as int, end: resultMap['endIndex'] as int),
+          (resultMap['suggestions'] as List<Object?>).cast<String>(),
+        ),
+    ];
 
     if (lastSavedResults != null) {
       // Merge current and previous spell check results if between requests,
diff --git a/packages/flutter/lib/src/services/text_input.dart b/packages/flutter/lib/src/services/text_input.dart
index d133d68..f46a753 100644
--- a/packages/flutter/lib/src/services/text_input.dart
+++ b/packages/flutter/lib/src/services/text_input.dart
@@ -1894,14 +1894,11 @@
         TextInput._instance._updateEditingValue(value, exclude: _PlatformTextInputControl.instance);
       case 'TextInputClient.updateEditingStateWithDeltas':
         assert(_currentConnection!._client is DeltaTextInputClient, 'You must be using a DeltaTextInputClient if TextInputConfiguration.enableDeltaModel is set to true');
-        final List<TextEditingDelta> deltas = <TextEditingDelta>[];
-
         final Map<String, dynamic> encoded = args[1] as Map<String, dynamic>;
-
-        for (final dynamic encodedDelta in encoded['deltas'] as List<dynamic>) {
-          final TextEditingDelta delta = TextEditingDelta.fromJSON(encodedDelta as Map<String, dynamic>);
-          deltas.add(delta);
-        }
+        final List<TextEditingDelta> deltas = <TextEditingDelta>[
+          for (final dynamic encodedDelta in encoded['deltas'] as List<dynamic>)
+            TextEditingDelta.fromJSON(encodedDelta as Map<String, dynamic>)
+        ];
 
         (_currentConnection!._client as DeltaTextInputClient).updateEditingValueWithDeltas(deltas);
       case 'TextInputClient.performAction':
diff --git a/packages/flutter/lib/src/widgets/basic.dart b/packages/flutter/lib/src/widgets/basic.dart
index 92b450a..0e8dd68 100644
--- a/packages/flutter/lib/src/widgets/basic.dart
+++ b/packages/flutter/lib/src/widgets/basic.dart
@@ -6686,16 +6686,11 @@
   @override
   void debugFillProperties(DiagnosticPropertiesBuilder properties) {
     super.debugFillProperties(properties);
-    final List<String> listeners = <String>[];
-    if (onEnter != null) {
-      listeners.add('enter');
-    }
-    if (onExit != null) {
-      listeners.add('exit');
-    }
-    if (onHover != null) {
-      listeners.add('hover');
-    }
+    final List<String> listeners = <String>[
+      if (onEnter != null) 'enter',
+      if (onExit != null) 'exit',
+      if (onHover != null) 'hover',
+    ];
     properties.add(IterableProperty<String>('listeners', listeners, ifEmpty: '<none>'));
     properties.add(DiagnosticsProperty<MouseCursor>('cursor', cursor, defaultValue: null));
     properties.add(DiagnosticsProperty<bool>('opaque', opaque, defaultValue: true));
@@ -7573,12 +7568,10 @@
       return items;
     }
 
-    final List<Widget> itemsWithUniqueKeys = <Widget>[];
-    int itemIndex = baseIndex;
-    for (final Widget item in items) {
-      itemsWithUniqueKeys.add(KeyedSubtree.wrap(item, itemIndex));
-      itemIndex += 1;
-    }
+    final List<Widget> itemsWithUniqueKeys = <Widget>[
+      for (final (int i, Widget item) in items.indexed)
+        KeyedSubtree.wrap(item, baseIndex + i),
+    ];
 
     assert(!debugItemsHaveDuplicateKeys(itemsWithUniqueKeys));
     return itemsWithUniqueKeys;
diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart
index c68b866..3aa856f 100644
--- a/packages/flutter/lib/src/widgets/drag_target.dart
+++ b/packages/flutter/lib/src/widgets/drag_target.dart
@@ -909,17 +909,12 @@
   Iterable<_DragTargetState<Object>> _getDragTargets(Iterable<HitTestEntry> path) {
     // Look for the RenderBoxes that corresponds to the hit target (the hit target
     // widgets build RenderMetaData boxes for us for this purpose).
-    final List<_DragTargetState<Object>> targets = <_DragTargetState<Object>>[];
-    for (final HitTestEntry entry in path) {
-      final HitTestTarget target = entry.target;
-      if (target is RenderMetaData) {
-        final dynamic metaData = target.metaData;
-        if (metaData is _DragTargetState && metaData.isExpectedDataType(data, T)) {
-          targets.add(metaData);
-        }
-      }
-    }
-    return targets;
+    return <_DragTargetState<Object>>[
+      for (final HitTestEntry entry in path)
+        if (entry.target case final RenderMetaData target)
+          if (target.metaData case final _DragTargetState<Object> metaData)
+            if (metaData.isExpectedDataType(data, T)) metaData,
+    ];
   }
 
   void _leaveAllEntered() {
diff --git a/packages/flutter/lib/src/widgets/focus_manager.dart b/packages/flutter/lib/src/widgets/focus_manager.dart
index 19e6294..24ac44e 100644
--- a/packages/flutter/lib/src/widgets/focus_manager.dart
+++ b/packages/flutter/lib/src/widgets/focus_manager.dart
@@ -2035,15 +2035,11 @@
     // Check to see if any of the early handlers handle the key. If so, then
     // return early.
     if (_earlyKeyEventHandlers.isNotEmpty) {
-      final List<KeyEventResult> results = <KeyEventResult>[];
-      // Copy the list before iteration to prevent problems if the list gets
-      // modified during iteration.
-      final List<OnKeyEventCallback> iterationList = _earlyKeyEventHandlers.toList();
-      for (final OnKeyEventCallback callback in iterationList) {
-        for (final KeyEvent event in message.events) {
-          results.add(callback(event));
-        }
-      }
+      final List<KeyEventResult> results = <KeyEventResult>[
+        // Make a copy to prevent problems if the list is modified during iteration.
+        for (final OnKeyEventCallback callback in _earlyKeyEventHandlers.toList())
+          for (final KeyEvent event in message.events) callback(event),
+      ];
       final KeyEventResult result = combineKeyEventResults(results);
       switch (result) {
         case KeyEventResult.ignored:
@@ -2067,15 +2063,13 @@
       FocusManager.instance.primaryFocus!,
       ...FocusManager.instance.primaryFocus!.ancestors,
     ]) {
-      final List<KeyEventResult> results = <KeyEventResult>[];
-      if (node.onKeyEvent != null) {
-        for (final KeyEvent event in message.events) {
-          results.add(node.onKeyEvent!(node, event));
-        }
-      }
-      if (node.onKey != null && message.rawEvent != null) {
-        results.add(node.onKey!(node, message.rawEvent!));
-      }
+      final List<KeyEventResult> results = <KeyEventResult>[
+        if (node.onKeyEvent != null)
+          for (final KeyEvent event in message.events)
+            node.onKeyEvent!(node, event),
+        if (node.onKey != null && message.rawEvent != null)
+          node.onKey!(node, message.rawEvent!),
+      ];
       final KeyEventResult result = combineKeyEventResults(results);
       switch (result) {
         case KeyEventResult.ignored:
@@ -2095,15 +2089,11 @@
 
     // Check to see if any late key event handlers want to handle the event.
     if (!handled && _lateKeyEventHandlers.isNotEmpty) {
-      final List<KeyEventResult> results = <KeyEventResult>[];
-      // Copy the list before iteration to prevent problems if the list gets
-      // modified during iteration.
-      final List<OnKeyEventCallback> iterationList = _lateKeyEventHandlers.toList();
-      for (final OnKeyEventCallback callback in iterationList) {
-        for (final KeyEvent event in message.events) {
-          results.add(callback(event));
-        }
-      }
+      final List<KeyEventResult> results = <KeyEventResult>[
+        // Make a copy to prevent problems if the list is modified during iteration.
+        for (final OnKeyEventCallback callback in _lateKeyEventHandlers.toList())
+          for (final KeyEvent event in message.events) callback(event),
+      ];
       final KeyEventResult result = combineKeyEventResults(results);
       switch (result) {
         case KeyEventResult.ignored:
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index f6fd1a0..f458625 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -3194,14 +3194,11 @@
                   keyStringCount[key] = 1;
                 }
               }
-              final List<String> keyLabels = <String>[];
-              keyStringCount.forEach((String key, int count) {
-                if (count == 1) {
-                  keyLabels.add(key);
-                } else {
-                  keyLabels.add('$key ($count different affected keys had this toString representation)');
-                }
-              });
+              final List<String> keyLabels = <String>[
+                for (final MapEntry<String, int>(:String key, value: int count) in keyStringCount.entries)
+                  if (count == 1) key
+                  else '$key ($count different affected keys had this toString representation)',
+              ];
               final Iterable<Element> elements = _debugElementsThatWillNeedToBeRebuiltDueToGlobalKeyShenanigans!.keys;
               final Map<String, int> elementStringCount = HashMap<String, int>();
               for (final String element in elements.map<String>((Element element) => element.toString())) {
@@ -3211,14 +3208,11 @@
                   elementStringCount[element] = 1;
                 }
               }
-              final List<String> elementLabels = <String>[];
-              elementStringCount.forEach((String element, int count) {
-                if (count == 1) {
-                  elementLabels.add(element);
-                } else {
-                  elementLabels.add('$element ($count different affected elements had this toString representation)');
-                }
-              });
+              final List<String> elementLabels = <String>[
+                for (final MapEntry<String, int>(key: String element, value: int count) in elementStringCount.entries)
+                  if (count == 1) element
+                  else '$element ($count different affected elements had this toString representation)',
+              ];
               assert(keyLabels.isNotEmpty);
               final String the = keys.length == 1 ? ' the' : '';
               final String s = keys.length == 1 ? '' : 's';
diff --git a/packages/flutter/lib/src/widgets/platform_menu_bar.dart b/packages/flutter/lib/src/widgets/platform_menu_bar.dart
index 687894d..4f74381 100644
--- a/packages/flutter/lib/src/widgets/platform_menu_bar.dart
+++ b/packages/flutter/lib/src/widgets/platform_menu_bar.dart
@@ -666,22 +666,12 @@
     PlatformMenuDelegate delegate, {
     required MenuItemSerializableIdGenerator getId,
   }) {
-    final List<Map<String, Object?>> result = <Map<String, Object?>>[];
-    result.add(<String, Object?>{
-      _kIdKey: getId(group),
-      _kIsDividerKey: true,
-    });
-    for (final PlatformMenuItem item in group.members) {
-      result.addAll(item.toChannelRepresentation(
-        delegate,
-        getId: getId,
-      ));
-    }
-    result.add(<String, Object?>{
-      _kIdKey: getId(group),
-      _kIsDividerKey: true,
-    });
-    return result;
+    return <Map<String, Object?>>[
+      <String, Object?>{_kIdKey: getId(group), _kIsDividerKey: true},
+      for (final PlatformMenuItem item in group.members)
+        ...item.toChannelRepresentation(delegate, getId: getId),
+      <String, Object?>{_kIdKey: getId(group), _kIsDividerKey: true},
+    ];
   }
 
   @override
diff --git a/packages/flutter/lib/src/widgets/scroll_position.dart b/packages/flutter/lib/src/widgets/scroll_position.dart
index 5a995b2..eb6ae9b 100644
--- a/packages/flutter/lib/src/widgets/scroll_position.dart
+++ b/packages/flutter/lib/src/widgets/scroll_position.dart
@@ -729,13 +729,10 @@
       AxisDirection.right => (SemanticsAction.scrollLeft, SemanticsAction.scrollRight),
     };
 
-    final Set<SemanticsAction> actions = <SemanticsAction>{};
-    if (pixels > minScrollExtent) {
-      actions.add(backward);
-    }
-    if (pixels < maxScrollExtent) {
-      actions.add(forward);
-    }
+    final Set<SemanticsAction> actions = <SemanticsAction>{
+      if (pixels > minScrollExtent) backward,
+      if (pixels < maxScrollExtent) forward,
+    };
 
     if (setEquals<SemanticsAction>(actions, _semanticActions)) {
       return;
diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart
index 780c3ed..74f27b9 100644
--- a/packages/flutter/lib/src/widgets/scrollable.dart
+++ b/packages/flutter/lib/src/widgets/scrollable.dart
@@ -2350,23 +2350,22 @@
     ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicit,
     RenderObject? targetRenderObject,
   }) {
-    final List<Future<void>> newFutures = <Future<void>>[];
-
-    newFutures.add(position.ensureVisible(
-      object,
-      alignment: alignment,
-      duration: duration,
-      curve: curve,
-      alignmentPolicy: alignmentPolicy,
-    ));
-
-    newFutures.add(verticalScrollable.position.ensureVisible(
-      object,
-      alignment: alignment,
-      duration: duration,
-      curve: curve,
-      alignmentPolicy: alignmentPolicy,
-    ));
+    final List<Future<void>> newFutures = <Future<void>>[
+      position.ensureVisible(
+        object,
+        alignment: alignment,
+        duration: duration,
+        curve: curve,
+        alignmentPolicy: alignmentPolicy,
+      ),
+      verticalScrollable.position.ensureVisible(
+        object,
+        alignment: alignment,
+        duration: duration,
+        curve: curve,
+        alignmentPolicy: alignmentPolicy,
+      ),
+    ];
 
     return (newFutures, verticalScrollable);
   }
diff --git a/packages/flutter/lib/src/widgets/selectable_region.dart b/packages/flutter/lib/src/widgets/selectable_region.dart
index 538267f..09f5b35 100644
--- a/packages/flutter/lib/src/widgets/selectable_region.dart
+++ b/packages/flutter/lib/src/widgets/selectable_region.dart
@@ -2213,13 +2213,10 @@
   /// Copies the selected contents of all [Selectable]s.
   @override
   SelectedContent? getSelectedContent() {
-    final List<SelectedContent> selections = <SelectedContent>[];
-    for (final Selectable selectable in selectables) {
-      final SelectedContent? data = selectable.getSelectedContent();
-      if (data != null) {
-        selections.add(data);
-      }
-    }
+    final List<SelectedContent> selections = <SelectedContent>[
+      for (final Selectable selectable in selectables)
+        if (selectable.getSelectedContent() case final SelectedContent data) data,
+    ];
     if (selections.isEmpty) {
       return null;
     }
diff --git a/packages/flutter/lib/src/widgets/tap_region.dart b/packages/flutter/lib/src/widgets/tap_region.dart
index f4bdf8d..d00ec9d 100644
--- a/packages/flutter/lib/src/widgets/tap_region.dart
+++ b/packages/flutter/lib/src/widgets/tap_region.dart
@@ -254,18 +254,14 @@
     // groups of regions that were not hit.
     final Set<RenderTapRegion> hitRegions =
         _getRegionsHit(_registeredRegions, result.path).cast<RenderTapRegion>().toSet();
-    final Set<RenderTapRegion> insideRegions = <RenderTapRegion>{};
     assert(_tapRegionDebug('Tap event hit ${hitRegions.length} descendants.'));
 
-    for (final RenderTapRegion region in hitRegions) {
-      if (region.groupId == null) {
-        insideRegions.add(region);
-        continue;
-      }
-      // Add all grouped regions to the insideRegions so that groups act as a
-      // single region.
-      insideRegions.addAll(_groupIdToRegions[region.groupId]!);
-    }
+    final Set<RenderTapRegion> insideRegions = <RenderTapRegion>{
+      for (final RenderTapRegion region in hitRegions)
+        if (region.groupId == null) region
+        // Adding all grouped regions, so they act as a single region.
+        else ..._groupIdToRegions[region.groupId]!,
+    };
     // If they're not inside, then they're outside.
     final Set<RenderTapRegion> outsideRegions = _registeredRegions.difference(insideRegions);
 
@@ -292,15 +288,12 @@
   }
 
   // Returns the registered regions that are in the hit path.
-  Iterable<HitTestTarget> _getRegionsHit(Set<RenderTapRegion> detectors, Iterable<HitTestEntry> hitTestPath) {
-    final Set<HitTestTarget> hitRegions = <HitTestTarget>{};
-    for (final HitTestEntry<HitTestTarget> entry in hitTestPath) {
-      final HitTestTarget target = entry.target;
-      if (_registeredRegions.contains(target)) {
-        hitRegions.add(target);
-      }
-    }
-    return hitRegions;
+  Set<HitTestTarget> _getRegionsHit(Set<RenderTapRegion> detectors, Iterable<HitTestEntry> hitTestPath) {
+    return <HitTestTarget>{
+      for (final HitTestEntry<HitTestTarget> entry in hitTestPath)
+        if (entry.target case final HitTestTarget target)
+          if (_registeredRegions.contains(target)) target,
+    };
   }
 }
 
diff --git a/packages/flutter/lib/src/widgets/view.dart b/packages/flutter/lib/src/widgets/view.dart
index ad7ab7f..728a09d 100644
--- a/packages/flutter/lib/src/widgets/view.dart
+++ b/packages/flutter/lib/src/widgets/view.dart
@@ -699,17 +699,14 @@
 
   @override
   List<DiagnosticsNode> debugDescribeChildren() {
-    final List<DiagnosticsNode> children = <DiagnosticsNode>[];
-    if (_childElement != null) {
-      children.add(_childElement!.toDiagnosticsNode());
-    }
-    for (int i = 0; i < _viewElements.length; i++) {
-      children.add(_viewElements[i].toDiagnosticsNode(
-        name: 'view ${i + 1}',
-        style: DiagnosticsTreeStyle.offstage,
-      ));
-    }
-    return children;
+    return <DiagnosticsNode>[
+      if (_childElement != null) _childElement!.toDiagnosticsNode(),
+      for (int i = 0; i < _viewElements.length; i++)
+        _viewElements[i].toDiagnosticsNode(
+          name: 'view ${i + 1}',
+          style: DiagnosticsTreeStyle.offstage,
+        ),
+    ];
   }
 }
 
diff --git a/packages/flutter/lib/src/widgets/widget_inspector.dart b/packages/flutter/lib/src/widgets/widget_inspector.dart
index d578e59..e04c121 100644
--- a/packages/flutter/lib/src/widgets/widget_inspector.dart
+++ b/packages/flutter/lib/src/widgets/widget_inspector.dart
@@ -960,17 +960,11 @@
     registerServiceExtension(
       name: name,
       callback: (Map<String, String> parameters) async {
-        final List<String> args = <String>[];
-        int index = 0;
-        while (true) {
-          final String name = 'arg$index';
-          if (parameters.containsKey(name)) {
-            args.add(parameters[name]!);
-          } else {
-            break;
-          }
-          index++;
-        }
+        int index;
+        final List<String> args = <String>[
+          for (index = 0; parameters['arg$index'] != null; index++)
+            parameters['arg$index']!,
+        ];
         // Verify that the only arguments other than perhaps 'isolateId' are
         // arguments we have already handled.
         assert(index == parameters.length || (index == parameters.length - 1 && parameters.containsKey('isolateId')));
@@ -3408,27 +3402,16 @@
   final String? name;
 
   Map<String, Object?> toJsonMap() {
-    final Map<String, Object?> json = <String, Object?>{
+    return <String, Object?>{
       'file': file,
       'line': line,
       'column': column,
+      if (name != null) 'name': name,
     };
-    if (name != null) {
-      json['name'] = name;
-    }
-    return json;
   }
 
   @override
-  String toString() {
-    final List<String> parts = <String>[];
-    if (name != null) {
-      parts.add(name!);
-    }
-    parts.add(file);
-    parts..add('$line')..add('$column');
-    return parts.join(':');
-  }
+  String toString() => <String>[if (name != null) name!, file, '$line', '$column'].join(':');
 }
 
 bool _isDebugCreator(DiagnosticsNode node) => node is DiagnosticsDebugCreator;
diff --git a/packages/flutter/test/cupertino/text_selection_toolbar_test.dart b/packages/flutter/test/cupertino/text_selection_toolbar_test.dart
index 5d9717d..3fe5070 100644
--- a/packages/flutter/test/cupertino/text_selection_toolbar_test.dart
+++ b/packages/flutter/test/cupertino/text_selection_toolbar_test.dart
@@ -204,12 +204,7 @@
 
     // Adding 7 more children overflows onto a third page.
     setState(() {
-      children.add(const TestBox());
-      children.add(const TestBox());
-      children.add(const TestBox());
-      children.add(const TestBox());
-      children.add(const TestBox());
-      children.add(const TestBox());
+      children.addAll(List<TestBox>.filled(6, const TestBox()));
     });
     await tester.pumpAndSettle();
     expect(find.byType(TestBox), findsNWidgets(7));
diff --git a/packages/flutter/test/material/spell_check_suggestions_toolbar_test.dart b/packages/flutter/test/material/spell_check_suggestions_toolbar_test.dart
index 66c668f..eafa7f8 100644
--- a/packages/flutter/test/material/spell_check_suggestions_toolbar_test.dart
+++ b/packages/flutter/test/material/spell_check_suggestions_toolbar_test.dart
@@ -17,24 +17,15 @@
 
   /// Builds test button items for each of the suggestions provided.
   List<ContextMenuButtonItem> buildSuggestionButtons(List<String> suggestions) {
-    final List<ContextMenuButtonItem> buttonItems = <ContextMenuButtonItem>[];
-
-    for (final String suggestion in suggestions) {
-      buttonItems.add(ContextMenuButtonItem(
-        onPressed: () {},
-        label: suggestion,
-      ));
-    }
-
-    final ContextMenuButtonItem deleteButton =
+    return <ContextMenuButtonItem>[
+      for (final String suggestion in suggestions)
+        ContextMenuButtonItem(onPressed: () {}, label: suggestion),
       ContextMenuButtonItem(
         onPressed: () {},
         type: ContextMenuButtonType.delete,
         label: 'DELETE',
-    );
-    buttonItems.add(deleteButton);
-
-    return buttonItems;
+      ),
+    ];
   }
 
   /// Finds the container of the [SpellCheckSuggestionsToolbar] so that
diff --git a/packages/flutter/test/widgets/slivers_test.dart b/packages/flutter/test/widgets/slivers_test.dart
index 63868ff..4eda82d 100644
--- a/packages/flutter/test/widgets/slivers_test.dart
+++ b/packages/flutter/test/widgets/slivers_test.dart
@@ -338,14 +338,10 @@
   testWidgets('SliverFixedExtentList handles underflow when its children changes', (WidgetTester tester) async {
     final List<String> items = <String>['1', '2', '3', '4', '5', '6'];
     final List<String> initializedChild = <String>[];
-    List<Widget> children = <Widget>[];
-    for (final String item in items) {
-      children.add(
-          StateInitSpy(
-            item, () => initializedChild.add(item), key: ValueKey<String>(item),
-          ),
-      );
-    }
+    List<Widget> children = <Widget>[
+      for (final String item in items)
+        StateInitSpy(item, () => initializedChild.add(item), key: ValueKey<String>(item)),
+    ];
     final ScrollController controller = ScrollController(initialScrollOffset: 5400);
     addTearDown(controller.dispose);
 
diff --git a/packages/integration_test/lib/common.dart b/packages/integration_test/lib/common.dart
index e148851..ff2906c 100644
--- a/packages/integration_test/lib/common.dart
+++ b/packages/integration_test/lib/common.dart
@@ -106,16 +106,10 @@
 
   /// Create a list of Strings from [_failureDetails].
   List<String> _failureDetailsAsString() {
-    final List<String> list = <String>[];
-    if (_failureDetails == null || _failureDetails.isEmpty) {
-      return list;
-    }
-
-    for (final Failure failure in _failureDetails) {
-      list.add(failure.toJson());
-    }
-
-    return list;
+    return <String>[
+      if (_failureDetails != null)
+        for (final Failure failure in _failureDetails) failure.toJson(),
+    ];
   }
 
   /// Creates a [Failure] list using a json response.
