diff --git a/packages/google_maps_flutter/google_maps_flutter/AUTHORS b/packages/google_maps_flutter/google_maps_flutter/AUTHORS
index 493a0b4..9f1b53e 100644
--- a/packages/google_maps_flutter/google_maps_flutter/AUTHORS
+++ b/packages/google_maps_flutter/google_maps_flutter/AUTHORS
@@ -64,3 +64,4 @@
 Anton Borries <mail@antonborri.es>
 Alex Li <google@alexv525.com>
 Rahul Raj <64.rahulraj@gmail.com>
+Taha Tesser <tesser@gmail.com>
diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index b9178a7..565bf84 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,7 +1,8 @@
-## NEXT
+## 2.1.2
 
 * Removes dependencies from `pubspec.yaml` that are only needed in `example/pubspec.yaml`
 * Updates Android compileSdkVersion to 31.
+* Internal code cleanup for stricter analysis options.
 
 ## 2.1.1
 
diff --git a/packages/google_maps_flutter/google_maps_flutter/analysis_options.yaml b/packages/google_maps_flutter/google_maps_flutter/analysis_options.yaml
deleted file mode 100644
index 5aeb4e7..0000000
--- a/packages/google_maps_flutter/google_maps_flutter/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../../analysis_options_legacy.yaml
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_map_inspector.dart b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_map_inspector.dart
index a4833fe..34baa90 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_map_inspector.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_map_inspector.dart
@@ -78,9 +78,9 @@
   }
 
   Future<Map<String, dynamic>?> getTileOverlayInfo(String id) async {
-    return (await _channel.invokeMapMethod<String, dynamic>(
+    return await _channel.invokeMapMethod<String, dynamic>(
         'map#getTileOverlayInfo', <String, String>{
       'tileOverlayId': id,
-    }));
+    });
   }
 }
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart
index 8bafca1..a007ddd 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/integration_test/google_maps_test.dart
@@ -7,11 +7,11 @@
 import 'dart:typed_data';
 import 'dart:ui' as ui;
 
-import 'package:integration_test/integration_test.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:google_maps_flutter/google_maps_flutter.dart';
+import 'package:integration_test/integration_test.dart';
 
 import 'google_map_inspector.dart';
 
@@ -53,7 +53,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         compassEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -93,7 +93,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         mapToolbarEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -140,7 +140,8 @@
     final GoogleMapInspector inspector = await inspectorCompleter.future;
 
     if (Platform.isIOS) {
-      MinMaxZoomPreference zoomLevel = await inspector.getMinMaxZoomLevels();
+      final MinMaxZoomPreference zoomLevel =
+          await inspector.getMinMaxZoomLevels();
       expect(zoomLevel, equals(initialZoomLevel));
     } else if (Platform.isAndroid) {
       await controller.moveCamera(CameraUpdate.zoomTo(15));
@@ -161,13 +162,14 @@
         initialCameraPosition: _kInitialCameraPosition,
         minMaxZoomPreference: finalZoomLevel,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
 
     if (Platform.isIOS) {
-      MinMaxZoomPreference zoomLevel = await inspector.getMinMaxZoomLevels();
+      final MinMaxZoomPreference zoomLevel =
+          await inspector.getMinMaxZoomLevels();
       expect(zoomLevel, equals(finalZoomLevel));
     } else {
       await controller.moveCamera(CameraUpdate.zoomTo(15));
@@ -213,7 +215,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         zoomGesturesEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -243,7 +245,7 @@
 
     final GoogleMapInspector inspector = await inspectorCompleter.future;
     bool? zoomControlsEnabled = await inspector.isZoomControlsEnabled();
-    expect(zoomControlsEnabled, Platform.isIOS ? false : true);
+    expect(zoomControlsEnabled, !Platform.isIOS);
 
     /// Zoom Controls functionality is not available on iOS at the moment.
     if (Platform.isAndroid) {
@@ -254,7 +256,7 @@
           initialCameraPosition: _kInitialCameraPosition,
           zoomControlsEnabled: false,
           onMapCreated: (GoogleMapController controller) {
-            fail("OnMapCreated should get called only once.");
+            fail('OnMapCreated should get called only once.');
           },
         ),
       ));
@@ -295,7 +297,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         liteModeEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -335,7 +337,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         rotateGesturesEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -375,7 +377,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         tiltGesturesEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -415,7 +417,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         scrollGesturesEnabled: true,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -449,11 +451,11 @@
     // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen
     // in `mapRendered`.
     // https://github.com/flutter/flutter/issues/54758
-    await Future.delayed(Duration(seconds: 1));
+    await Future<void>.delayed(const Duration(seconds: 1));
 
-    ScreenCoordinate coordinate =
+    final ScreenCoordinate coordinate =
         await mapController.getScreenCoordinate(_kInitialCameraPosition.target);
-    Rect rect = tester.getRect(find.byKey(key));
+    final Rect rect = tester.getRect(find.byKey(key));
     if (Platform.isIOS) {
       // On iOS, the coordinate value from the GoogleMapSdk doesn't include the devicePixelRatio`.
       // So we don't need to do the conversion like we did below for other platforms.
@@ -525,7 +527,7 @@
 
     // TODO(iskakaushik): non-zero padding is needed for some device configurations
     // https://github.com/flutter/flutter/issues/30575
-    final double padding = 0;
+    const double padding = 0;
     await mapController
         .moveCamera(CameraUpdate.newLatLngBounds(latLngBounds, padding));
     await tester.pumpAndSettle(const Duration(seconds: 3));
@@ -573,7 +575,7 @@
         initialCameraPosition: _kInitialCameraPosition,
         trafficEnabled: false,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -641,7 +643,7 @@
         myLocationButtonEnabled: false,
         myLocationEnabled: false,
         onMapCreated: (GoogleMapController controller) {
-          fail("OnMapCreated should get called only once.");
+          fail('OnMapCreated should get called only once.');
         },
       ),
     ));
@@ -723,7 +725,7 @@
     ));
 
     final GoogleMapController controller = await controllerCompleter.future;
-    final String mapStyle =
+    const String mapStyle =
         '[{"elementType":"geometry","stylers":[{"color":"#242f3e"}]}]';
     await controller.setMapStyle(mapStyle);
   });
@@ -797,7 +799,7 @@
     // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen
     // in `mapRendered`.
     // https://github.com/flutter/flutter/issues/54758
-    await Future.delayed(Duration(seconds: 1));
+    await Future<void>.delayed(const Duration(seconds: 1));
 
     final LatLngBounds visibleRegion = await controller.getVisibleRegion();
     final LatLng topLeft =
@@ -832,7 +834,7 @@
     // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen
     // in `mapRendered`.
     // https://github.com/flutter/flutter/issues/54758
-    await Future.delayed(Duration(seconds: 1));
+    await Future<void>.delayed(const Duration(seconds: 1));
 
     double zoom = await controller.getZoomLevel();
     expect(zoom, _kInitialZoomLevel);
@@ -864,7 +866,7 @@
     // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen
     // in `mapRendered`.
     // https://github.com/flutter/flutter/issues/54758
-    await Future.delayed(Duration(seconds: 1));
+    await Future<void>.delayed(const Duration(seconds: 1));
 
     final LatLngBounds visibleRegion = await controller.getVisibleRegion();
     final LatLng northWest = LatLng(
@@ -902,7 +904,7 @@
     // TODO(cyanglaz): Remove this after we added `mapRendered` callback, and `mapControllerCompleter.complete(controller)` above should happen
     // in `mapRendered`.
     // https://github.com/flutter/flutter/issues/54758
-    await Future.delayed(Duration(seconds: 1));
+    await Future<void>.delayed(const Duration(seconds: 1));
 
     // Simple call to make sure that the app hasn't crashed.
     final LatLngBounds bounds1 = await controller.getVisibleRegion();
@@ -911,12 +913,12 @@
   });
 
   testWidgets('testToggleInfoWindow', (WidgetTester tester) async {
-    final Marker marker = Marker(
-        markerId: MarkerId("marker"),
-        infoWindow: InfoWindow(title: "InfoWindow"));
+    const Marker marker = Marker(
+        markerId: MarkerId('marker'),
+        infoWindow: InfoWindow(title: 'InfoWindow'));
     final Set<Marker> markers = <Marker>{marker};
 
-    Completer<GoogleMapController> controllerCompleter =
+    final Completer<GoogleMapController> controllerCompleter =
         Completer<GoogleMapController>();
 
     await tester.pumpWidget(Directionality(
@@ -930,7 +932,7 @@
       ),
     ));
 
-    GoogleMapController controller = await controllerCompleter.future;
+    final GoogleMapController controller = await controllerCompleter.future;
 
     bool iwVisibleStatus =
         await controller.isMarkerInfoWindowShown(marker.markerId);
@@ -945,9 +947,9 @@
     expect(iwVisibleStatus, false);
   });
 
-  testWidgets("fromAssetImage", (WidgetTester tester) async {
-    double pixelRatio = 2;
-    final ImageConfiguration imageConfiguration =
+  testWidgets('fromAssetImage', (WidgetTester tester) async {
+    const double pixelRatio = 2;
+    const ImageConfiguration imageConfiguration =
         ImageConfiguration(devicePixelRatio: pixelRatio);
     final BitmapDescriptor mip = await BitmapDescriptor.fromAssetImage(
         imageConfiguration, 'red_square.png');
@@ -959,7 +961,7 @@
   });
 
   testWidgets('testTakeSnapshot', (WidgetTester tester) async {
-    Completer<GoogleMapInspector> inspectorCompleter =
+    final Completer<GoogleMapInspector> inspectorCompleter =
         Completer<GoogleMapInspector>();
 
     await tester.pumpWidget(
@@ -990,10 +992,10 @@
   testWidgets(
     'set tileOverlay correctly',
     (WidgetTester tester) async {
-      Completer<GoogleMapInspector> inspectorCompleter =
+      final Completer<GoogleMapInspector> inspectorCompleter =
           Completer<GoogleMapInspector>();
       final TileOverlay tileOverlay1 = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_1'),
+        tileOverlayId: const TileOverlayId('tile_overlay_1'),
         tileProvider: _DebugTileProvider(),
         zIndex: 2,
         visible: true,
@@ -1002,7 +1004,7 @@
       );
 
       final TileOverlay tileOverlay2 = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_2'),
+        tileOverlayId: const TileOverlayId('tile_overlay_2'),
         tileProvider: _DebugTileProvider(),
         zIndex: 1,
         visible: false,
@@ -1028,9 +1030,9 @@
 
       final GoogleMapInspector inspector = await inspectorCompleter.future;
 
-      Map<String, dynamic> tileOverlayInfo1 =
+      final Map<String, dynamic> tileOverlayInfo1 =
           (await inspector.getTileOverlayInfo('tile_overlay_1'))!;
-      Map<String, dynamic> tileOverlayInfo2 =
+      final Map<String, dynamic> tileOverlayInfo2 =
           (await inspector.getTileOverlayInfo('tile_overlay_2'))!;
 
       expect(tileOverlayInfo1['visible'], isTrue);
@@ -1050,11 +1052,11 @@
   testWidgets(
     'update tileOverlays correctly',
     (WidgetTester tester) async {
-      Completer<GoogleMapInspector> inspectorCompleter =
+      final Completer<GoogleMapInspector> inspectorCompleter =
           Completer<GoogleMapInspector>();
       final Key key = GlobalKey();
       final TileOverlay tileOverlay1 = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_1'),
+        tileOverlayId: const TileOverlayId('tile_overlay_1'),
         tileProvider: _DebugTileProvider(),
         zIndex: 2,
         visible: true,
@@ -1063,7 +1065,7 @@
       );
 
       final TileOverlay tileOverlay2 = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_2'),
+        tileOverlayId: const TileOverlayId('tile_overlay_2'),
         tileProvider: _DebugTileProvider(),
         zIndex: 3,
         visible: true,
@@ -1090,7 +1092,7 @@
       final GoogleMapInspector inspector = await inspectorCompleter.future;
 
       final TileOverlay tileOverlay1New = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_1'),
+        tileOverlayId: const TileOverlayId('tile_overlay_1'),
         tileProvider: _DebugTileProvider(),
         zIndex: 1,
         visible: false,
@@ -1114,9 +1116,9 @@
 
       await tester.pumpAndSettle(const Duration(seconds: 3));
 
-      Map<String, dynamic> tileOverlayInfo1 =
+      final Map<String, dynamic> tileOverlayInfo1 =
           (await inspector.getTileOverlayInfo('tile_overlay_1'))!;
-      Map<String, dynamic>? tileOverlayInfo2 =
+      final Map<String, dynamic>? tileOverlayInfo2 =
           await inspector.getTileOverlayInfo('tile_overlay_2');
 
       expect(tileOverlayInfo1['visible'], isFalse);
@@ -1132,11 +1134,11 @@
   testWidgets(
     'remove tileOverlays correctly',
     (WidgetTester tester) async {
-      Completer<GoogleMapInspector> inspectorCompleter =
+      final Completer<GoogleMapInspector> inspectorCompleter =
           Completer<GoogleMapInspector>();
       final Key key = GlobalKey();
       final TileOverlay tileOverlay1 = TileOverlay(
-        tileOverlayId: TileOverlayId('tile_overlay_1'),
+        tileOverlayId: const TileOverlayId('tile_overlay_1'),
         tileProvider: _DebugTileProvider(),
         zIndex: 2,
         visible: true,
@@ -1177,7 +1179,7 @@
       );
 
       await tester.pumpAndSettle(const Duration(seconds: 3));
-      Map<String, dynamic>? tileOverlayInfo1 =
+      final Map<String, dynamic>? tileOverlayInfo1 =
           await inspector.getTileOverlayInfo('tile_overlay_1');
 
       expect(tileOverlayInfo1, isNull);
@@ -1196,7 +1198,7 @@
   static const int width = 100;
   static const int height = 100;
   static final Paint boxPaint = Paint();
-  static final TextStyle textStyle = TextStyle(
+  static const TextStyle textStyle = TextStyle(
     color: Colors.red,
     fontSize: 20,
   );
@@ -1206,7 +1208,7 @@
     final ui.PictureRecorder recorder = ui.PictureRecorder();
     final Canvas canvas = Canvas(recorder);
     final TextSpan textSpan = TextSpan(
-      text: "$x,$y",
+      text: '$x,$y',
       style: textStyle,
     );
     final TextPainter textPainter = TextPainter(
@@ -1217,7 +1219,7 @@
       minWidth: 0.0,
       maxWidth: width.toDouble(),
     );
-    final Offset offset = const Offset(0, 0);
+    const Offset offset = Offset(0, 0);
     textPainter.paint(canvas, offset);
     canvas.drawRect(
         Rect.fromLTRB(0, 0, width.toDouble(), width.toDouble()), boxPaint);
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/animate_camera.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/animate_camera.dart
index cc5fd25..f8072ee 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/animate_camera.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/animate_camera.dart
@@ -10,7 +10,7 @@
 import 'page.dart';
 
 class AnimateCameraPage extends GoogleMapExampleAppPage {
-  AnimateCameraPage()
+  const AnimateCameraPage()
       : super(const Icon(Icons.map), 'Camera control, animated');
 
   @override
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/lite_mode.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/lite_mode.dart
index f6d6f54..0ecc5ed 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/lite_mode.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/lite_mode.dart
@@ -13,7 +13,7 @@
     CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
 
 class LiteModePage extends GoogleMapExampleAppPage {
-  LiteModePage() : super(const Icon(Icons.map), 'Lite mode');
+  const LiteModePage() : super(const Icon(Icons.map), 'Lite mode');
 
   @override
   Widget build(BuildContext context) {
@@ -26,9 +26,9 @@
 
   @override
   Widget build(BuildContext context) {
-    return Card(
+    return const Card(
       child: Padding(
-        padding: const EdgeInsets.symmetric(vertical: 30.0),
+        padding: EdgeInsets.symmetric(vertical: 30.0),
         child: Center(
           child: SizedBox(
             width: 300.0,
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
index f67e4ff..f4d420a 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart
@@ -26,21 +26,21 @@
 import 'tile_overlay.dart';
 
 final List<GoogleMapExampleAppPage> _allPages = <GoogleMapExampleAppPage>[
-  MapUiPage(),
-  MapCoordinatesPage(),
-  MapClickPage(),
-  AnimateCameraPage(),
-  MoveCameraPage(),
-  PlaceMarkerPage(),
-  MarkerIconsPage(),
-  ScrollingMapPage(),
-  PlacePolylinePage(),
-  PlacePolygonPage(),
-  PlaceCirclePage(),
-  PaddingPage(),
-  SnapshotPage(),
-  LiteModePage(),
-  TileOverlayPage(),
+  const MapUiPage(),
+  const MapCoordinatesPage(),
+  const MapClickPage(),
+  const AnimateCameraPage(),
+  const MoveCameraPage(),
+  const PlaceMarkerPage(),
+  const MarkerIconsPage(),
+  const ScrollingMapPage(),
+  const PlacePolylinePage(),
+  const PlacePolygonPage(),
+  const PlaceCirclePage(),
+  const PaddingPage(),
+  const SnapshotPage(),
+  const LiteModePage(),
+  const TileOverlayPage(),
 ];
 
 class MapsDemo extends StatelessWidget {
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_click.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_click.dart
index e44f3d9..ef1bfe2 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_click.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_click.dart
@@ -13,7 +13,7 @@
     CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
 
 class MapClickPage extends GoogleMapExampleAppPage {
-  MapClickPage() : super(const Icon(Icons.mouse), 'Map click');
+  const MapClickPage() : super(const Icon(Icons.mouse), 'Map click');
 
   @override
   Widget build(BuildContext context) {
@@ -96,7 +96,7 @@
     );
   }
 
-  void onMapCreated(GoogleMapController controller) async {
+  Future<void> onMapCreated(GoogleMapController controller) async {
     setState(() {
       mapController = controller;
     });
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_coordinates.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_coordinates.dart
index 99ab168..dc4376a 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_coordinates.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_coordinates.dart
@@ -13,7 +13,7 @@
     CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
 
 class MapCoordinatesPage extends GoogleMapExampleAppPage {
-  MapCoordinatesPage() : super(const Icon(Icons.map), 'Map coordinates');
+  const MapCoordinatesPage() : super(const Icon(Icons.map), 'Map coordinates');
 
   @override
   Widget build(BuildContext context) {
@@ -72,7 +72,7 @@
     );
   }
 
-  void onMapCreated(GoogleMapController controller) async {
+  Future<void> onMapCreated(GoogleMapController controller) async {
     final LatLngBounds visibleRegion = await controller.getVisibleRegion();
     setState(() {
       mapController = controller;
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart
index 2e0d2d1..48ef1f5 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/map_ui.dart
@@ -16,7 +16,7 @@
 );
 
 class MapUiPage extends GoogleMapExampleAppPage {
-  MapUiPage() : super(const Icon(Icons.map), 'User interface');
+  const MapUiPage() : super(const Icon(Icons.map), 'User interface');
 
   @override
   Widget build(BuildContext context) {
@@ -34,14 +34,14 @@
 class MapUiBodyState extends State<MapUiBody> {
   MapUiBodyState();
 
-  static final CameraPosition _kInitialPosition = const CameraPosition(
+  static const CameraPosition _kInitialPosition = CameraPosition(
     target: LatLng(-33.852, 151.211),
     zoom: 11.0,
   );
 
   CameraPosition _position = _kInitialPosition;
   bool _isMapCreated = false;
-  bool _isMoving = false;
+  final bool _isMoving = false;
   bool _compassEnabled = true;
   bool _mapToolbarEnabled = true;
   CameraTargetBounds _cameraTargetBounds = CameraTargetBounds.unbounded;
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart
index da57b83..95ace9d 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart
@@ -11,7 +11,7 @@
 import 'page.dart';
 
 class MarkerIconsPage extends GoogleMapExampleAppPage {
-  MarkerIconsPage() : super(const Icon(Icons.image), 'Marker icons');
+  const MarkerIconsPage() : super(const Icon(Icons.image), 'Marker icons');
 
   @override
   Widget build(BuildContext context) {
@@ -60,13 +60,13 @@
   Marker _createMarker() {
     if (_markerIcon != null) {
       return Marker(
-        markerId: MarkerId("marker_1"),
+        markerId: const MarkerId('marker_1'),
         position: _kMapCenter,
         icon: _markerIcon!,
       );
     } else {
-      return Marker(
-        markerId: MarkerId("marker_1"),
+      return const Marker(
+        markerId: MarkerId('marker_1'),
         position: _kMapCenter,
       );
     }
@@ -75,7 +75,7 @@
   Future<void> _createMarkerImageFromAsset(BuildContext context) async {
     if (_markerIcon == null) {
       final ImageConfiguration imageConfiguration =
-          createLocalImageConfiguration(context, size: Size.square(48));
+          createLocalImageConfiguration(context, size: const Size.square(48));
       BitmapDescriptor.fromAssetImage(
               imageConfiguration, 'assets/red_square.png')
           .then(_updateBitmap);
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/move_camera.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/move_camera.dart
index f827419..33da90f 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/move_camera.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/move_camera.dart
@@ -10,7 +10,7 @@
 import 'page.dart';
 
 class MoveCameraPage extends GoogleMapExampleAppPage {
-  MoveCameraPage() : super(const Icon(Icons.map), 'Camera control');
+  const MoveCameraPage() : super(const Icon(Icons.map), 'Camera control');
 
   @override
   Widget build(BuildContext context) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/padding.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/padding.dart
index d90005f..7709190 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/padding.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/padding.dart
@@ -9,7 +9,7 @@
 import 'page.dart';
 
 class PaddingPage extends GoogleMapExampleAppPage {
-  PaddingPage() : super(const Icon(Icons.map), 'Add padding to the map');
+  const PaddingPage() : super(const Icon(Icons.map), 'Add padding to the map');
 
   @override
   Widget build(BuildContext context) {
@@ -53,11 +53,11 @@
           ),
         ),
       ),
-      Padding(
-        padding: const EdgeInsets.only(top: 20),
+      const Padding(
+        padding: EdgeInsets.only(top: 20),
         child: Center(
           child: Text(
-            "Enter Padding Below",
+            'Enter Padding Below',
             style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
           ),
         ),
@@ -79,10 +79,10 @@
     });
   }
 
-  TextEditingController _topController = TextEditingController();
-  TextEditingController _bottomController = TextEditingController();
-  TextEditingController _leftController = TextEditingController();
-  TextEditingController _rightController = TextEditingController();
+  final TextEditingController _topController = TextEditingController();
+  final TextEditingController _bottomController = TextEditingController();
+  final TextEditingController _leftController = TextEditingController();
+  final TextEditingController _rightController = TextEditingController();
 
   Widget _paddingInput() {
     return Padding(
@@ -96,7 +96,7 @@
               keyboardType: TextInputType.number,
               textAlign: TextAlign.center,
               decoration: const InputDecoration(
-                hintText: "Top",
+                hintText: 'Top',
               ),
             ),
           ),
@@ -108,7 +108,7 @@
               keyboardType: TextInputType.number,
               textAlign: TextAlign.center,
               decoration: const InputDecoration(
-                hintText: "Bottom",
+                hintText: 'Bottom',
               ),
             ),
           ),
@@ -120,7 +120,7 @@
               keyboardType: TextInputType.number,
               textAlign: TextAlign.center,
               decoration: const InputDecoration(
-                hintText: "Left",
+                hintText: 'Left',
               ),
             ),
           ),
@@ -132,7 +132,7 @@
               keyboardType: TextInputType.number,
               textAlign: TextAlign.center,
               decoration: const InputDecoration(
-                hintText: "Right",
+                hintText: 'Right',
               ),
             ),
           ),
@@ -148,7 +148,7 @@
         mainAxisAlignment: MainAxisAlignment.spaceEvenly,
         children: <Widget>[
           TextButton(
-            child: const Text("Set Padding"),
+            child: const Text('Set Padding'),
             onPressed: () {
               setState(() {
                 _padding = EdgeInsets.fromLTRB(
@@ -160,7 +160,7 @@
             },
           ),
           TextButton(
-            child: const Text("Reset Padding"),
+            child: const Text('Reset Padding'),
             onPressed: () {
               setState(() {
                 _topController.clear();
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_circle.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_circle.dart
index a495342..c6f1509 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_circle.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_circle.dart
@@ -10,7 +10,8 @@
 import 'page.dart';
 
 class PlaceCirclePage extends GoogleMapExampleAppPage {
-  PlaceCirclePage() : super(const Icon(Icons.linear_scale), 'Place circle');
+  const PlaceCirclePage()
+      : super(const Icon(Icons.linear_scale), 'Place circle');
 
   @override
   Widget build(BuildContext context) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
index 4b9496f..4291cac 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_marker.dart
@@ -6,8 +6,8 @@
 
 import 'dart:async';
 import 'dart:math';
-import 'dart:ui';
 import 'dart:typed_data';
+import 'dart:ui';
 
 import 'package:flutter/material.dart';
 import 'package:google_maps_flutter/google_maps_flutter.dart';
@@ -15,7 +15,7 @@
 import 'page.dart';
 
 class PlaceMarkerPage extends GoogleMapExampleAppPage {
-  PlaceMarkerPage() : super(const Icon(Icons.place), 'Place marker');
+  const PlaceMarkerPage() : super(const Icon(Icons.place), 'Place marker');
 
   @override
   Widget build(BuildContext context) {
@@ -34,7 +34,7 @@
 
 class PlaceMarkerBodyState extends State<PlaceMarkerBody> {
   PlaceMarkerBodyState();
-  static final LatLng center = const LatLng(-33.86711, 151.1947171);
+  static const LatLng center = LatLng(-33.86711, 151.1947171);
 
   GoogleMapController? controller;
   Map<MarkerId, Marker> markers = <MarkerId, Marker>{};
@@ -74,17 +74,17 @@
     }
   }
 
-  void _onMarkerDrag(MarkerId markerId, LatLng newPosition) async {
+  Future<void> _onMarkerDrag(MarkerId markerId, LatLng newPosition) async {
     setState(() {
-      this.markerPosition = newPosition;
+      markerPosition = newPosition;
     });
   }
 
-  void _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async {
+  Future<void> _onMarkerDragEnd(MarkerId markerId, LatLng newPosition) async {
     final Marker? tappedMarker = markers[markerId];
     if (tappedMarker != null) {
       setState(() {
-        this.markerPosition = null;
+        markerPosition = null;
       });
       await showDialog<void>(
           context: context,
@@ -289,7 +289,7 @@
   @override
   Widget build(BuildContext context) {
     final MarkerId? selectedId = selectedMarker;
-    return Stack(children: [
+    return Stack(children: <Widget>[
       Column(
         mainAxisAlignment: MainAxisAlignment.spaceEvenly,
         crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -397,17 +397,19 @@
         child: Container(
           color: Colors.white70,
           height: 30,
-          padding: EdgeInsets.only(left: 12, right: 12),
+          padding: const EdgeInsets.only(left: 12, right: 12),
           child: Row(
             mainAxisAlignment: MainAxisAlignment.spaceAround,
             mainAxisSize: MainAxisSize.max,
-            children: [
-              markerPosition == null
-                  ? Container()
-                  : Expanded(child: Text("lat: ${markerPosition!.latitude}")),
-              markerPosition == null
-                  ? Container()
-                  : Expanded(child: Text("lng: ${markerPosition!.longitude}")),
+            children: <Widget>[
+              if (markerPosition == null)
+                Container()
+              else
+                Expanded(child: Text('lat: ${markerPosition!.latitude}')),
+              if (markerPosition == null)
+                Container()
+              else
+                Expanded(child: Text('lng: ${markerPosition!.longitude}')),
             ],
           ),
         ),
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polygon.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polygon.dart
index 476084d..8d4fa3e 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polygon.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polygon.dart
@@ -10,7 +10,8 @@
 import 'page.dart';
 
 class PlacePolygonPage extends GoogleMapExampleAppPage {
-  PlacePolygonPage() : super(const Icon(Icons.linear_scale), 'Place polygon');
+  const PlacePolygonPage()
+      : super(const Icon(Icons.linear_scale), 'Place polygon');
 
   @override
   Widget build(BuildContext context) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart
index aeb9bf1..434920d 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart
@@ -11,7 +11,8 @@
 import 'page.dart';
 
 class PlacePolylinePage extends GoogleMapExampleAppPage {
-  PlacePolylinePage() : super(const Icon(Icons.linear_scale), 'Place polyline');
+  const PlacePolylinePage()
+      : super(const Icon(Icons.linear_scale), 'Place polyline');
 
   @override
   Widget build(BuildContext context) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/scrolling_map.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/scrolling_map.dart
index 9611d36..8d046fc 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/scrolling_map.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/scrolling_map.dart
@@ -12,8 +12,10 @@
 
 import 'page.dart';
 
+const LatLng _center = LatLng(32.080664, 34.9563837);
+
 class ScrollingMapPage extends GoogleMapExampleAppPage {
-  ScrollingMapPage() : super(const Icon(Icons.map), 'Scrolling map');
+  const ScrollingMapPage() : super(const Icon(Icons.map), 'Scrolling map');
 
   @override
   Widget build(BuildContext context) {
@@ -24,8 +26,6 @@
 class ScrollingMapBody extends StatelessWidget {
   const ScrollingMapBody();
 
-  final LatLng center = const LatLng(32.080664, 34.9563837);
-
   @override
   Widget build(BuildContext context) {
     return ListView(
@@ -44,8 +44,8 @@
                     width: 300.0,
                     height: 300.0,
                     child: GoogleMap(
-                      initialCameraPosition: CameraPosition(
-                        target: center,
+                      initialCameraPosition: const CameraPosition(
+                        target: _center,
                         zoom: 11.0,
                       ),
                       gestureRecognizers: //
@@ -77,16 +77,16 @@
                     width: 300.0,
                     height: 300.0,
                     child: GoogleMap(
-                      initialCameraPosition: CameraPosition(
-                        target: center,
+                      initialCameraPosition: const CameraPosition(
+                        target: _center,
                         zoom: 11.0,
                       ),
                       markers: <Marker>{
                         Marker(
-                          markerId: MarkerId("test_marker_id"),
+                          markerId: const MarkerId('test_marker_id'),
                           position: LatLng(
-                            center.latitude,
-                            center.longitude,
+                            _center.latitude,
+                            _center.longitude,
                           ),
                           infoWindow: const InfoWindow(
                             title: 'An interesting location',
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/snapshot.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/snapshot.dart
index c85048f..9afc288 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/snapshot.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/snapshot.dart
@@ -15,7 +15,7 @@
     CameraPosition(target: LatLng(-33.852, 151.211), zoom: 11.0);
 
 class SnapshotPage extends GoogleMapExampleAppPage {
-  SnapshotPage()
+  const SnapshotPage()
       : super(const Icon(Icons.camera_alt), 'Take a snapshot of the map');
 
   @override
@@ -39,7 +39,7 @@
       padding: const EdgeInsets.all(16),
       child: Column(
         crossAxisAlignment: CrossAxisAlignment.stretch,
-        children: [
+        children: <Widget>[
           SizedBox(
             height: 180,
             child: GoogleMap(
@@ -48,9 +48,10 @@
             ),
           ),
           TextButton(
-            child: Text('Take a snapshot'),
+            child: const Text('Take a snapshot'),
             onPressed: () async {
-              final imageBytes = await _mapController?.takeSnapshot();
+              final Uint8List? imageBytes =
+                  await _mapController?.takeSnapshot();
               setState(() {
                 _imageBytes = imageBytes;
               });
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/tile_overlay.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/tile_overlay.dart
index 1d6dd69..dc7f7d1 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/lib/tile_overlay.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/tile_overlay.dart
@@ -13,7 +13,7 @@
 import 'page.dart';
 
 class TileOverlayPage extends GoogleMapExampleAppPage {
-  TileOverlayPage() : super(const Icon(Icons.map), 'Tile overlay');
+  const TileOverlayPage() : super(const Icon(Icons.map), 'Tile overlay');
 
   @override
   Widget build(BuildContext context) {
@@ -51,7 +51,7 @@
 
   void _addTileOverlay() {
     final TileOverlay tileOverlay = TileOverlay(
-      tileOverlayId: TileOverlayId('tile_overlay_1'),
+      tileOverlayId: const TileOverlayId('tile_overlay_1'),
       tileProvider: _DebugTileProvider(),
     );
     setState(() {
@@ -67,7 +67,7 @@
 
   @override
   Widget build(BuildContext context) {
-    Set<TileOverlay> overlays = <TileOverlay>{
+    final Set<TileOverlay> overlays = <TileOverlay>{
       if (_tileOverlay != null) _tileOverlay!,
     };
     return Column(
@@ -117,7 +117,7 @@
   static const int width = 100;
   static const int height = 100;
   static final Paint boxPaint = Paint();
-  static final TextStyle textStyle = TextStyle(
+  static const TextStyle textStyle = TextStyle(
     color: Colors.red,
     fontSize: 20,
   );
@@ -138,7 +138,7 @@
       minWidth: 0.0,
       maxWidth: width.toDouble(),
     );
-    final Offset offset = const Offset(0, 0);
+    const Offset offset = Offset(0, 0);
     textPainter.paint(canvas, offset);
     canvas.drawRect(
         Rect.fromLTRB(0, 0, width.toDouble(), width.toDouble()), boxPaint);
diff --git a/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml
index cd614c7..dbc32b0 100644
--- a/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml
@@ -7,10 +7,10 @@
   flutter: ">=2.5.0"
 
 dependencies:
+  cupertino_icons: ^0.1.0
   flutter:
     sdk: flutter
-
-  cupertino_icons: ^0.1.0
+  flutter_plugin_android_lifecycle: ^2.0.1
   google_maps_flutter:
     # When depending on this package from a real application you should use:
     #   google_maps_flutter: ^x.y.z
@@ -18,7 +18,6 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
-  flutter_plugin_android_lifecycle: ^2.0.1
 
 dev_dependencies:
   espresso: ^0.1.0+2
@@ -26,7 +25,6 @@
     sdk: flutter
   integration_test:
     sdk: flutter
-  pedantic: ^1.10.0
 
 flutter:
   uses-material-design: true
diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart
index 93bb056..5b1e67c 100644
--- a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart
@@ -14,7 +14,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
-import 'package:google_maps_flutter_platform_interface/src/method_channel/method_channel_google_maps_flutter.dart';
 
 export 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'
     show
diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
index d57ac97..088589e 100644
--- a/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/controller.dart
@@ -6,17 +6,16 @@
 
 /// Controller for a single GoogleMap instance running on the host platform.
 class GoogleMapController {
-  /// The mapId for this controller
-  final int mapId;
-
   GoogleMapController._(
-    CameraPosition initialCameraPosition,
     this._googleMapState, {
     required this.mapId,
   }) {
     _connectStreams(mapId);
   }
 
+  /// The mapId for this controller
+  final int mapId;
+
   /// Initialize control of a [GoogleMap] with [id].
   ///
   /// Mainly for internal use when instantiating a [GoogleMapController] passed
@@ -29,7 +28,6 @@
     assert(id != null);
     await GoogleMapsFlutterPlatform.instance.init(id);
     return GoogleMapController._(
-      initialCameraPosition,
       googleMapState,
       mapId: id,
     );
@@ -38,7 +36,7 @@
   /// Used to communicate with the native platform.
   ///
   /// Accessible only for testing.
-  // TODO(dit) https://github.com/flutter/flutter/issues/55504 Remove this getter.
+  // TODO(dit): Remove this getter, https://github.com/flutter/flutter/issues/55504.
   @visibleForTesting
   MethodChannel? get channel {
     if (GoogleMapsFlutterPlatform.instance is MethodChannelGoogleMapsFlutter) {
diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
index b153832..8ecbfbb 100644
--- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart
@@ -25,11 +25,12 @@
   final String objectType;
 
   /// The unknown maps object ID.
-  final MapsObjectId objectId;
+  final MapsObjectId<Object> objectId;
 
   /// The context where the error occurred.
   final String? context;
 
+  @override
   String toString() {
     if (context != null) {
       return 'Unknown $objectType ID "${objectId.value}" in $context';
@@ -40,6 +41,8 @@
 
 /// Android specific settings for [GoogleMap].
 class AndroidGoogleMapsFlutter {
+  AndroidGoogleMapsFlutter._();
+
   /// Whether to render [GoogleMap] with a [AndroidViewSurface] to build the Google Maps widget.
   ///
   /// This implementation uses hybrid composition to render the Google Maps
@@ -282,7 +285,7 @@
 }
 
 class _GoogleMapState extends State<GoogleMap> {
-  final _mapId = _nextMapCreationId++;
+  final int _mapId = _nextMapCreationId++;
 
   final Completer<GoogleMapController> _controller =
       Completer<GoogleMapController>();
@@ -322,9 +325,13 @@
   }
 
   @override
-  void dispose() async {
+  void dispose() {
+    _disposeController();
     super.dispose();
-    GoogleMapController controller = await _controller.future;
+  }
+
+  Future<void> _disposeController() async {
+    final GoogleMapController controller = await _controller.future;
     controller.dispose();
   }
 
@@ -339,7 +346,7 @@
     _updateTileOverlays();
   }
 
-  void _updateOptions() async {
+  Future<void> _updateOptions() async {
     final _GoogleMapOptions newOptions = _GoogleMapOptions.fromWidget(widget);
     final Map<String, dynamic> updates =
         _googleMapOptions.updatesMap(newOptions);
@@ -352,7 +359,7 @@
     _googleMapOptions = newOptions;
   }
 
-  void _updateMarkers() async {
+  Future<void> _updateMarkers() async {
     final GoogleMapController controller = await _controller.future;
     // ignore: unawaited_futures
     controller._updateMarkers(
@@ -360,7 +367,7 @@
     _markers = keyByMarkerId(widget.markers);
   }
 
-  void _updatePolygons() async {
+  Future<void> _updatePolygons() async {
     final GoogleMapController controller = await _controller.future;
     // ignore: unawaited_futures
     controller._updatePolygons(
@@ -368,7 +375,7 @@
     _polygons = keyByPolygonId(widget.polygons);
   }
 
-  void _updatePolylines() async {
+  Future<void> _updatePolylines() async {
     final GoogleMapController controller = await _controller.future;
     // ignore: unawaited_futures
     controller._updatePolylines(
@@ -376,7 +383,7 @@
     _polylines = keyByPolylineId(widget.polylines);
   }
 
-  void _updateCircles() async {
+  Future<void> _updateCircles() async {
     final GoogleMapController controller = await _controller.future;
     // ignore: unawaited_futures
     controller._updateCircles(
@@ -384,7 +391,7 @@
     _circles = keyByCircleId(widget.circles);
   }
 
-  void _updateTileOverlays() async {
+  Future<void> _updateTileOverlays() async {
     final GoogleMapController controller = await _controller.future;
     // ignore: unawaited_futures
     controller._updateTileOverlays(widget.tileOverlays);
diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
index e8bd391..849019c 100644
--- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
 repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 2.1.1
+version: 2.1.2
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/circle_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/circle_updates_test.dart
index e0d1180..6d65066 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/circle_updates_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/circle_updates_test.dart
@@ -35,7 +35,7 @@
   });
 
   testWidgets('Initializing a circle', (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -48,9 +48,9 @@
     expect(platformGoogleMap.circlesToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a circle", (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
-    final Circle c2 = Circle(circleId: CircleId("circle_2"));
+  testWidgets('Adding a circle', (WidgetTester tester) async {
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
+    const Circle c2 = Circle(circleId: CircleId('circle_2'));
 
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1}));
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1, c2}));
@@ -67,8 +67,8 @@
     expect(platformGoogleMap.circlesToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a circle", (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
+  testWidgets('Removing a circle', (WidgetTester tester) async {
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
 
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1}));
     await tester.pumpWidget(_mapWithCircles(<Circle>{}));
@@ -82,9 +82,9 @@
     expect(platformGoogleMap.circlesToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a circle", (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
-    final Circle c2 = Circle(circleId: CircleId("circle_1"), radius: 10);
+  testWidgets('Updating a circle', (WidgetTester tester) async {
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
+    const Circle c2 = Circle(circleId: CircleId('circle_1'), radius: 10);
 
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1}));
     await tester.pumpWidget(_mapWithCircles(<Circle>{c2}));
@@ -98,9 +98,9 @@
     expect(platformGoogleMap.circlesToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a circle", (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
-    final Circle c2 = Circle(circleId: CircleId("circle_1"), radius: 10);
+  testWidgets('Updating a circle', (WidgetTester tester) async {
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
+    const Circle c2 = Circle(circleId: CircleId('circle_1'), radius: 10);
 
     await tester.pumpWidget(_mapWithCircles(<Circle>{c1}));
     await tester.pumpWidget(_mapWithCircles(<Circle>{c2}));
@@ -114,12 +114,12 @@
     expect(update.radius, 10);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Circle c1 = Circle(circleId: CircleId("circle_1"));
-    Circle c2 = Circle(circleId: CircleId("circle_2"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Circle c1 = const Circle(circleId: CircleId('circle_1'));
+    Circle c2 = const Circle(circleId: CircleId('circle_2'));
     final Set<Circle> prev = <Circle>{c1, c2};
-    c1 = Circle(circleId: CircleId("circle_1"), visible: false);
-    c2 = Circle(circleId: CircleId("circle_2"), radius: 10);
+    c1 = const Circle(circleId: CircleId('circle_1'), visible: false);
+    c2 = const Circle(circleId: CircleId('circle_2'), radius: 10);
     final Set<Circle> cur = <Circle>{c1, c2};
 
     await tester.pumpWidget(_mapWithCircles(prev));
@@ -133,14 +133,14 @@
     expect(platformGoogleMap.circlesToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Circle c2 = Circle(circleId: CircleId("circle_2"));
-    final Circle c3 = Circle(circleId: CircleId("circle_3"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Circle c2 = const Circle(circleId: CircleId('circle_2'));
+    const Circle c3 = Circle(circleId: CircleId('circle_3'));
     final Set<Circle> prev = <Circle>{c2, c3};
 
     // c1 is added, c2 is updated, c3 is removed.
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
-    c2 = Circle(circleId: CircleId("circle_2"), radius: 10);
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
+    c2 = const Circle(circleId: CircleId('circle_2'), radius: 10);
     final Set<Circle> cur = <Circle>{c1, c2};
 
     await tester.pumpWidget(_mapWithCircles(prev));
@@ -158,12 +158,12 @@
     expect(platformGoogleMap.circleIdsToRemove.first, equals(c3.circleId));
   });
 
-  testWidgets("Partial Update", (WidgetTester tester) async {
-    final Circle c1 = Circle(circleId: CircleId("circle_1"));
-    final Circle c2 = Circle(circleId: CircleId("circle_2"));
-    Circle c3 = Circle(circleId: CircleId("circle_3"));
+  testWidgets('Partial Update', (WidgetTester tester) async {
+    const Circle c1 = Circle(circleId: CircleId('circle_1'));
+    const Circle c2 = Circle(circleId: CircleId('circle_2'));
+    Circle c3 = const Circle(circleId: CircleId('circle_3'));
     final Set<Circle> prev = <Circle>{c1, c2, c3};
-    c3 = Circle(circleId: CircleId("circle_3"), radius: 10);
+    c3 = const Circle(circleId: CircleId('circle_3'), radius: 10);
     final Set<Circle> cur = <Circle>{c1, c2, c3};
 
     await tester.pumpWidget(_mapWithCircles(prev));
@@ -177,10 +177,11 @@
     expect(platformGoogleMap.circlesToAdd.isEmpty, true);
   });
 
-  testWidgets("Update non platform related attr", (WidgetTester tester) async {
-    Circle c1 = Circle(circleId: CircleId("circle_1"));
+  testWidgets('Update non platform related attr', (WidgetTester tester) async {
+    Circle c1 = const Circle(circleId: CircleId('circle_1'));
     final Set<Circle> prev = <Circle>{c1};
-    c1 = Circle(circleId: CircleId("circle_1"), onTap: () => print("hello"));
+    c1 = Circle(
+        circleId: const CircleId('circle_1'), onTap: () => print('hello'));
     final Set<Circle> cur = <Circle>{c1};
 
     await tester.pumpWidget(_mapWithCircles(prev));
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
index 37270ea..bac3cea 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/fake_maps_controllers.dart
@@ -15,7 +15,7 @@
         channel = MethodChannel(
             'plugins.flutter.io/google_maps_$id', const StandardMethodCodec()) {
     channel.setMockMethodCallHandler(onMethodCall);
-    updateOptions(params['options']);
+    updateOptions(params['options'] as Map<dynamic, dynamic>);
     updateMarkers(params);
     updatePolygons(params);
     updatePolylines(params);
@@ -94,23 +94,23 @@
   Future<dynamic> onMethodCall(MethodCall call) {
     switch (call.method) {
       case 'map#update':
-        updateOptions(call.arguments['options']);
+        updateOptions(call.arguments['options'] as Map<dynamic, dynamic>);
         return Future<void>.sync(() {});
       case 'markers#update':
-        updateMarkers(call.arguments);
+        updateMarkers(call.arguments as Map<dynamic, dynamic>?);
         return Future<void>.sync(() {});
       case 'polygons#update':
-        updatePolygons(call.arguments);
+        updatePolygons(call.arguments as Map<dynamic, dynamic>?);
         return Future<void>.sync(() {});
       case 'polylines#update':
-        updatePolylines(call.arguments);
+        updatePolylines(call.arguments as Map<dynamic, dynamic>?);
         return Future<void>.sync(() {});
       case 'tileOverlays#update':
-        updateTileOverlays(
-            Map.castFrom<dynamic, dynamic, String, dynamic>(call.arguments));
+        updateTileOverlays(Map.castFrom<dynamic, dynamic, String, dynamic>(
+            call.arguments as Map<dynamic, dynamic>));
         return Future<void>.sync(() {});
       case 'circles#update':
-        updateCircles(call.arguments);
+        updateCircles(call.arguments as Map<dynamic, dynamic>?);
         return Future<void>.sync(() {});
       default:
         return Future<void>.sync(() {});
@@ -122,8 +122,8 @@
       return;
     }
     markersToAdd = _deserializeMarkers(markerUpdates['markersToAdd']);
-    markerIdsToRemove =
-        _deserializeMarkerIds(markerUpdates['markerIdsToRemove']);
+    markerIdsToRemove = _deserializeMarkerIds(
+        markerUpdates['markerIdsToRemove'] as List<dynamic>?);
     markersToChange = _deserializeMarkers(markerUpdates['markersToChange']);
   }
 
@@ -131,29 +131,32 @@
     if (markerIds == null) {
       return <MarkerId>{};
     }
-    return markerIds.map((dynamic markerId) => MarkerId(markerId)).toSet();
+    return markerIds
+        .map((dynamic markerId) => MarkerId(markerId as String))
+        .toSet();
   }
 
   Set<Marker> _deserializeMarkers(dynamic markers) {
     if (markers == null) {
       return <Marker>{};
     }
-    final List<dynamic> markersData = markers;
+    final List<dynamic> markersData = markers as List<dynamic>;
     final Set<Marker> result = <Marker>{};
-    for (Map<dynamic, dynamic> markerData
+    for (final Map<dynamic, dynamic> markerData
         in markersData.cast<Map<dynamic, dynamic>>()) {
-      final String markerId = markerData['markerId'];
-      final double alpha = markerData['alpha'];
-      final bool draggable = markerData['draggable'];
-      final bool visible = markerData['visible'];
+      final String markerId = markerData['markerId'] as String;
+      final double alpha = markerData['alpha'] as double;
+      final bool draggable = markerData['draggable'] as bool;
+      final bool visible = markerData['visible'] as bool;
 
       final dynamic infoWindowData = markerData['infoWindow'];
       InfoWindow infoWindow = InfoWindow.noText;
       if (infoWindowData != null) {
-        final Map<dynamic, dynamic> infoWindowMap = infoWindowData;
+        final Map<dynamic, dynamic> infoWindowMap =
+            infoWindowData as Map<dynamic, dynamic>;
         infoWindow = InfoWindow(
-          title: infoWindowMap['title'],
-          snippet: infoWindowMap['snippet'],
+          title: infoWindowMap['title'] as String?,
+          snippet: infoWindowMap['snippet'] as String?,
         );
       }
 
@@ -174,8 +177,8 @@
       return;
     }
     polygonsToAdd = _deserializePolygons(polygonUpdates['polygonsToAdd']);
-    polygonIdsToRemove =
-        _deserializePolygonIds(polygonUpdates['polygonIdsToRemove']);
+    polygonIdsToRemove = _deserializePolygonIds(
+        polygonUpdates['polygonIdsToRemove'] as List<dynamic>?);
     polygonsToChange = _deserializePolygons(polygonUpdates['polygonsToChange']);
   }
 
@@ -183,22 +186,26 @@
     if (polygonIds == null) {
       return <PolygonId>{};
     }
-    return polygonIds.map((dynamic polygonId) => PolygonId(polygonId)).toSet();
+    return polygonIds
+        .map((dynamic polygonId) => PolygonId(polygonId as String))
+        .toSet();
   }
 
   Set<Polygon> _deserializePolygons(dynamic polygons) {
     if (polygons == null) {
       return <Polygon>{};
     }
-    final List<dynamic> polygonsData = polygons;
+    final List<dynamic> polygonsData = polygons as List<dynamic>;
     final Set<Polygon> result = <Polygon>{};
-    for (Map<dynamic, dynamic> polygonData
+    for (final Map<dynamic, dynamic> polygonData
         in polygonsData.cast<Map<dynamic, dynamic>>()) {
-      final String polygonId = polygonData['polygonId'];
-      final bool visible = polygonData['visible'];
-      final bool geodesic = polygonData['geodesic'];
-      final List<LatLng> points = _deserializePoints(polygonData['points']);
-      final List<List<LatLng>> holes = _deserializeHoles(polygonData['holes']);
+      final String polygonId = polygonData['polygonId'] as String;
+      final bool visible = polygonData['visible'] as bool;
+      final bool geodesic = polygonData['geodesic'] as bool;
+      final List<LatLng> points =
+          _deserializePoints(polygonData['points'] as List<dynamic>);
+      final List<List<LatLng>> holes =
+          _deserializeHoles(polygonData['holes'] as List<dynamic>);
 
       result.add(Polygon(
         polygonId: PolygonId(polygonId),
@@ -214,15 +221,15 @@
 
   List<LatLng> _deserializePoints(List<dynamic> points) {
     return points.map<LatLng>((dynamic list) {
-      return LatLng(list[0], list[1]);
+      return LatLng(list[0] as double, list[1] as double);
     }).toList();
   }
 
   List<List<LatLng>> _deserializeHoles(List<dynamic> holes) {
     return holes.map<List<LatLng>>((dynamic hole) {
       return hole.map<LatLng>((dynamic list) {
-        return LatLng(list[0], list[1]);
-      }).toList();
+        return LatLng(list[0] as double, list[1] as double);
+      }).toList() as List<LatLng>;
     }).toList();
   }
 
@@ -231,8 +238,8 @@
       return;
     }
     polylinesToAdd = _deserializePolylines(polylineUpdates['polylinesToAdd']);
-    polylineIdsToRemove =
-        _deserializePolylineIds(polylineUpdates['polylineIdsToRemove']);
+    polylineIdsToRemove = _deserializePolylineIds(
+        polylineUpdates['polylineIdsToRemove'] as List<dynamic>?);
     polylinesToChange =
         _deserializePolylines(polylineUpdates['polylinesToChange']);
   }
@@ -242,7 +249,7 @@
       return <PolylineId>{};
     }
     return polylineIds
-        .map((dynamic polylineId) => PolylineId(polylineId))
+        .map((dynamic polylineId) => PolylineId(polylineId as String))
         .toSet();
   }
 
@@ -250,14 +257,15 @@
     if (polylines == null) {
       return <Polyline>{};
     }
-    final List<dynamic> polylinesData = polylines;
+    final List<dynamic> polylinesData = polylines as List<dynamic>;
     final Set<Polyline> result = <Polyline>{};
-    for (Map<dynamic, dynamic> polylineData
+    for (final Map<dynamic, dynamic> polylineData
         in polylinesData.cast<Map<dynamic, dynamic>>()) {
-      final String polylineId = polylineData['polylineId'];
-      final bool visible = polylineData['visible'];
-      final bool geodesic = polylineData['geodesic'];
-      final List<LatLng> points = _deserializePoints(polylineData['points']);
+      final String polylineId = polylineData['polylineId'] as String;
+      final bool visible = polylineData['visible'] as bool;
+      final bool geodesic = polylineData['geodesic'] as bool;
+      final List<LatLng> points =
+          _deserializePoints(polylineData['points'] as List<dynamic>);
 
       result.add(Polyline(
         polylineId: PolylineId(polylineId),
@@ -275,8 +283,8 @@
       return;
     }
     circlesToAdd = _deserializeCircles(circleUpdates['circlesToAdd']);
-    circleIdsToRemove =
-        _deserializeCircleIds(circleUpdates['circleIdsToRemove']);
+    circleIdsToRemove = _deserializeCircleIds(
+        circleUpdates['circleIdsToRemove'] as List<dynamic>?);
     circlesToChange = _deserializeCircles(circleUpdates['circlesToChange']);
   }
 
@@ -287,17 +295,19 @@
     final List<Map<dynamic, dynamic>>? tileOverlaysToAddList =
         updateTileOverlayUpdates['tileOverlaysToAdd'] != null
             ? List.castFrom<dynamic, Map<dynamic, dynamic>>(
-                updateTileOverlayUpdates['tileOverlaysToAdd'])
+                updateTileOverlayUpdates['tileOverlaysToAdd'] as List<dynamic>)
             : null;
     final List<String>? tileOverlayIdsToRemoveList =
         updateTileOverlayUpdates['tileOverlayIdsToRemove'] != null
             ? List.castFrom<dynamic, String>(
-                updateTileOverlayUpdates['tileOverlayIdsToRemove'])
+                updateTileOverlayUpdates['tileOverlayIdsToRemove']
+                    as List<dynamic>)
             : null;
     final List<Map<dynamic, dynamic>>? tileOverlaysToChangeList =
         updateTileOverlayUpdates['tileOverlaysToChange'] != null
             ? List.castFrom<dynamic, Map<dynamic, dynamic>>(
-                updateTileOverlayUpdates['tileOverlaysToChange'])
+                updateTileOverlayUpdates['tileOverlaysToChange']
+                    as List<dynamic>)
             : null;
     tileOverlaysToAdd = _deserializeTileOverlays(tileOverlaysToAddList);
     tileOverlayIdsToRemove =
@@ -309,20 +319,22 @@
     if (circleIds == null) {
       return <CircleId>{};
     }
-    return circleIds.map((dynamic circleId) => CircleId(circleId)).toSet();
+    return circleIds
+        .map((dynamic circleId) => CircleId(circleId as String))
+        .toSet();
   }
 
   Set<Circle> _deserializeCircles(dynamic circles) {
     if (circles == null) {
       return <Circle>{};
     }
-    final List<dynamic> circlesData = circles;
+    final List<dynamic> circlesData = circles as List<dynamic>;
     final Set<Circle> result = <Circle>{};
-    for (Map<dynamic, dynamic> circleData
+    for (final Map<dynamic, dynamic> circleData
         in circlesData.cast<Map<dynamic, dynamic>>()) {
-      final String circleId = circleData['circleId'];
-      final bool visible = circleData['visible'];
-      final double radius = circleData['radius'];
+      final String circleId = circleData['circleId'] as String;
+      final bool visible = circleData['visible'] as bool;
+      final double radius = circleData['radius'] as double;
 
       result.add(Circle(
         circleId: CircleId(circleId),
@@ -349,12 +361,12 @@
       return <TileOverlay>{};
     }
     final Set<TileOverlay> result = <TileOverlay>{};
-    for (Map<dynamic, dynamic> tileOverlayData in tileOverlays) {
-      final String tileOverlayId = tileOverlayData['tileOverlayId'];
-      final bool fadeIn = tileOverlayData['fadeIn'];
-      final double transparency = tileOverlayData['transparency'];
-      final int zIndex = tileOverlayData['zIndex'];
-      final bool visible = tileOverlayData['visible'];
+    for (final Map<dynamic, dynamic> tileOverlayData in tileOverlays) {
+      final String tileOverlayId = tileOverlayData['tileOverlayId'] as String;
+      final bool fadeIn = tileOverlayData['fadeIn'] as bool;
+      final double transparency = tileOverlayData['transparency'] as double;
+      final int zIndex = tileOverlayData['zIndex'] as int;
+      final bool visible = tileOverlayData['visible'] as bool;
 
       result.add(TileOverlay(
         tileOverlayId: TileOverlayId(tileOverlayId),
@@ -370,60 +382,62 @@
 
   void updateOptions(Map<dynamic, dynamic> options) {
     if (options.containsKey('compassEnabled')) {
-      compassEnabled = options['compassEnabled'];
+      compassEnabled = options['compassEnabled'] as bool?;
     }
     if (options.containsKey('mapToolbarEnabled')) {
-      mapToolbarEnabled = options['mapToolbarEnabled'];
+      mapToolbarEnabled = options['mapToolbarEnabled'] as bool?;
     }
     if (options.containsKey('cameraTargetBounds')) {
-      final List<dynamic> boundsList = options['cameraTargetBounds'];
+      final List<dynamic> boundsList =
+          options['cameraTargetBounds'] as List<dynamic>;
       cameraTargetBounds = boundsList[0] == null
           ? CameraTargetBounds.unbounded
           : CameraTargetBounds(LatLngBounds.fromList(boundsList[0]));
     }
     if (options.containsKey('mapType')) {
-      mapType = MapType.values[options['mapType']];
+      mapType = MapType.values[options['mapType'] as int];
     }
     if (options.containsKey('minMaxZoomPreference')) {
-      final List<dynamic> minMaxZoomList = options['minMaxZoomPreference'];
-      minMaxZoomPreference =
-          MinMaxZoomPreference(minMaxZoomList[0], minMaxZoomList[1]);
+      final List<dynamic> minMaxZoomList =
+          options['minMaxZoomPreference'] as List<dynamic>;
+      minMaxZoomPreference = MinMaxZoomPreference(
+          minMaxZoomList[0] as double?, minMaxZoomList[1] as double?);
     }
     if (options.containsKey('rotateGesturesEnabled')) {
-      rotateGesturesEnabled = options['rotateGesturesEnabled'];
+      rotateGesturesEnabled = options['rotateGesturesEnabled'] as bool?;
     }
     if (options.containsKey('scrollGesturesEnabled')) {
-      scrollGesturesEnabled = options['scrollGesturesEnabled'];
+      scrollGesturesEnabled = options['scrollGesturesEnabled'] as bool?;
     }
     if (options.containsKey('tiltGesturesEnabled')) {
-      tiltGesturesEnabled = options['tiltGesturesEnabled'];
+      tiltGesturesEnabled = options['tiltGesturesEnabled'] as bool?;
     }
     if (options.containsKey('trackCameraPosition')) {
-      trackCameraPosition = options['trackCameraPosition'];
+      trackCameraPosition = options['trackCameraPosition'] as bool?;
     }
     if (options.containsKey('zoomGesturesEnabled')) {
-      zoomGesturesEnabled = options['zoomGesturesEnabled'];
+      zoomGesturesEnabled = options['zoomGesturesEnabled'] as bool?;
     }
     if (options.containsKey('zoomControlsEnabled')) {
-      zoomControlsEnabled = options['zoomControlsEnabled'];
+      zoomControlsEnabled = options['zoomControlsEnabled'] as bool?;
     }
     if (options.containsKey('liteModeEnabled')) {
-      liteModeEnabled = options['liteModeEnabled'];
+      liteModeEnabled = options['liteModeEnabled'] as bool?;
     }
     if (options.containsKey('myLocationEnabled')) {
-      myLocationEnabled = options['myLocationEnabled'];
+      myLocationEnabled = options['myLocationEnabled'] as bool?;
     }
     if (options.containsKey('myLocationButtonEnabled')) {
-      myLocationButtonEnabled = options['myLocationButtonEnabled'];
+      myLocationButtonEnabled = options['myLocationButtonEnabled'] as bool?;
     }
     if (options.containsKey('trafficEnabled')) {
-      trafficEnabled = options['trafficEnabled'];
+      trafficEnabled = options['trafficEnabled'] as bool?;
     }
     if (options.containsKey('buildingsEnabled')) {
-      buildingsEnabled = options['buildingsEnabled'];
+      buildingsEnabled = options['buildingsEnabled'] as bool?;
     }
     if (options.containsKey('padding')) {
-      padding = options['padding'];
+      padding = options['padding'] as List<dynamic>?;
     }
   }
 }
@@ -434,10 +448,12 @@
   Future<dynamic> fakePlatformViewsMethodHandler(MethodCall call) {
     switch (call.method) {
       case 'create':
-        final Map<dynamic, dynamic> args = call.arguments;
-        final Map<dynamic, dynamic> params = _decodeParams(args['params'])!;
+        final Map<dynamic, dynamic> args =
+            call.arguments as Map<dynamic, dynamic>;
+        final Map<dynamic, dynamic> params =
+            _decodeParams(args['params'] as Uint8List)!;
         lastCreatedView = FakePlatformGoogleMap(
-          args['id'],
+          args['id'] as int,
           params,
         );
         return Future<int>.sync(() => 1);
@@ -457,5 +473,6 @@
     paramsMessage.offsetInBytes,
     paramsMessage.lengthInBytes,
   );
-  return const StandardMessageCodec().decodeMessage(messageBytes);
+  return const StandardMessageCodec().decodeMessage(messageBytes)
+      as Map<dynamic, dynamic>?;
 }
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
index 6b3ac90..73e1e77 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart
@@ -32,7 +32,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: Column(
-          children: const [
+          children: const <Widget>[
             GoogleMap(
               initialCameraPosition: CameraPosition(
                 target: LatLng(43.362, -5.849),
@@ -57,7 +57,7 @@
   testWidgets('Calls platform.dispose when GoogleMap is disposed of', (
     WidgetTester tester,
   ) async {
-    await tester.pumpWidget(GoogleMap(
+    await tester.pumpWidget(const GoogleMap(
       initialCameraPosition: CameraPosition(
         target: LatLng(43.3608, -5.8702),
       ),
@@ -81,8 +81,8 @@
   bool disposed = false;
 
   // Stream controller to inject events for testing.
-  final StreamController<MapEvent> mapEventStreamController =
-      StreamController<MapEvent>.broadcast();
+  final StreamController<MapEvent<dynamic>> mapEventStreamController =
+      StreamController<MapEvent<dynamic>>.broadcast();
 
   @override
   Future<void> init(int mapId) async {}
@@ -151,7 +151,8 @@
   Future<LatLngBounds> getVisibleRegion({
     required int mapId,
   }) async {
-    return LatLngBounds(southwest: LatLng(0, 0), northeast: LatLng(0, 0));
+    return LatLngBounds(
+        southwest: const LatLng(0, 0), northeast: const LatLng(0, 0));
   }
 
   @override
@@ -159,7 +160,7 @@
     LatLng latLng, {
     required int mapId,
   }) async {
-    return ScreenCoordinate(x: 0, y: 0);
+    return const ScreenCoordinate(x: 0, y: 0);
   }
 
   @override
@@ -167,7 +168,7 @@
     ScreenCoordinate screenCoordinate, {
     required int mapId,
   }) async {
-    return LatLng(0, 0);
+    return const LatLng(0, 0);
   }
 
   @override
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/marker_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/marker_updates_test.dart
index e295393..b5bba55 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/marker_updates_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/marker_updates_test.dart
@@ -35,7 +35,7 @@
   });
 
   testWidgets('Initializing a marker', (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -48,9 +48,9 @@
     expect(platformGoogleMap.markersToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a marker", (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    final Marker m2 = Marker(markerId: MarkerId("marker_2"));
+  testWidgets('Adding a marker', (WidgetTester tester) async {
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
+    const Marker m2 = Marker(markerId: MarkerId('marker_2'));
 
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1}));
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1, m2}));
@@ -67,8 +67,8 @@
     expect(platformGoogleMap.markersToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a marker", (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
+  testWidgets('Removing a marker', (WidgetTester tester) async {
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
 
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1}));
     await tester.pumpWidget(_mapWithMarkers(<Marker>{}));
@@ -82,9 +82,9 @@
     expect(platformGoogleMap.markersToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a marker", (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    final Marker m2 = Marker(markerId: MarkerId("marker_1"), alpha: 0.5);
+  testWidgets('Updating a marker', (WidgetTester tester) async {
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
+    const Marker m2 = Marker(markerId: MarkerId('marker_1'), alpha: 0.5);
 
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1}));
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m2}));
@@ -98,11 +98,11 @@
     expect(platformGoogleMap.markersToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a marker", (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    final Marker m2 = Marker(
-      markerId: MarkerId("marker_1"),
-      infoWindow: const InfoWindow(snippet: 'changed'),
+  testWidgets('Updating a marker', (WidgetTester tester) async {
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
+    const Marker m2 = Marker(
+      markerId: MarkerId('marker_1'),
+      infoWindow: InfoWindow(snippet: 'changed'),
     );
 
     await tester.pumpWidget(_mapWithMarkers(<Marker>{m1}));
@@ -117,12 +117,12 @@
     expect(update.infoWindow.snippet, 'changed');
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    Marker m2 = Marker(markerId: MarkerId("marker_2"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Marker m1 = const Marker(markerId: MarkerId('marker_1'));
+    Marker m2 = const Marker(markerId: MarkerId('marker_2'));
     final Set<Marker> prev = <Marker>{m1, m2};
-    m1 = Marker(markerId: MarkerId("marker_1"), visible: false);
-    m2 = Marker(markerId: MarkerId("marker_2"), draggable: true);
+    m1 = const Marker(markerId: MarkerId('marker_1'), visible: false);
+    m2 = const Marker(markerId: MarkerId('marker_2'), draggable: true);
     final Set<Marker> cur = <Marker>{m1, m2};
 
     await tester.pumpWidget(_mapWithMarkers(prev));
@@ -136,14 +136,14 @@
     expect(platformGoogleMap.markersToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Marker m2 = Marker(markerId: MarkerId("marker_2"));
-    final Marker m3 = Marker(markerId: MarkerId("marker_3"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Marker m2 = const Marker(markerId: MarkerId('marker_2'));
+    const Marker m3 = Marker(markerId: MarkerId('marker_3'));
     final Set<Marker> prev = <Marker>{m2, m3};
 
     // m1 is added, m2 is updated, m3 is removed.
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    m2 = Marker(markerId: MarkerId("marker_2"), draggable: true);
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
+    m2 = const Marker(markerId: MarkerId('marker_2'), draggable: true);
     final Set<Marker> cur = <Marker>{m1, m2};
 
     await tester.pumpWidget(_mapWithMarkers(prev));
@@ -161,12 +161,12 @@
     expect(platformGoogleMap.markerIdsToRemove.first, equals(m3.markerId));
   });
 
-  testWidgets("Partial Update", (WidgetTester tester) async {
-    final Marker m1 = Marker(markerId: MarkerId("marker_1"));
-    final Marker m2 = Marker(markerId: MarkerId("marker_2"));
-    Marker m3 = Marker(markerId: MarkerId("marker_3"));
+  testWidgets('Partial Update', (WidgetTester tester) async {
+    const Marker m1 = Marker(markerId: MarkerId('marker_1'));
+    const Marker m2 = Marker(markerId: MarkerId('marker_2'));
+    Marker m3 = const Marker(markerId: MarkerId('marker_3'));
     final Set<Marker> prev = <Marker>{m1, m2, m3};
-    m3 = Marker(markerId: MarkerId("marker_3"), draggable: true);
+    m3 = const Marker(markerId: MarkerId('marker_3'), draggable: true);
     final Set<Marker> cur = <Marker>{m1, m2, m3};
 
     await tester.pumpWidget(_mapWithMarkers(prev));
@@ -180,12 +180,12 @@
     expect(platformGoogleMap.markersToAdd.isEmpty, true);
   });
 
-  testWidgets("Update non platform related attr", (WidgetTester tester) async {
-    Marker m1 = Marker(markerId: MarkerId("marker_1"));
+  testWidgets('Update non platform related attr', (WidgetTester tester) async {
+    Marker m1 = const Marker(markerId: MarkerId('marker_1'));
     final Set<Marker> prev = <Marker>{m1};
     m1 = Marker(
-        markerId: MarkerId("marker_1"),
-        onTap: () => print("hello"),
+        markerId: const MarkerId('marker_1'),
+        onTap: () => print('hello'),
         onDragEnd: (LatLng latLng) => print(latLng));
     final Set<Marker> cur = <Marker>{m1};
 
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart
index 79c63c1..cb7263c 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart
@@ -23,9 +23,9 @@
   required double size,
   LatLng center = const LatLng(0, 0),
 }) {
-  final halfSize = size / 2;
+  final double halfSize = size / 2;
 
-  return [
+  return <LatLng>[
     LatLng(center.latitude + halfSize, center.longitude + halfSize),
     LatLng(center.latitude - halfSize, center.longitude + halfSize),
     LatLng(center.latitude - halfSize, center.longitude - halfSize),
@@ -38,7 +38,7 @@
   return Polygon(
     polygonId: polygonId,
     points: _rectPoints(size: 1),
-    holes: [_rectPoints(size: 0.5)],
+    holes: <List<LatLng>>[_rectPoints(size: 0.5)],
   );
 }
 
@@ -58,7 +58,7 @@
   });
 
   testWidgets('Initializing a polygon', (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -71,9 +71,9 @@
     expect(platformGoogleMap.polygonsToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a polygon", (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    final Polygon p2 = Polygon(polygonId: PolygonId("polygon_2"));
+  testWidgets('Adding a polygon', (WidgetTester tester) async {
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    const Polygon p2 = Polygon(polygonId: PolygonId('polygon_2'));
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1, p2}));
@@ -90,8 +90,8 @@
     expect(platformGoogleMap.polygonsToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a polygon", (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
+  testWidgets('Removing a polygon', (WidgetTester tester) async {
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{}));
@@ -105,10 +105,10 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a polygon", (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    final Polygon p2 =
-        Polygon(polygonId: PolygonId("polygon_1"), geodesic: true);
+  testWidgets('Updating a polygon', (WidgetTester tester) async {
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    const Polygon p2 =
+        Polygon(polygonId: PolygonId('polygon_1'), geodesic: true);
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p2}));
@@ -122,10 +122,11 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Mutate a polygon", (WidgetTester tester) async {
+  testWidgets('Mutate a polygon', (WidgetTester tester) async {
+    final List<LatLng> _points = <LatLng>[const LatLng(0.0, 0.0)];
     final Polygon p1 = Polygon(
-      polygonId: PolygonId("polygon_1"),
-      points: <LatLng>[const LatLng(0.0, 0.0)],
+      polygonId: const PolygonId('polygon_1'),
+      points: _points,
     );
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
@@ -141,12 +142,12 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    Polygon p2 = Polygon(polygonId: PolygonId("polygon_2"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Polygon p1 = const Polygon(polygonId: PolygonId('polygon_1'));
+    Polygon p2 = const Polygon(polygonId: PolygonId('polygon_2'));
     final Set<Polygon> prev = <Polygon>{p1, p2};
-    p1 = Polygon(polygonId: PolygonId("polygon_1"), visible: false);
-    p2 = Polygon(polygonId: PolygonId("polygon_2"), geodesic: true);
+    p1 = const Polygon(polygonId: PolygonId('polygon_1'), visible: false);
+    p2 = const Polygon(polygonId: PolygonId('polygon_2'), geodesic: true);
     final Set<Polygon> cur = <Polygon>{p1, p2};
 
     await tester.pumpWidget(_mapWithPolygons(prev));
@@ -160,14 +161,14 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Polygon p2 = Polygon(polygonId: PolygonId("polygon_2"));
-    final Polygon p3 = Polygon(polygonId: PolygonId("polygon_3"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Polygon p2 = const Polygon(polygonId: PolygonId('polygon_2'));
+    const Polygon p3 = Polygon(polygonId: PolygonId('polygon_3'));
     final Set<Polygon> prev = <Polygon>{p2, p3};
 
     // p1 is added, p2 is updated, p3 is removed.
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    p2 = Polygon(polygonId: PolygonId("polygon_2"), geodesic: true);
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    p2 = const Polygon(polygonId: PolygonId('polygon_2'), geodesic: true);
     final Set<Polygon> cur = <Polygon>{p1, p2};
 
     await tester.pumpWidget(_mapWithPolygons(prev));
@@ -185,12 +186,12 @@
     expect(platformGoogleMap.polygonIdsToRemove.first, equals(p3.polygonId));
   });
 
-  testWidgets("Partial Update", (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    final Polygon p2 = Polygon(polygonId: PolygonId("polygon_2"));
-    Polygon p3 = Polygon(polygonId: PolygonId("polygon_3"));
+  testWidgets('Partial Update', (WidgetTester tester) async {
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    const Polygon p2 = Polygon(polygonId: PolygonId('polygon_2'));
+    Polygon p3 = const Polygon(polygonId: PolygonId('polygon_3'));
     final Set<Polygon> prev = <Polygon>{p1, p2, p3};
-    p3 = Polygon(polygonId: PolygonId("polygon_3"), geodesic: true);
+    p3 = const Polygon(polygonId: PolygonId('polygon_3'), geodesic: true);
     final Set<Polygon> cur = <Polygon>{p1, p2, p3};
 
     await tester.pumpWidget(_mapWithPolygons(prev));
@@ -204,10 +205,11 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Update non platform related attr", (WidgetTester tester) async {
-    Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
+  testWidgets('Update non platform related attr', (WidgetTester tester) async {
+    Polygon p1 = const Polygon(polygonId: PolygonId('polygon_1'));
     final Set<Polygon> prev = <Polygon>{p1};
-    p1 = Polygon(polygonId: PolygonId("polygon_1"), onTap: () => print(2 + 2));
+    p1 = Polygon(
+        polygonId: const PolygonId('polygon_1'), onTap: () => print(2 + 2));
     final Set<Polygon> cur = <Polygon>{p1};
 
     await tester.pumpWidget(_mapWithPolygons(prev));
@@ -223,7 +225,7 @@
 
   testWidgets('Initializing a polygon with points and hole',
       (WidgetTester tester) async {
-    final Polygon p1 = _polygonWithPointsAndHole(PolygonId("polygon_1"));
+    final Polygon p1 = _polygonWithPointsAndHole(const PolygonId('polygon_1'));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -236,10 +238,10 @@
     expect(platformGoogleMap.polygonsToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a polygon with points and hole",
+  testWidgets('Adding a polygon with points and hole',
       (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    final Polygon p2 = _polygonWithPointsAndHole(PolygonId("polygon_2"));
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    final Polygon p2 = _polygonWithPointsAndHole(const PolygonId('polygon_2'));
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1, p2}));
@@ -256,9 +258,9 @@
     expect(platformGoogleMap.polygonsToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a polygon with points and hole",
+  testWidgets('Removing a polygon with points and hole',
       (WidgetTester tester) async {
-    final Polygon p1 = _polygonWithPointsAndHole(PolygonId("polygon_1"));
+    final Polygon p1 = _polygonWithPointsAndHole(const PolygonId('polygon_1'));
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{}));
@@ -272,10 +274,10 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a polygon by adding points and hole",
+  testWidgets('Updating a polygon by adding points and hole',
       (WidgetTester tester) async {
-    final Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
-    final Polygon p2 = _polygonWithPointsAndHole(PolygonId("polygon_1"));
+    const Polygon p1 = Polygon(polygonId: PolygonId('polygon_1'));
+    final Polygon p2 = _polygonWithPointsAndHole(const PolygonId('polygon_1'));
 
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p2}));
@@ -289,12 +291,12 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Mutate a polygon with points and holes",
+  testWidgets('Mutate a polygon with points and holes',
       (WidgetTester tester) async {
     final Polygon p1 = Polygon(
-      polygonId: PolygonId("polygon_1"),
+      polygonId: const PolygonId('polygon_1'),
       points: _rectPoints(size: 1),
-      holes: [_rectPoints(size: 0.5)],
+      holes: <List<LatLng>>[_rectPoints(size: 0.5)],
     );
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
@@ -303,7 +305,7 @@
       ..addAll(_rectPoints(size: 2));
     p1.holes
       ..clear()
-      ..addAll([_rectPoints(size: 1)]);
+      ..addAll(<List<LatLng>>[_rectPoints(size: 1)]);
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -315,19 +317,19 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update polygons with points and hole",
+  testWidgets('Multi Update polygons with points and hole',
       (WidgetTester tester) async {
-    Polygon p1 = Polygon(polygonId: PolygonId("polygon_1"));
+    Polygon p1 = const Polygon(polygonId: PolygonId('polygon_1'));
     Polygon p2 = Polygon(
-      polygonId: PolygonId("polygon_2"),
+      polygonId: const PolygonId('polygon_2'),
       points: _rectPoints(size: 2),
-      holes: [_rectPoints(size: 1)],
+      holes: <List<LatLng>>[_rectPoints(size: 1)],
     );
     final Set<Polygon> prev = <Polygon>{p1, p2};
-    p1 = Polygon(polygonId: PolygonId("polygon_1"), visible: false);
+    p1 = const Polygon(polygonId: PolygonId('polygon_1'), visible: false);
     p2 = p2.copyWith(
       pointsParam: _rectPoints(size: 5),
-      holesParam: [_rectPoints(size: 2)],
+      holesParam: <List<LatLng>>[_rectPoints(size: 2)],
     );
     final Set<Polygon> cur = <Polygon>{p1, p2};
 
@@ -342,21 +344,21 @@
     expect(platformGoogleMap.polygonsToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update polygons with points and hole",
+  testWidgets('Multi Update polygons with points and hole',
       (WidgetTester tester) async {
     Polygon p2 = Polygon(
-      polygonId: PolygonId("polygon_2"),
+      polygonId: const PolygonId('polygon_2'),
       points: _rectPoints(size: 2),
-      holes: [_rectPoints(size: 1)],
+      holes: <List<LatLng>>[_rectPoints(size: 1)],
     );
-    final Polygon p3 = Polygon(polygonId: PolygonId("polygon_3"));
+    const Polygon p3 = Polygon(polygonId: PolygonId('polygon_3'));
     final Set<Polygon> prev = <Polygon>{p2, p3};
 
     // p1 is added, p2 is updated, p3 is removed.
-    final Polygon p1 = _polygonWithPointsAndHole(PolygonId("polygon_1"));
+    final Polygon p1 = _polygonWithPointsAndHole(const PolygonId('polygon_1'));
     p2 = p2.copyWith(
       pointsParam: _rectPoints(size: 5),
-      holesParam: [_rectPoints(size: 3)],
+      holesParam: <List<LatLng>>[_rectPoints(size: 3)],
     );
     final Set<Polygon> cur = <Polygon>{p1, p2};
 
@@ -375,19 +377,19 @@
     expect(platformGoogleMap.polygonIdsToRemove.first, equals(p3.polygonId));
   });
 
-  testWidgets("Partial Update polygons with points and hole",
+  testWidgets('Partial Update polygons with points and hole',
       (WidgetTester tester) async {
-    final Polygon p1 = _polygonWithPointsAndHole(PolygonId("polygon_1"));
-    final Polygon p2 = Polygon(polygonId: PolygonId("polygon_2"));
+    final Polygon p1 = _polygonWithPointsAndHole(const PolygonId('polygon_1'));
+    const Polygon p2 = Polygon(polygonId: PolygonId('polygon_2'));
     Polygon p3 = Polygon(
-      polygonId: PolygonId("polygon_3"),
+      polygonId: const PolygonId('polygon_3'),
       points: _rectPoints(size: 2),
-      holes: [_rectPoints(size: 1)],
+      holes: <List<LatLng>>[_rectPoints(size: 1)],
     );
     final Set<Polygon> prev = <Polygon>{p1, p2, p3};
     p3 = p3.copyWith(
       pointsParam: _rectPoints(size: 5),
-      holesParam: [_rectPoints(size: 3)],
+      holesParam: <List<LatLng>>[_rectPoints(size: 3)],
     );
     final Set<Polygon> cur = <Polygon>{p1, p2, p3};
 
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart
index 01eb2e2..9cbba3a 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart
@@ -35,7 +35,7 @@
   });
 
   testWidgets('Initializing a polyline', (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -48,9 +48,9 @@
     expect(platformGoogleMap.polylinesToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a polyline", (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    final Polyline p2 = Polyline(polylineId: PolylineId("polyline_2"));
+  testWidgets('Adding a polyline', (WidgetTester tester) async {
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
+    const Polyline p2 = Polyline(polylineId: PolylineId('polyline_2'));
 
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1, p2}));
@@ -67,8 +67,8 @@
     expect(platformGoogleMap.polylinesToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a polyline", (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
+  testWidgets('Removing a polyline', (WidgetTester tester) async {
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
 
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{}));
@@ -82,10 +82,10 @@
     expect(platformGoogleMap.polylinesToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a polyline", (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    final Polyline p2 =
-        Polyline(polylineId: PolylineId("polyline_1"), geodesic: true);
+  testWidgets('Updating a polyline', (WidgetTester tester) async {
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
+    const Polyline p2 =
+        Polyline(polylineId: PolylineId('polyline_1'), geodesic: true);
 
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p2}));
@@ -99,10 +99,10 @@
     expect(platformGoogleMap.polylinesToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a polyline", (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    final Polyline p2 =
-        Polyline(polylineId: PolylineId("polyline_1"), geodesic: true);
+  testWidgets('Updating a polyline', (WidgetTester tester) async {
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
+    const Polyline p2 =
+        Polyline(polylineId: PolylineId('polyline_1'), geodesic: true);
 
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p2}));
@@ -116,10 +116,11 @@
     expect(update.geodesic, true);
   });
 
-  testWidgets("Mutate a polyline", (WidgetTester tester) async {
+  testWidgets('Mutate a polyline', (WidgetTester tester) async {
+    final List<LatLng> _points = <LatLng>[const LatLng(0.0, 0.0)];
     final Polyline p1 = Polyline(
-      polylineId: PolylineId("polyline_1"),
-      points: <LatLng>[const LatLng(0.0, 0.0)],
+      polylineId: const PolylineId('polyline_1'),
+      points: _points,
     );
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
 
@@ -135,12 +136,12 @@
     expect(platformGoogleMap.polylinesToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    Polyline p2 = Polyline(polylineId: PolylineId("polyline_2"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Polyline p1 = const Polyline(polylineId: PolylineId('polyline_1'));
+    Polyline p2 = const Polyline(polylineId: PolylineId('polyline_2'));
     final Set<Polyline> prev = <Polyline>{p1, p2};
-    p1 = Polyline(polylineId: PolylineId("polyline_1"), visible: false);
-    p2 = Polyline(polylineId: PolylineId("polyline_2"), geodesic: true);
+    p1 = const Polyline(polylineId: PolylineId('polyline_1'), visible: false);
+    p2 = const Polyline(polylineId: PolylineId('polyline_2'), geodesic: true);
     final Set<Polyline> cur = <Polyline>{p1, p2};
 
     await tester.pumpWidget(_mapWithPolylines(prev));
@@ -154,14 +155,14 @@
     expect(platformGoogleMap.polylinesToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
-    Polyline p2 = Polyline(polylineId: PolylineId("polyline_2"));
-    final Polyline p3 = Polyline(polylineId: PolylineId("polyline_3"));
+  testWidgets('Multi Update', (WidgetTester tester) async {
+    Polyline p2 = const Polyline(polylineId: PolylineId('polyline_2'));
+    const Polyline p3 = Polyline(polylineId: PolylineId('polyline_3'));
     final Set<Polyline> prev = <Polyline>{p2, p3};
 
     // p1 is added, p2 is updated, p3 is removed.
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    p2 = Polyline(polylineId: PolylineId("polyline_2"), geodesic: true);
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
+    p2 = const Polyline(polylineId: PolylineId('polyline_2'), geodesic: true);
     final Set<Polyline> cur = <Polyline>{p1, p2};
 
     await tester.pumpWidget(_mapWithPolylines(prev));
@@ -179,12 +180,12 @@
     expect(platformGoogleMap.polylineIdsToRemove.first, equals(p3.polylineId));
   });
 
-  testWidgets("Partial Update", (WidgetTester tester) async {
-    final Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"));
-    final Polyline p2 = Polyline(polylineId: PolylineId("polyline_2"));
-    Polyline p3 = Polyline(polylineId: PolylineId("polyline_3"));
+  testWidgets('Partial Update', (WidgetTester tester) async {
+    const Polyline p1 = Polyline(polylineId: PolylineId('polyline_1'));
+    const Polyline p2 = Polyline(polylineId: PolylineId('polyline_2'));
+    Polyline p3 = const Polyline(polylineId: PolylineId('polyline_3'));
     final Set<Polyline> prev = <Polyline>{p1, p2, p3};
-    p3 = Polyline(polylineId: PolylineId("polyline_3"), geodesic: true);
+    p3 = const Polyline(polylineId: PolylineId('polyline_3'), geodesic: true);
     final Set<Polyline> cur = <Polyline>{p1, p2, p3};
 
     await tester.pumpWidget(_mapWithPolylines(prev));
@@ -198,11 +199,12 @@
     expect(platformGoogleMap.polylinesToAdd.isEmpty, true);
   });
 
-  testWidgets("Update non platform related attr", (WidgetTester tester) async {
-    Polyline p1 = Polyline(polylineId: PolylineId("polyline_1"), onTap: null);
+  testWidgets('Update non platform related attr', (WidgetTester tester) async {
+    Polyline p1 =
+        const Polyline(polylineId: PolylineId('polyline_1'), onTap: null);
     final Set<Polyline> prev = <Polyline>{p1};
     p1 = Polyline(
-        polylineId: PolylineId("polyline_1"), onTap: () => print(2 + 2));
+        polylineId: const PolylineId('polyline_1'), onTap: () => print(2 + 2));
     final Set<Polyline> cur = <Polyline>{p1};
 
     await tester.pumpWidget(_mapWithPolylines(prev));
diff --git a/packages/google_maps_flutter/google_maps_flutter/test/tile_overlay_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/tile_overlay_updates_test.dart
index 35732da..b4586f7 100644
--- a/packages/google_maps_flutter/google_maps_flutter/test/tile_overlay_updates_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter/test/tile_overlay_updates_test.dart
@@ -33,8 +33,8 @@
   });
 
   testWidgets('Initializing a tile overlay', (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1}));
 
     final FakePlatformGoogleMap platformGoogleMap =
@@ -48,11 +48,11 @@
     expect(platformGoogleMap.tileOverlaysToChange.isEmpty, true);
   });
 
-  testWidgets("Adding a tile overlay", (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
-    final TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"));
+  testWidgets('Adding a tile overlay', (WidgetTester tester) async {
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
+    const TileOverlay t2 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_2'));
 
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1}));
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1, t2}));
@@ -69,9 +69,9 @@
     expect(platformGoogleMap.tileOverlaysToChange.isEmpty, true);
   });
 
-  testWidgets("Removing a tile overlay", (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
+  testWidgets('Removing a tile overlay', (WidgetTester tester) async {
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
 
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1}));
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{}));
@@ -86,11 +86,11 @@
     expect(platformGoogleMap.tileOverlaysToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a tile overlay", (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
-    final TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"), zIndex: 10);
+  testWidgets('Updating a tile overlay', (WidgetTester tester) async {
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
+    const TileOverlay t2 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'), zIndex: 10);
 
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1}));
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t2}));
@@ -104,11 +104,11 @@
     expect(platformGoogleMap.tileOverlaysToAdd.isEmpty, true);
   });
 
-  testWidgets("Updating a tile overlay", (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
-    final TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"), zIndex: 10);
+  testWidgets('Updating a tile overlay', (WidgetTester tester) async {
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
+    const TileOverlay t2 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'), zIndex: 10);
 
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t1}));
     await tester.pumpWidget(_mapWithTileOverlays(<TileOverlay>{t2}));
@@ -122,16 +122,16 @@
     expect(update.zIndex, 10);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
+  testWidgets('Multi Update', (WidgetTester tester) async {
     TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
+        const TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
     TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"));
+        const TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_2'));
     final Set<TileOverlay> prev = <TileOverlay>{t1, t2};
-    t1 = TileOverlay(
-        tileOverlayId: TileOverlayId("tile_overlay_1"), visible: false);
-    t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"), zIndex: 10);
+    t1 = const TileOverlay(
+        tileOverlayId: TileOverlayId('tile_overlay_1'), visible: false);
+    t2 = const TileOverlay(
+        tileOverlayId: TileOverlayId('tile_overlay_2'), zIndex: 10);
     final Set<TileOverlay> cur = <TileOverlay>{t1, t2};
 
     await tester.pumpWidget(_mapWithTileOverlays(prev));
@@ -145,18 +145,18 @@
     expect(platformGoogleMap.tileOverlaysToAdd.isEmpty, true);
   });
 
-  testWidgets("Multi Update", (WidgetTester tester) async {
+  testWidgets('Multi Update', (WidgetTester tester) async {
     TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"));
-    final TileOverlay t3 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_3"));
+        const TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_2'));
+    const TileOverlay t3 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_3'));
     final Set<TileOverlay> prev = <TileOverlay>{t2, t3};
 
     // t1 is added, t2 is updated, t3 is removed.
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
-    t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"), zIndex: 10);
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
+    t2 = const TileOverlay(
+        tileOverlayId: TileOverlayId('tile_overlay_2'), zIndex: 10);
     final Set<TileOverlay> cur = <TileOverlay>{t1, t2};
 
     await tester.pumpWidget(_mapWithTileOverlays(prev));
@@ -175,16 +175,16 @@
         equals(t3.tileOverlayId));
   });
 
-  testWidgets("Partial Update", (WidgetTester tester) async {
-    final TileOverlay t1 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_1"));
-    final TileOverlay t2 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_2"));
+  testWidgets('Partial Update', (WidgetTester tester) async {
+    const TileOverlay t1 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_1'));
+    const TileOverlay t2 =
+        TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_2'));
     TileOverlay t3 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_3"));
+        const TileOverlay(tileOverlayId: TileOverlayId('tile_overlay_3'));
     final Set<TileOverlay> prev = <TileOverlay>{t1, t2, t3};
-    t3 =
-        TileOverlay(tileOverlayId: TileOverlayId("tile_overlay_3"), zIndex: 10);
+    t3 = const TileOverlay(
+        tileOverlayId: TileOverlayId('tile_overlay_3'), zIndex: 10);
     final Set<TileOverlay> cur = <TileOverlay>{t1, t2, t3};
 
     await tester.pumpWidget(_mapWithTileOverlays(prev));
diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml
index 89d061f..e08024c 100644
--- a/script/configs/custom_analysis.yaml
+++ b/script/configs/custom_analysis.yaml
@@ -11,7 +11,6 @@
 
 # TODO(ecosystem): Remove everything from this list. See:
 # https://github.com/flutter/flutter/issues/76229
-- google_maps_flutter/google_maps_flutter
 - google_maps_flutter/google_maps_flutter_platform_interface
 - google_maps_flutter/google_maps_flutter_web
 - in_app_purchase/in_app_purchase
