Reland implicit-casts: false (#47431)

diff --git a/analysis_options.yaml b/analysis_options.yaml
index d51b2bf..91d7df8 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -20,6 +20,7 @@
 
 analyzer:
   strong-mode:
+    implicit-casts: false
     implicit-dynamic: false
   errors:
     # treat missing required parameters as a warning (not a hint)
diff --git a/dev/devicelab/bin/tasks/fast_scroll_large_images__memory.dart b/dev/devicelab/bin/tasks/fast_scroll_large_images__memory.dart
index b3e2c9e..7cc7cd2 100644
--- a/dev/devicelab/bin/tasks/fast_scroll_large_images__memory.dart
+++ b/dev/devicelab/bin/tasks/fast_scroll_large_images__memory.dart
@@ -20,7 +20,7 @@
         );
 
   @override
-  AndroidDevice get device => super.device;
+  AndroidDevice get device => super.device as AndroidDevice;
 
   @override
   int get iterationCount => 5;
diff --git a/dev/integration_tests/flutter_driver_screenshot_test/test_driver/driver_screenshot_tester.dart b/dev/integration_tests/flutter_driver_screenshot_test/test_driver/driver_screenshot_tester.dart
index 93b2063..a08c862 100644
--- a/dev/integration_tests/flutter_driver_screenshot_test/test_driver/driver_screenshot_tester.dart
+++ b/dev/integration_tests/flutter_driver_screenshot_test/test_driver/driver_screenshot_tester.dart
@@ -4,10 +4,11 @@
 
 import 'dart:async';
 import 'dart:io' show File;
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter_driver/flutter_driver.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as path;
-import 'package:flutter_driver/flutter_driver.dart';
-import 'package:collection/collection.dart';
 
 const String _kPathParent = 'test_driver/goldens/';
 
@@ -43,8 +44,7 @@
   Future<bool> compareScreenshots(List<int> screenshot) async {
     final File file = File(_getImageFilePath());
     final List<int> matcher = await file.readAsBytes();
-    final Function listEquals = const ListEquality<int>().equals;
-    return listEquals(screenshot, matcher);
+    return listEquals<int>(screenshot, matcher);
   }
 
   /// Returns a bytes representation of a screenshot on the current screen.
diff --git a/dev/tools/localization/bin/gen_l10n.dart b/dev/tools/localization/bin/gen_l10n.dart
index 06a46db..31fb572 100644
--- a/dev/tools/localization/bin/gen_l10n.dart
+++ b/dev/tools/localization/bin/gen_l10n.dart
@@ -53,10 +53,10 @@
     exit(0);
   }
 
-  final String arbPathString = results['arb-dir'];
-  final String outputFileString = results['output-localization-file'];
-  final String templateArbFileName = results['template-arb-file'];
-  final String classNameString = results['output-class'];
+  final String arbPathString = results['arb-dir'] as String;
+  final String outputFileString = results['output-localization-file'] as String;
+  final String templateArbFileName = results['template-arb-file'] as String;
+  final String classNameString = results['output-class'] as String;
 
   const local.LocalFileSystem fs = local.LocalFileSystem();
   final LocalizationsGenerator localizationsGenerator = LocalizationsGenerator(fs);
diff --git a/dev/tools/localization/gen_l10n.dart b/dev/tools/localization/gen_l10n.dart
index 3bab7be..7c6944f 100644
--- a/dev/tools/localization/gen_l10n.dart
+++ b/dev/tools/localization/gen_l10n.dart
@@ -214,10 +214,7 @@
   's',
 };
 
-bool _isDateParameter(dynamic placeholderValue) {
-  return placeholderValue is Map<String, dynamic> &&
-    placeholderValue['type'] == 'DateTime';
-}
+bool _isDateParameter(Map<String, dynamic> placeholderValue) => placeholderValue['type'] == 'DateTime';
 
 bool _dateParameterIsValid(Map<String, dynamic> placeholderValue, String placeholder) {
   if (allowableDateFormats.contains(placeholderValue['format']))
@@ -260,6 +257,7 @@
     for (String placeholder in placeholders.keys) {
       final dynamic value = placeholders[placeholder];
       if (
+        value is Map<String, dynamic> &&
         _isDateParameter(value) &&
         _containsFormatKey(value, placeholder) &&
         _dateParameterIsValid(value, placeholder)
@@ -291,6 +289,7 @@
         for (String placeholder in placeholders.keys) {
           final dynamic value = placeholders[placeholder];
           if (
+            value is Map<String, dynamic> &&
             _isDateParameter(value) &&
             _containsFormatKey(value, placeholder) &&
             _dateParameterIsValid(value, placeholder)
@@ -315,7 +314,7 @@
     final Map<String, dynamic> placeholders = attributesMap['placeholders'] as Map<String, dynamic>;
     for (String placeholder in placeholders.keys) {
       final dynamic value = placeholders[placeholder];
-      if (_isDateParameter(value)) {
+      if (value is Map<String, dynamic> && _isDateParameter(value)) {
         message = message.replaceAll('{$placeholder}', '\$${placeholder}String');
       } else {
         message = message.replaceAll('{$placeholder}', '\$$placeholder');
@@ -599,8 +598,8 @@
     for (File file in fileSystemEntityList) {
       final String filePath = file.path;
       if (arbFilenameRE.hasMatch(filePath)) {
-        final Map<String, dynamic> arbContents = json.decode(file.readAsStringSync());
-        String localeString = arbContents['@@locale'];
+        final Map<String, dynamic> arbContents = json.decode(file.readAsStringSync()) as Map<String, dynamic>;
+        String localeString = arbContents['@@locale'] as String;
         if (localeString == null) {
           final RegExpMatch arbFileMatch = arbFilenameLocaleRE.firstMatch(filePath);
           if (arbFileMatch == null) {
@@ -653,7 +652,7 @@
   void generateClassMethods() {
     Map<String, dynamic> bundle;
     try {
-      bundle = json.decode(templateArbFile.readAsStringSync());
+      bundle = json.decode(templateArbFile.readAsStringSync()) as Map<String, dynamic>;
     } on FileSystemException catch (e) {
       throw FileSystemException('Unable to read input arb file: $e');
     } on FormatException catch (e) {
@@ -669,7 +668,7 @@
           'Invalid key format: $key \n It has to be in camel case, cannot start '
           'with a number, and cannot contain non-alphanumeric characters.'
         );
-      if (pluralValueRE.hasMatch(bundle[key]))
+      if (pluralValueRE.hasMatch(bundle[key] as String))
         classMethods.add(genPluralMethod(bundle, key));
       else
         classMethods.add(genSimpleMethod(bundle, key));
diff --git a/packages/flutter/lib/src/gestures/mouse_tracking.dart b/packages/flutter/lib/src/gestures/mouse_tracking.dart
index ba309bf..563b12b 100644
--- a/packages/flutter/lib/src/gestures/mouse_tracking.dart
+++ b/packages/flutter/lib/src/gestures/mouse_tracking.dart
@@ -314,7 +314,7 @@
     final int device = state.device;
     return (_mouseStates.containsKey(device) && _trackedAnnotations.isNotEmpty)
       ? LinkedHashSet<MouseTrackerAnnotation>.from(annotationFinder(globalPosition))
-      : <MouseTrackerAnnotation>{};
+      : <MouseTrackerAnnotation>{} as LinkedHashSet<MouseTrackerAnnotation>;
   }
 
   static bool get _duringBuildPhase {
diff --git a/packages/flutter/lib/src/material/reorderable_list.dart b/packages/flutter/lib/src/material/reorderable_list.dart
index 8dba05b..6b261cf 100644
--- a/packages/flutter/lib/src/material/reorderable_list.dart
+++ b/packages/flutter/lib/src/material/reorderable_list.dart
@@ -530,7 +530,7 @@
           return _dragging == toAccept && toAccept != toWrap.key;
         },
         onAccept: (Key accepted) { },
-        onLeave: (Key leaving) { },
+        onLeave: (Object leaving) { },
       );
     });
   }
diff --git a/packages/flutter/lib/src/painting/edge_insets.dart b/packages/flutter/lib/src/painting/edge_insets.dart
index 4c2b61a..63504c8 100644
--- a/packages/flutter/lib/src/painting/edge_insets.dart
+++ b/packages/flutter/lib/src/painting/edge_insets.dart
@@ -162,12 +162,12 @@
   /// or equal to `min`, and less than or equal to `max`.
   EdgeInsetsGeometry clamp(EdgeInsetsGeometry min, EdgeInsetsGeometry max) {
     return _MixedEdgeInsets.fromLRSETB(
-      _left.clamp(min._left, max._left),
-      _right.clamp(min._right, max._right),
-      _start.clamp(min._start, max._start),
-      _end.clamp(min._end, max._end),
-      _top.clamp(min._top, max._top),
-      _bottom.clamp(min._bottom, max._bottom),
+      _left.clamp(min._left, max._left) as double,
+      _right.clamp(min._right, max._right) as double,
+      _start.clamp(min._start, max._start) as double,
+      _end.clamp(min._end, max._end) as double,
+      _top.clamp(min._top, max._top) as double,
+      _bottom.clamp(min._bottom, max._bottom) as double,
     );
   }
 
diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart
index a9bde83..0a7cba2 100644
--- a/packages/flutter/lib/src/rendering/layer.dart
+++ b/packages/flutter/lib/src/rendering/layer.dart
@@ -672,9 +672,9 @@
     if (hoverAnnotation == null || !rect.contains(localPosition)) {
       return false;
     }
-    if (MouseTrackerAnnotation == S) {
+    if (S == MouseTrackerAnnotation) {
       final Object untypedValue = hoverAnnotation;
-      final S typedValue = untypedValue;
+      final S typedValue = untypedValue as S;
       result.add(AnnotationEntry<S>(
         annotation: typedValue,
         localPosition: localPosition,
diff --git a/packages/flutter/lib/src/rendering/proxy_sliver.dart b/packages/flutter/lib/src/rendering/proxy_sliver.dart
index ad1f7a1..4c1ac24 100644
--- a/packages/flutter/lib/src/rendering/proxy_sliver.dart
+++ b/packages/flutter/lib/src/rendering/proxy_sliver.dart
@@ -7,6 +7,7 @@
 import 'package:flutter/foundation.dart';
 import 'package:vector_math/vector_math_64.dart';
 
+import 'layer.dart';
 import 'object.dart';
 import 'sliver.dart';
 
@@ -71,7 +72,7 @@
   @override
   void applyPaintTransform(RenderObject child, Matrix4 transform) {
     assert(child != null);
-    final SliverPhysicalParentData childParentData = child.parentData;
+    final SliverPhysicalParentData childParentData = child.parentData as SliverPhysicalParentData;
     childParentData.applyPaintTransform(transform);
   }
 }
@@ -169,7 +170,7 @@
         offset,
         _alpha,
         _paintWithOpacity,
-        oldLayer: layer,
+        oldLayer: layer as OpacityLayer,
       );
     }
   }
diff --git a/packages/flutter/lib/src/widgets/binding.dart b/packages/flutter/lib/src/widgets/binding.dart
index 4965249..1fba2f5 100644
--- a/packages/flutter/lib/src/widgets/binding.dart
+++ b/packages/flutter/lib/src/widgets/binding.dart
@@ -332,7 +332,7 @@
       registerServiceExtension(
         name: 'fastReassemble',
         callback: (Map<String, Object> params) async {
-          final String className = params['class'];
+          final String className = params['class'] as String;
           void markElementsDirty(Element element) {
             if (element == null) {
               return;
diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart
index f504e9b..1365be2 100644
--- a/packages/flutter/lib/src/widgets/drag_target.dart
+++ b/packages/flutter/lib/src/widgets/drag_target.dart
@@ -48,7 +48,7 @@
 /// Signature for when a [Draggable] leaves a [DragTarget].
 ///
 /// Used by [DragTarget.onLeave].
-typedef DragTargetLeave<T> = void Function(T data);
+typedef DragTargetLeave = void Function(Object data);
 
 /// Where the [Draggable] should be anchored during a drag.
 enum DragAnchor {
@@ -502,7 +502,7 @@
 
   /// Called when a given piece of data being dragged over this target leaves
   /// the target.
-  final DragTargetLeave<T> onLeave;
+  final DragTargetLeave onLeave;
 
   @override
   _DragTargetState<T> createState() => _DragTargetState<T>();
@@ -514,13 +514,12 @@
 
 class _DragTargetState<T> extends State<DragTarget<T>> {
   final List<_DragAvatar<T>> _candidateAvatars = <_DragAvatar<T>>[];
-  final List<_DragAvatar<dynamic>> _rejectedAvatars = <_DragAvatar<dynamic>>[];
+  final List<_DragAvatar<Object>> _rejectedAvatars = <_DragAvatar<Object>>[];
 
-  bool didEnter(_DragAvatar<dynamic> avatar) {
+  bool didEnter(_DragAvatar<Object> avatar) {
     assert(!_candidateAvatars.contains(avatar));
     assert(!_rejectedAvatars.contains(avatar));
-    final dynamic data = avatar.data;
-    if (data is T && (widget.onWillAccept == null || widget.onWillAccept(data))) {
+    if (avatar is _DragAvatar<T> && (widget.onWillAccept == null || widget.onWillAccept(avatar.data))) {
       setState(() {
         _candidateAvatars.add(avatar);
       });
@@ -533,7 +532,7 @@
     }
   }
 
-  void didLeave(_DragAvatar<dynamic> avatar) {
+  void didLeave(_DragAvatar<Object> avatar) {
     assert(_candidateAvatars.contains(avatar) || _rejectedAvatars.contains(avatar));
     if (!mounted)
       return;
@@ -545,7 +544,7 @@
       widget.onLeave(avatar.data);
   }
 
-  void didDrop(_DragAvatar<dynamic> avatar) {
+  void didDrop(_DragAvatar<Object> avatar) {
     assert(_candidateAvatars.contains(avatar));
     if (!mounted)
       return;
@@ -553,7 +552,7 @@
       _candidateAvatars.remove(avatar);
     });
     if (widget.onAccept != null)
-      widget.onAccept(avatar.data);
+      widget.onAccept(avatar.data as T);
   }
 
   @override
@@ -562,7 +561,7 @@
     return MetaData(
       metaData: this,
       behavior: HitTestBehavior.translucent,
-      child: widget.builder(context, _mapAvatarsToData<T>(_candidateAvatars), _mapAvatarsToData<dynamic>(_rejectedAvatars)),
+      child: widget.builder(context, _mapAvatarsToData<T>(_candidateAvatars), _mapAvatarsToData<Object>(_rejectedAvatars)),
     );
   }
 }
diff --git a/packages/flutter/test/widgets/draggable_test.dart b/packages/flutter/test/widgets/draggable_test.dart
index 2c00324..3a9023a 100644
--- a/packages/flutter/test/widgets/draggable_test.dart
+++ b/packages/flutter/test/widgets/draggable_test.dart
@@ -90,13 +90,21 @@
             builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
               return Container(height: 100.0, child: const Text('Target 1'));
             },
-            onLeave: (int data) => leftBehind['Target 1'] = leftBehind['Target 1'] + data,
+            onLeave: (Object data) {
+              if (data is int) {
+                leftBehind['Target 1'] = leftBehind['Target 1'] + data;
+              }
+            },
           ),
           DragTarget<int>(
             builder: (BuildContext context, List<int> data, List<dynamic> rejects) {
               return Container(height: 100.0, child: const Text('Target 2'));
             },
-            onLeave: (int data) => leftBehind['Target 2'] = leftBehind['Target 2'] + data,
+            onLeave: (Object data) {
+              if (data is int) {
+                leftBehind['Target 2'] = leftBehind['Target 2'] + data;
+              }
+            },
           ),
         ],
       ),
diff --git a/packages/flutter_driver/analysis_options.yaml b/packages/flutter_driver/analysis_options.yaml
deleted file mode 100644
index a08bda2..0000000
--- a/packages/flutter_driver/analysis_options.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Override the parent analysis_options until all the repo has implicit-casts: false
-
-include: ../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
diff --git a/packages/flutter_goldens/analysis_options.yaml b/packages/flutter_goldens/analysis_options.yaml
index b9d57a9..b8591ca 100644
--- a/packages/flutter_goldens/analysis_options.yaml
+++ b/packages/flutter_goldens/analysis_options.yaml
@@ -2,8 +2,3 @@
 # the ones from above, which include the `public_member_api_docs` rule).
 
 include: ../../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
diff --git a/packages/flutter_goldens_client/analysis_options.yaml b/packages/flutter_goldens_client/analysis_options.yaml
index b9d57a9..b8591ca 100644
--- a/packages/flutter_goldens_client/analysis_options.yaml
+++ b/packages/flutter_goldens_client/analysis_options.yaml
@@ -2,8 +2,3 @@
 # the ones from above, which include the `public_member_api_docs` rule).
 
 include: ../../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
diff --git a/packages/flutter_localizations/analysis_options.yaml b/packages/flutter_localizations/analysis_options.yaml
deleted file mode 100644
index 2344f5a..0000000
--- a/packages/flutter_localizations/analysis_options.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-# Override the parent analysis_options until all the repo has implicit-casts: false
-
-include: ../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
-
-linter:
-  rules:
-    avoid_as: false
diff --git a/packages/flutter_test/analysis_options.yaml b/packages/flutter_test/analysis_options.yaml
deleted file mode 100644
index 3de2cb2..0000000
--- a/packages/flutter_test/analysis_options.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-include: ../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
diff --git a/packages/flutter_tools/analysis_options.yaml b/packages/flutter_tools/analysis_options.yaml
index 9d30761..525929f 100644
--- a/packages/flutter_tools/analysis_options.yaml
+++ b/packages/flutter_tools/analysis_options.yaml
@@ -3,11 +3,6 @@
 
 include: ../../analysis_options.yaml
 
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
-
 linter:
   rules:
     unawaited_futures: true
diff --git a/packages/flutter_web_plugins/analysis_options.yaml b/packages/flutter_web_plugins/analysis_options.yaml
deleted file mode 100644
index a08bda2..0000000
--- a/packages/flutter_web_plugins/analysis_options.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Override the parent analysis_options until all the repo has implicit-casts: false
-
-include: ../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false
diff --git a/packages/fuchsia_remote_debug_protocol/analysis_options.yaml b/packages/fuchsia_remote_debug_protocol/analysis_options.yaml
deleted file mode 100644
index a08bda2..0000000
--- a/packages/fuchsia_remote_debug_protocol/analysis_options.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Override the parent analysis_options until all the repo has implicit-casts: false
-
-include: ../analysis_options.yaml
-
-analyzer:
-  strong-mode:
-    implicit-casts: false
-    implicit-dynamic: false