diff --git a/analysis_options.yaml b/analysis_options.yaml
index a8cff3c..98352af 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -143,7 +143,7 @@
     # - no_default_cases # LOCAL CHANGE - Needs to be enabled and violations fixed.
     - no_duplicate_case_values
     - no_leading_underscores_for_library_prefixes
-    # - no_leading_underscores_for_local_identifiers # LOCAL CHANGE - Needs to be enabled and violations fixed.
+    - no_leading_underscores_for_local_identifiers
     - no_logic_in_create_state
     # - no_runtimeType_toString # ok in tests; we enable this only in packages/
     - non_constant_identifier_names
diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index 6f4a9f4..30bb098 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.10.0+3
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 0.10.0+2
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart
index 557f485..b233d49 100644
--- a/packages/camera/camera/example/integration_test/camera_test.dart
+++ b/packages/camera/camera/example/integration_test/camera_test.dart
@@ -221,16 +221,16 @@
       );
 
       await controller.initialize();
-      bool _isDetecting = false;
+      bool isDetecting = false;
 
       await controller.startImageStream((CameraImage image) {
-        if (_isDetecting) {
+        if (isDetecting) {
           return;
         }
 
-        _isDetecting = true;
+        isDetecting = true;
 
-        expectLater(image, isNotNull).whenComplete(() => _isDetecting = false);
+        expectLater(image, isNotNull).whenComplete(() => isDetecting = false);
       });
 
       expect(controller.value.isStreamingImages, true);
@@ -254,19 +254,19 @@
     );
 
     await controller.initialize();
-    final Completer<CameraImage> _completer = Completer<CameraImage>();
+    final Completer<CameraImage> completer = Completer<CameraImage>();
 
     await controller.startImageStream((CameraImage image) {
-      if (!_completer.isCompleted) {
+      if (!completer.isCompleted) {
         Future<void>(() async {
           await controller.stopImageStream();
           await controller.dispose();
         }).then((Object? value) {
-          _completer.complete(image);
+          completer.complete(image);
         });
       }
     });
-    return _completer.future;
+    return completer.future;
   }
 
   testWidgets(
@@ -277,20 +277,20 @@
         return;
       }
 
-      CameraImage _image = await startStreaming(cameras, null);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.bgra8888);
-      expect(_image.planes.length, 1);
+      CameraImage image = await startStreaming(cameras, null);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.bgra8888);
+      expect(image.planes.length, 1);
 
-      _image = await startStreaming(cameras, ImageFormatGroup.yuv420);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.yuv420);
-      expect(_image.planes.length, 2);
+      image = await startStreaming(cameras, ImageFormatGroup.yuv420);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.yuv420);
+      expect(image.planes.length, 2);
 
-      _image = await startStreaming(cameras, ImageFormatGroup.bgra8888);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.bgra8888);
-      expect(_image.planes.length, 1);
+      image = await startStreaming(cameras, ImageFormatGroup.bgra8888);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.bgra8888);
+      expect(image.planes.length, 1);
     },
     skip: !Platform.isIOS,
   );
diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart
index 13bb637..ed1c951 100644
--- a/packages/camera/camera/lib/src/camera_controller.dart
+++ b/packages/camera/camera/lib/src/camera_controller.dart
@@ -282,7 +282,7 @@
       );
     }
     try {
-      final Completer<CameraInitializedEvent> _initializeCompleter =
+      final Completer<CameraInitializedEvent> initializeCompleter =
           Completer<CameraInitializedEvent>();
 
       _deviceOrientationSubscription = CameraPlatform.instance
@@ -303,7 +303,7 @@
           .onCameraInitialized(_cameraId)
           .first
           .then((CameraInitializedEvent event) {
-        _initializeCompleter.complete(event);
+        initializeCompleter.complete(event);
       }));
 
       await CameraPlatform.instance.initializeCamera(
@@ -313,18 +313,18 @@
 
       value = value.copyWith(
         isInitialized: true,
-        previewSize: await _initializeCompleter.future
+        previewSize: await initializeCompleter.future
             .then((CameraInitializedEvent event) => Size(
                   event.previewWidth,
                   event.previewHeight,
                 )),
-        exposureMode: await _initializeCompleter.future
+        exposureMode: await initializeCompleter.future
             .then((CameraInitializedEvent event) => event.exposureMode),
-        focusMode: await _initializeCompleter.future
+        focusMode: await initializeCompleter.future
             .then((CameraInitializedEvent event) => event.focusMode),
-        exposurePointSupported: await _initializeCompleter.future.then(
+        exposurePointSupported: await initializeCompleter.future.then(
             (CameraInitializedEvent event) => event.exposurePointSupported),
-        focusPointSupported: await _initializeCompleter.future
+        focusPointSupported: await initializeCompleter.future
             .then((CameraInitializedEvent event) => event.focusPointSupported),
       );
     } on PlatformException catch (e) {
diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml
index 2770e97..1190989 100644
--- a/packages/camera/camera/pubspec.yaml
+++ b/packages/camera/camera/pubspec.yaml
@@ -4,7 +4,7 @@
   Dart.
 repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.10.0+2
+version: 0.10.0+3
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md
index f2417fb..af87147 100644
--- a/packages/camera/camera_android/CHANGELOG.md
+++ b/packages/camera/camera_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.10.0+3
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 0.10.0+2
 
 * Removes call to `join` on the camera's background `HandlerThread`.
diff --git a/packages/camera/camera_android/example/integration_test/camera_test.dart b/packages/camera/camera_android/example/integration_test/camera_test.dart
index 99029fc..3b1aae6 100644
--- a/packages/camera/camera_android/example/integration_test/camera_test.dart
+++ b/packages/camera/camera_android/example/integration_test/camera_test.dart
@@ -225,16 +225,16 @@
       );
 
       await controller.initialize();
-      bool _isDetecting = false;
+      bool isDetecting = false;
 
       await controller.startImageStream((CameraImageData image) {
-        if (_isDetecting) {
+        if (isDetecting) {
           return;
         }
 
-        _isDetecting = true;
+        isDetecting = true;
 
-        expectLater(image, isNotNull).whenComplete(() => _isDetecting = false);
+        expectLater(image, isNotNull).whenComplete(() => isDetecting = false);
       });
 
       expect(controller.value.isStreamingImages, true);
diff --git a/packages/camera/camera_android/example/lib/camera_controller.dart b/packages/camera/camera_android/example/lib/camera_controller.dart
index 5a7a79c..09441cc 100644
--- a/packages/camera/camera_android/example/lib/camera_controller.dart
+++ b/packages/camera/camera_android/example/lib/camera_controller.dart
@@ -203,7 +203,7 @@
 
   /// Initializes the camera on the device.
   Future<void> initialize() async {
-    final Completer<CameraInitializedEvent> _initializeCompleter =
+    final Completer<CameraInitializedEvent> initializeCompleter =
         Completer<CameraInitializedEvent>();
 
     _deviceOrientationSubscription = CameraPlatform.instance
@@ -224,7 +224,7 @@
         .onCameraInitialized(_cameraId)
         .first
         .then((CameraInitializedEvent event) {
-      _initializeCompleter.complete(event);
+      initializeCompleter.complete(event);
     });
 
     await CameraPlatform.instance.initializeCamera(
@@ -234,18 +234,18 @@
 
     value = value.copyWith(
       isInitialized: true,
-      previewSize: await _initializeCompleter.future
+      previewSize: await initializeCompleter.future
           .then((CameraInitializedEvent event) => Size(
                 event.previewWidth,
                 event.previewHeight,
               )),
-      exposureMode: await _initializeCompleter.future
+      exposureMode: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.exposureMode),
-      focusMode: await _initializeCompleter.future
+      focusMode: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.focusMode),
-      exposurePointSupported: await _initializeCompleter.future
+      exposurePointSupported: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.exposurePointSupported),
-      focusPointSupported: await _initializeCompleter.future
+      focusPointSupported: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.focusPointSupported),
     );
 
diff --git a/packages/camera/camera_android/lib/src/android_camera.dart b/packages/camera/camera_android/lib/src/android_camera.dart
index 3e9e52a..36077ea 100644
--- a/packages/camera/camera_android/lib/src/android_camera.dart
+++ b/packages/camera/camera_android/lib/src/android_camera.dart
@@ -126,10 +126,10 @@
       return channel;
     });
 
-    final Completer<void> _completer = Completer<void>();
+    final Completer<void> completer = Completer<void>();
 
     onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) {
-      _completer.complete();
+      completer.complete();
     });
 
     _channel.invokeMapMethod<String, dynamic>(
@@ -147,14 +147,14 @@
         if (error is! PlatformException) {
           throw error;
         }
-        _completer.completeError(
+        completer.completeError(
           CameraException(error.code, error.message),
           stackTrace,
         );
       },
     );
 
-    return _completer.future;
+    return completer.future;
   }
 
   @override
diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml
index 9f5a2f2..a464759 100644
--- a/packages/camera/camera_android/pubspec.yaml
+++ b/packages/camera/camera_android/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Android implementation of the camera plugin.
 repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.10.0+2
+version: 0.10.0+3
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md
index ab33c35..12d9a53 100644
--- a/packages/camera/camera_avfoundation/CHANGELOG.md
+++ b/packages/camera/camera_avfoundation/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.9.8+6
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 0.9.8+5
diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart
index 51eab63..3e62edc 100644
--- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart
+++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart
@@ -213,19 +213,19 @@
     );
 
     await controller.initialize();
-    final Completer<CameraImageData> _completer = Completer<CameraImageData>();
+    final Completer<CameraImageData> completer = Completer<CameraImageData>();
 
     await controller.startImageStream((CameraImageData image) {
-      if (!_completer.isCompleted) {
+      if (!completer.isCompleted) {
         Future<void>(() async {
           await controller.stopImageStream();
           await controller.dispose();
         }).then((Object? value) {
-          _completer.complete(image);
+          completer.complete(image);
         });
       }
     });
-    return _completer.future;
+    return completer.future;
   }
 
   testWidgets(
@@ -237,20 +237,20 @@
         return;
       }
 
-      CameraImageData _image = await startStreaming(cameras, null);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.bgra8888);
-      expect(_image.planes.length, 1);
+      CameraImageData image = await startStreaming(cameras, null);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.bgra8888);
+      expect(image.planes.length, 1);
 
-      _image = await startStreaming(cameras, ImageFormatGroup.yuv420);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.yuv420);
-      expect(_image.planes.length, 2);
+      image = await startStreaming(cameras, ImageFormatGroup.yuv420);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.yuv420);
+      expect(image.planes.length, 2);
 
-      _image = await startStreaming(cameras, ImageFormatGroup.bgra8888);
-      expect(_image, isNotNull);
-      expect(_image.format.group, ImageFormatGroup.bgra8888);
-      expect(_image.planes.length, 1);
+      image = await startStreaming(cameras, ImageFormatGroup.bgra8888);
+      expect(image, isNotNull);
+      expect(image.format.group, ImageFormatGroup.bgra8888);
+      expect(image.planes.length, 1);
     },
   );
 }
diff --git a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart
index 5a7a79c..09441cc 100644
--- a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart
+++ b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart
@@ -203,7 +203,7 @@
 
   /// Initializes the camera on the device.
   Future<void> initialize() async {
-    final Completer<CameraInitializedEvent> _initializeCompleter =
+    final Completer<CameraInitializedEvent> initializeCompleter =
         Completer<CameraInitializedEvent>();
 
     _deviceOrientationSubscription = CameraPlatform.instance
@@ -224,7 +224,7 @@
         .onCameraInitialized(_cameraId)
         .first
         .then((CameraInitializedEvent event) {
-      _initializeCompleter.complete(event);
+      initializeCompleter.complete(event);
     });
 
     await CameraPlatform.instance.initializeCamera(
@@ -234,18 +234,18 @@
 
     value = value.copyWith(
       isInitialized: true,
-      previewSize: await _initializeCompleter.future
+      previewSize: await initializeCompleter.future
           .then((CameraInitializedEvent event) => Size(
                 event.previewWidth,
                 event.previewHeight,
               )),
-      exposureMode: await _initializeCompleter.future
+      exposureMode: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.exposureMode),
-      focusMode: await _initializeCompleter.future
+      focusMode: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.focusMode),
-      exposurePointSupported: await _initializeCompleter.future
+      exposurePointSupported: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.exposurePointSupported),
-      focusPointSupported: await _initializeCompleter.future
+      focusPointSupported: await initializeCompleter.future
           .then((CameraInitializedEvent event) => event.focusPointSupported),
     );
 
diff --git a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
index 19054fe..9bdadfb 100644
--- a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
+++ b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
@@ -126,10 +126,10 @@
       return channel;
     });
 
-    final Completer<void> _completer = Completer<void>();
+    final Completer<void> completer = Completer<void>();
 
     onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) {
-      _completer.complete();
+      completer.complete();
     });
 
     _channel.invokeMapMethod<String, dynamic>(
@@ -147,14 +147,14 @@
         if (error is! PlatformException) {
           throw error;
         }
-        _completer.completeError(
+        completer.completeError(
           CameraException(error.code, error.message),
           stackTrace,
         );
       },
     );
 
-    return _completer.future;
+    return completer.future;
   }
 
   @override
diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml
index 4b5b67d..f394d59 100644
--- a/packages/camera/camera_avfoundation/pubspec.yaml
+++ b/packages/camera/camera_avfoundation/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS implementation of the camera plugin.
 repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_avfoundation
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.9.8+5
+version: 0.9.8+6
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md
index bdfbd44..d410304 100644
--- a/packages/camera/camera_platform_interface/CHANGELOG.md
+++ b/packages/camera/camera_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.2
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.2.1
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
index 68e1315..37c00d6 100644
--- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
+++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
@@ -118,10 +118,10 @@
       return channel;
     });
 
-    final Completer<void> _completer = Completer<void>();
+    final Completer<void> completer = Completer<void>();
 
     onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) {
-      _completer.complete();
+      completer.complete();
     });
 
     _channel.invokeMapMethod<String, dynamic>(
@@ -139,14 +139,14 @@
         if (error is! PlatformException) {
           throw error;
         }
-        _completer.completeError(
+        completer.completeError(
           CameraException(error.code, error.message),
           stackTrace,
         );
       },
     );
 
-    return _completer.future;
+    return completer.future;
   }
 
   @override
diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml
index 9cbd51b..e876792 100644
--- a/packages/camera/camera_platform_interface/pubspec.yaml
+++ b/packages/camera/camera_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.2.1
+version: 2.2.2
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md
index 10b0887..71c5d56 100644
--- a/packages/camera/camera_windows/CHANGELOG.md
+++ b/packages/camera/camera_windows/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 0.2.1+2
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 0.2.1+1
diff --git a/packages/camera/camera_windows/example/lib/main.dart b/packages/camera/camera_windows/example/lib/main.dart
index 3106304..d27edb8 100644
--- a/packages/camera/camera_windows/example/lib/main.dart
+++ b/packages/camera/camera_windows/example/lib/main.dart
@@ -187,8 +187,8 @@
   }
 
   Future<void> _takePicture() async {
-    final XFile _file = await CameraPlatform.instance.takePicture(_cameraId);
-    _showInSnackBar('Picture captured to: ${_file.path}');
+    final XFile file = await CameraPlatform.instance.takePicture(_cameraId);
+    _showInSnackBar('Picture captured to: ${file.path}');
   }
 
   Future<void> _recordTimed(int seconds) async {
@@ -228,10 +228,10 @@
         if (!_recording) {
           await CameraPlatform.instance.startVideoRecording(_cameraId);
         } else {
-          final XFile _file =
+          final XFile file =
               await CameraPlatform.instance.stopVideoRecording(_cameraId);
 
-          _showInSnackBar('Video captured to: ${_file.path}');
+          _showInSnackBar('Video captured to: ${file.path}');
         }
 
         if (mounted) {
diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml
index 403cb45..1eab9fa 100644
--- a/packages/camera/camera_windows/pubspec.yaml
+++ b/packages/camera/camera_windows/pubspec.yaml
@@ -2,7 +2,7 @@
 description: A Flutter plugin for getting information about and controlling the camera on Windows.
 repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_windows
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
-version: 0.2.1+1
+version: 0.2.1+2
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index 70298bc..3707aa8 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.2.1
 
 * Updates imports for `prefer_relative_imports`.
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 cb7263c..3495983 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
@@ -123,10 +123,10 @@
   });
 
   testWidgets('Mutate a polygon', (WidgetTester tester) async {
-    final List<LatLng> _points = <LatLng>[const LatLng(0.0, 0.0)];
+    final List<LatLng> points = <LatLng>[const LatLng(0.0, 0.0)];
     final Polygon p1 = Polygon(
       polygonId: const PolygonId('polygon_1'),
-      points: _points,
+      points: points,
     );
     await tester.pumpWidget(_mapWithPolygons(<Polygon>{p1}));
 
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 a2dad92..f9d0916 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
@@ -117,10 +117,10 @@
   });
 
   testWidgets('Mutate a polyline', (WidgetTester tester) async {
-    final List<LatLng> _points = <LatLng>[const LatLng(0.0, 0.0)];
+    final List<LatLng> points = <LatLng>[const LatLng(0.0, 0.0)];
     final Polyline p1 = Polyline(
       polylineId: const PolylineId('polyline_1'),
-      points: _points,
+      points: points,
     );
     await tester.pumpWidget(_mapWithPolylines(<Polyline>{p1}));
 
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
index 26e70d3..a41d1fe 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.2.4
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.2.3
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart
index 0051afc..efc319b 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart
@@ -31,7 +31,7 @@
     ///
     /// It is a programming error to call this with an ID that is not guaranteed
     /// to be in [currentObjects].
-    T _idToCurrentObject(MapsObjectId<T> id) {
+    T idToCurrentObject(MapsObjectId<T> id) {
       return currentObjects[id]!;
     }
 
@@ -39,7 +39,7 @@
 
     _objectsToAdd = currentObjectIds
         .difference(previousObjectIds)
-        .map(_idToCurrentObject)
+        .map(idToCurrentObject)
         .toSet();
 
     // Returns `true` if [current] is not equals to previous one with the
@@ -51,7 +51,7 @@
 
     _objectsToChange = currentObjectIds
         .intersection(previousObjectIds)
-        .map(_idToCurrentObject)
+        .map(idToCurrentObject)
         .where(hasChanged)
         .toSet();
   }
diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
index 853a23d..5639ee8 100644
--- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.2.3
+version: 2.2.4
 
 environment:
   sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
index b1ddd41..2333f7d 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 0.4.0+3
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart
index 4294f87..0226234 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart
@@ -37,7 +37,7 @@
     late StreamController<MapEvent<Object?>> stream;
 
     // Creates a controller with the default mapId and stream controller, and any `options` needed.
-    GoogleMapController _createController({
+    GoogleMapController createController({
       CameraPosition initialCameraPosition =
           const CameraPosition(target: LatLng(0, 0)),
       MapObjects mapObjects = const MapObjects(),
@@ -60,7 +60,7 @@
 
     group('construct/dispose', () {
       setUp(() {
-        controller = _createController();
+        controller = createController();
       });
 
       testWidgets('constructor creates widget', (WidgetTester tester) async {
@@ -223,7 +223,7 @@
       });
 
       testWidgets('listens to map events', (WidgetTester tester) async {
-        controller = _createController();
+        controller = createController();
         controller.debugSetOverrides(
           createMap: (_, __) => map,
           circles: circles,
@@ -262,7 +262,7 @@
 
       testWidgets("binds geometry controllers to map's",
           (WidgetTester tester) async {
-        controller = _createController();
+        controller = createController();
         controller.debugSetOverrides(
           createMap: (_, __) => map,
           circles: circles,
@@ -280,7 +280,7 @@
       });
 
       testWidgets('renders initial geometry', (WidgetTester tester) async {
-        controller = _createController(
+        controller = createController(
             mapObjects: MapObjects(circles: <Circle>{
           const Circle(
             circleId: CircleId('circle-1'),
@@ -360,7 +360,7 @@
 
       testWidgets('empty infoWindow does not create InfoWindow instance.',
           (WidgetTester tester) async {
-        controller = _createController(
+        controller = createController(
             mapObjects: MapObjects(markers: <Marker>{
           const Marker(markerId: MarkerId('marker-1')),
         }));
@@ -383,7 +383,7 @@
           capturedOptions = null;
         });
         testWidgets('translates initial options', (WidgetTester tester) async {
-          controller = _createController(
+          controller = createController(
               mapConfiguration: const MapConfiguration(
             mapType: MapType.satellite,
             zoomControlsEnabled: true,
@@ -406,7 +406,7 @@
 
         testWidgets('disables gestureHandling with scrollGesturesEnabled false',
             (WidgetTester tester) async {
-          controller = _createController(
+          controller = createController(
               mapConfiguration: const MapConfiguration(
             scrollGesturesEnabled: false,
           ));
@@ -426,7 +426,7 @@
 
         testWidgets('disables gestureHandling with zoomGesturesEnabled false',
             (WidgetTester tester) async {
-          controller = _createController(
+          controller = createController(
               mapConfiguration: const MapConfiguration(
             zoomGesturesEnabled: false,
           ));
@@ -446,7 +446,7 @@
 
         testWidgets('sets initial position when passed',
             (WidgetTester tester) async {
-          controller = _createController(
+          controller = createController(
             initialCameraPosition: const CameraPosition(
               target: LatLng(43.308, -5.6910),
               zoom: 12,
@@ -469,14 +469,14 @@
 
       group('Traffic Layer', () {
         testWidgets('by default is disabled', (WidgetTester tester) async {
-          controller = _createController();
+          controller = createController();
           controller.init();
           expect(controller.trafficLayer, isNull);
         });
 
         testWidgets('initializes with traffic layer',
             (WidgetTester tester) async {
-          controller = _createController(
+          controller = createController(
               mapConfiguration: const MapConfiguration(
             trafficEnabled: true,
           ));
@@ -498,7 +498,7 @@
             ..zoom = 10
             ..center = gmaps.LatLng(0, 0),
         );
-        controller = _createController();
+        controller = createController();
         controller.debugSetOverrides(createMap: (_, __) => map);
         controller.init();
       });
@@ -572,7 +572,7 @@
     // These are the methods that get forwarded to other controllers, so we just verify calls.
     group('Pass-through methods', () {
       setUp(() {
-        controller = _createController();
+        controller = createController();
       });
 
       testWidgets('updateCircles', (WidgetTester tester) async {
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart
index b4786c7..9bd1a68 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart
@@ -381,7 +381,7 @@
       });
 
       // Dispatches a few events in the global streamController, and expects *only* the passed event to be there.
-      Future<void> _testStreamFiltering(
+      Future<void> testStreamFiltering(
           Stream<MapEvent<Object?>> stream, MapEvent<Object?> event) async {
         Timer.run(() {
           streamController.add(_OtherMapEvent(mapId));
@@ -403,7 +403,7 @@
         final Stream<CameraMoveStartedEvent> stream =
             plugin.onCameraMoveStarted(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onCameraMoveStarted', (WidgetTester tester) async {
         final CameraMoveEvent event = CameraMoveEvent(
@@ -416,7 +416,7 @@
         final Stream<CameraMoveEvent> stream =
             plugin.onCameraMove(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onCameraIdle', (WidgetTester tester) async {
         final CameraIdleEvent event = CameraIdleEvent(mapId);
@@ -424,7 +424,7 @@
         final Stream<CameraIdleEvent> stream =
             plugin.onCameraIdle(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       // Marker events
       testWidgets('onMarkerTap', (WidgetTester tester) async {
@@ -435,7 +435,7 @@
 
         final Stream<MarkerTapEvent> stream = plugin.onMarkerTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onInfoWindowTap', (WidgetTester tester) async {
         final InfoWindowTapEvent event = InfoWindowTapEvent(
@@ -446,7 +446,7 @@
         final Stream<InfoWindowTapEvent> stream =
             plugin.onInfoWindowTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onMarkerDragStart', (WidgetTester tester) async {
         final MarkerDragStartEvent event = MarkerDragStartEvent(
@@ -458,7 +458,7 @@
         final Stream<MarkerDragStartEvent> stream =
             plugin.onMarkerDragStart(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onMarkerDrag', (WidgetTester tester) async {
         final MarkerDragEvent event = MarkerDragEvent(
@@ -470,7 +470,7 @@
         final Stream<MarkerDragEvent> stream =
             plugin.onMarkerDrag(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onMarkerDragEnd', (WidgetTester tester) async {
         final MarkerDragEndEvent event = MarkerDragEndEvent(
@@ -482,7 +482,7 @@
         final Stream<MarkerDragEndEvent> stream =
             plugin.onMarkerDragEnd(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       // Geometry
       testWidgets('onPolygonTap', (WidgetTester tester) async {
@@ -494,7 +494,7 @@
         final Stream<PolygonTapEvent> stream =
             plugin.onPolygonTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onPolylineTap', (WidgetTester tester) async {
         final PolylineTapEvent event = PolylineTapEvent(
@@ -505,7 +505,7 @@
         final Stream<PolylineTapEvent> stream =
             plugin.onPolylineTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onCircleTap', (WidgetTester tester) async {
         final CircleTapEvent event = CircleTapEvent(
@@ -515,7 +515,7 @@
 
         final Stream<CircleTapEvent> stream = plugin.onCircleTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       // Map taps
       testWidgets('onTap', (WidgetTester tester) async {
@@ -526,7 +526,7 @@
 
         final Stream<MapTapEvent> stream = plugin.onTap(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
       testWidgets('onLongPress', (WidgetTester tester) async {
         final MapLongPressEvent event = MapLongPressEvent(
@@ -537,7 +537,7 @@
         final Stream<MapLongPressEvent> stream =
             plugin.onLongPress(mapId: mapId);
 
-        await _testStreamFiltering(stream, event);
+        await testStreamFiltering(stream, event);
       });
     });
   });
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart
index e07ade0..6591b0c 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart
@@ -16,32 +16,32 @@
 
   // Since onTap/DragEnd events happen asynchronously, we need to store when the event
   // is fired. We use a completer so the test can wait for the future to be completed.
-  late Completer<bool> _methodCalledCompleter;
+  late Completer<bool> methodCalledCompleter;
 
-  /// This is the future value of the [_methodCalledCompleter]. Reinitialized
+  /// This is the future value of the [methodCalledCompleter]. Reinitialized
   /// in the [setUp] method, and completed (as `true`) by [onTap] and [onDragEnd]
   /// when those methods are called from the MarkerController.
   late Future<bool> methodCalled;
 
   void onTap() {
-    _methodCalledCompleter.complete(true);
+    methodCalledCompleter.complete(true);
   }
 
   void onDragStart(gmaps.LatLng _) {
-    _methodCalledCompleter.complete(true);
+    methodCalledCompleter.complete(true);
   }
 
   void onDrag(gmaps.LatLng _) {
-    _methodCalledCompleter.complete(true);
+    methodCalledCompleter.complete(true);
   }
 
   void onDragEnd(gmaps.LatLng _) {
-    _methodCalledCompleter.complete(true);
+    methodCalledCompleter.complete(true);
   }
 
   setUp(() {
-    _methodCalledCompleter = Completer<bool>();
-    methodCalled = _methodCalledCompleter.future;
+    methodCalledCompleter = Completer<bool>();
+    methodCalled = methodCalledCompleter.future;
   });
 
   group('MarkerController', () {
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart
index d142676..11af181 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart
@@ -15,20 +15,20 @@
 
   // Since onTap events happen asynchronously, we need to store when the event
   // is fired. We use a completer so the test can wait for the future to be completed.
-  late Completer<bool> _methodCalledCompleter;
+  late Completer<bool> methodCalledCompleter;
 
-  /// This is the future value of the [_methodCalledCompleter]. Reinitialized
+  /// This is the future value of the [methodCalledCompleter]. Reinitialized
   /// in the [setUp] method, and completed (as `true`) by [onTap], when it gets
   /// called by the corresponding Shape Controller.
   late Future<bool> methodCalled;
 
   void onTap() {
-    _methodCalledCompleter.complete(true);
+    methodCalledCompleter.complete(true);
   }
 
   setUp(() {
-    _methodCalledCompleter = Completer<bool>();
-    methodCalled = _methodCalledCompleter.future;
+    methodCalledCompleter = Completer<bool>();
+    methodCalled = methodCalledCompleter.future;
   });
 
   group('CircleController', () {
diff --git a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md
index 51842e4..2816e72 100644
--- a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md
+++ b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 0.10.2
diff --git a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart
index 12f8f2f..5dada90 100644
--- a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart
+++ b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart
@@ -71,7 +71,7 @@
   group('other methods also throw catchable exceptions on initialize fail', () {
     // This function ensures that initialize gets called, but for some reason,
     // we ignored that it has thrown stuff...
-    Future<void> _discardInit() async {
+    Future<void> discardInit() async {
       try {
         await plugin.init(
           hostedDomain: 'foo',
@@ -89,23 +89,23 @@
     });
 
     testWidgets('signInSilently throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(
           plugin.signInSilently(), throwsA(isA<PlatformException>()));
     });
 
     testWidgets('signIn throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.signIn(), throwsA(isA<PlatformException>()));
     });
 
     testWidgets('getTokens throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.getTokens(email: 'test@example.com'),
           throwsA(isA<PlatformException>()));
     });
     testWidgets('requestScopes', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.requestScopes(<String>['newScope']),
           throwsA(isA<PlatformException>()));
     });
diff --git a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart
index 81d9f14..3e803b8 100644
--- a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart
+++ b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart
@@ -66,7 +66,7 @@
       () {
     // This function ensures that initWithParams gets called, but for some
     // reason, we ignored that it has thrown stuff...
-    Future<void> _discardInit() async {
+    Future<void> discardInit() async {
       try {
         await plugin.initWithParams(const SignInInitParameters(
           hostedDomain: 'foo',
@@ -84,23 +84,23 @@
     });
 
     testWidgets('signInSilently throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(
           plugin.signInSilently(), throwsA(isA<PlatformException>()));
     });
 
     testWidgets('signIn throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.signIn(), throwsA(isA<PlatformException>()));
     });
 
     testWidgets('getTokens throws', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.getTokens(email: 'test@example.com'),
           throwsA(isA<PlatformException>()));
     });
     testWidgets('requestScopes', (WidgetTester tester) async {
-      await _discardInit();
+      await discardInit();
       await expectLater(plugin.requestScopes(<String>['newScope']),
           throwsA(isA<PlatformException>()));
     });
diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md
index 23bfe17..8a5c089 100644
--- a/packages/image_picker/image_picker_for_web/CHANGELOG.md
+++ b/packages/image_picker/image_picker_for_web/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.10
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.1.9
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart
index 5e0f18a..bb261f7 100644
--- a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart
+++ b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart
@@ -244,35 +244,35 @@
 
   /// Monitors an <input type="file"> and returns the selected file.
   Future<PickedFile> _getSelectedFile(html.FileUploadInputElement input) {
-    final Completer<PickedFile> _completer = Completer<PickedFile>();
+    final Completer<PickedFile> completer = Completer<PickedFile>();
     // Observe the input until we can return something
     input.onChange.first.then((html.Event event) {
       final List<html.File>? files = _handleOnChangeEvent(event);
-      if (!_completer.isCompleted && files != null) {
-        _completer.complete(PickedFile(
+      if (!completer.isCompleted && files != null) {
+        completer.complete(PickedFile(
           html.Url.createObjectUrl(files.first),
         ));
       }
     });
     input.onError.first.then((html.Event event) {
-      if (!_completer.isCompleted) {
-        _completer.completeError(event);
+      if (!completer.isCompleted) {
+        completer.completeError(event);
       }
     });
     // Note that we don't bother detaching from these streams, since the
     // "input" gets re-created in the DOM every time the user needs to
     // pick a file.
-    return _completer.future;
+    return completer.future;
   }
 
   /// Monitors an <input type="file"> and returns the selected file(s).
   Future<List<XFile>> _getSelectedXFiles(html.FileUploadInputElement input) {
-    final Completer<List<XFile>> _completer = Completer<List<XFile>>();
+    final Completer<List<XFile>> completer = Completer<List<XFile>>();
     // Observe the input until we can return something
     input.onChange.first.then((html.Event event) {
       final List<html.File>? files = _handleOnChangeEvent(event);
-      if (!_completer.isCompleted && files != null) {
-        _completer.complete(files.map((html.File file) {
+      if (!completer.isCompleted && files != null) {
+        completer.complete(files.map((html.File file) {
           return XFile(
             html.Url.createObjectUrl(file),
             name: file.name,
@@ -286,14 +286,14 @@
       }
     });
     input.onError.first.then((html.Event event) {
-      if (!_completer.isCompleted) {
-        _completer.completeError(event);
+      if (!completer.isCompleted) {
+        completer.completeError(event);
       }
     });
     // Note that we don't bother detaching from these streams, since the
     // "input" gets re-created in the DOM every time the user needs to
     // pick a file.
-    return _completer.future;
+    return completer.future;
   }
 
   /// Initializes a DOM container where we can host input elements.
diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml
index 14d9197..c2e0975 100644
--- a/packages/image_picker/image_picker_for_web/pubspec.yaml
+++ b/packages/image_picker/image_picker_for_web/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Web platform implementation of image_picker
 repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_for_web
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
-version: 2.1.9
+version: 2.1.10
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/path_provider/path_provider/CHANGELOG.md b/packages/path_provider/path_provider/CHANGELOG.md
index e19415f..4365235 100644
--- a/packages/path_provider/path_provider/CHANGELOG.md
+++ b/packages/path_provider/path_provider/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 * Fixes avoid_redundant_argument_values lint warnings and minor typos.
 
diff --git a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
index 1fe31df..bf150f6 100644
--- a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
+++ b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
@@ -58,7 +58,7 @@
     }
   });
 
-  final List<StorageDirectory?> _allDirs = <StorageDirectory?>[
+  final List<StorageDirectory?> allDirs = <StorageDirectory?>[
     null,
     StorageDirectory.music,
     StorageDirectory.podcasts,
@@ -69,7 +69,7 @@
     StorageDirectory.movies,
   ];
 
-  for (final StorageDirectory? type in _allDirs) {
+  for (final StorageDirectory? type in allDirs) {
     testWidgets('getExternalStorageDirectories (type: $type)',
         (WidgetTester tester) async {
       if (Platform.isIOS) {
diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md
index 93f0747..c36a771 100644
--- a/packages/path_provider/path_provider_android/CHANGELOG.md
+++ b/packages/path_provider/path_provider_android/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.0.20
diff --git a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
index 2be8813..ecd0b97 100644
--- a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
+++ b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
@@ -49,7 +49,7 @@
     }
   });
 
-  final List<StorageDirectory?> _allDirs = <StorageDirectory?>[
+  final List<StorageDirectory?> allDirs = <StorageDirectory?>[
     null,
     StorageDirectory.music,
     StorageDirectory.podcasts,
@@ -60,7 +60,7 @@
     StorageDirectory.movies,
   ];
 
-  for (final StorageDirectory? type in _allDirs) {
+  for (final StorageDirectory? type in allDirs) {
     testWidgets('getExternalStorageDirectories (type: $type)',
         (WidgetTester tester) async {
       final PathProviderPlatform provider = PathProviderPlatform.instance;
diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md
index d7c3aa4..b719ff1 100644
--- a/packages/shared_preferences/shared_preferences/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.0.15
diff --git a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart
index 0a02c46..30f7829 100755
--- a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart
@@ -171,22 +171,22 @@
     });
 
     group('mocking', () {
-      const String _key = 'dummy';
-      const String _prefixedKey = 'flutter.$_key';
+      const String key = 'dummy';
+      const String prefixedKey = 'flutter.$key';
 
       test('test 1', () async {
         SharedPreferences.setMockInitialValues(
-            <String, Object>{_prefixedKey: 'my string'});
+            <String, Object>{prefixedKey: 'my string'});
         final SharedPreferences prefs = await SharedPreferences.getInstance();
-        final String? value = prefs.getString(_key);
+        final String? value = prefs.getString(key);
         expect(value, 'my string');
       });
 
       test('test 2', () async {
         SharedPreferences.setMockInitialValues(
-            <String, Object>{_prefixedKey: 'my other string'});
+            <String, Object>{prefixedKey: 'my other string'});
         final SharedPreferences prefs = await SharedPreferences.getInstance();
-        final String? value = prefs.getString(_key);
+        final String? value = prefs.getString(key);
         expect(value, 'my other string');
       });
     });
diff --git a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
index 91a922d..f21af6a 100644
--- a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.0.13
 
 * Updates gradle to 7.2.2.
diff --git a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
index 275067d..4d4a85a 100644
--- a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
@@ -39,42 +39,42 @@
 
     // Normally the app-facing package adds the prefix, but since this test
     // bypasses the app-facing package it needs to be manually added.
-    String _prefixedKey(String key) {
+    String prefixedKey(String key) {
       return 'flutter.$key';
     }
 
     testWidgets('reading', (WidgetTester _) async {
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], isNull);
-      expect(values[_prefixedKey('bool')], isNull);
-      expect(values[_prefixedKey('int')], isNull);
-      expect(values[_prefixedKey('double')], isNull);
-      expect(values[_prefixedKey('List')], isNull);
+      expect(values[prefixedKey('String')], isNull);
+      expect(values[prefixedKey('bool')], isNull);
+      expect(values[prefixedKey('int')], isNull);
+      expect(values[prefixedKey('double')], isNull);
+      expect(values[prefixedKey('List')], isNull);
     });
 
     testWidgets('writing', (WidgetTester _) async {
       await Future.wait(<Future<bool>>[
         preferences.setValue(
-            'String', _prefixedKey('String'), kTestValues2['flutter.String']!),
+            'String', prefixedKey('String'), kTestValues2['flutter.String']!),
         preferences.setValue(
-            'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!),
+            'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!),
         preferences.setValue(
-            'Int', _prefixedKey('int'), kTestValues2['flutter.int']!),
+            'Int', prefixedKey('int'), kTestValues2['flutter.int']!),
         preferences.setValue(
-            'Double', _prefixedKey('double'), kTestValues2['flutter.double']!),
+            'Double', prefixedKey('double'), kTestValues2['flutter.double']!),
         preferences.setValue(
-            'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!)
+            'StringList', prefixedKey('List'), kTestValues2['flutter.List']!)
       ]);
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], kTestValues2['flutter.String']);
-      expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']);
-      expect(values[_prefixedKey('int')], kTestValues2['flutter.int']);
-      expect(values[_prefixedKey('double')], kTestValues2['flutter.double']);
-      expect(values[_prefixedKey('List')], kTestValues2['flutter.List']);
+      expect(values[prefixedKey('String')], kTestValues2['flutter.String']);
+      expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']);
+      expect(values[prefixedKey('int')], kTestValues2['flutter.int']);
+      expect(values[prefixedKey('double')], kTestValues2['flutter.double']);
+      expect(values[prefixedKey('List')], kTestValues2['flutter.List']);
     });
 
     testWidgets('removing', (WidgetTester _) async {
-      final String key = _prefixedKey('testKey');
+      final String key = prefixedKey('testKey');
       await preferences.setValue('String', key, kTestValues['flutter.String']!);
       await preferences.setValue('Bool', key, kTestValues['flutter.bool']!);
       await preferences.setValue('Int', key, kTestValues['flutter.int']!);
@@ -108,19 +108,19 @@
       final List<Future<bool>> writes = <Future<bool>>[];
       const int writeCount = 100;
       for (int i = 1; i <= writeCount; i++) {
-        writes.add(preferences.setValue('Int', _prefixedKey('int'), i));
+        writes.add(preferences.setValue('Int', prefixedKey('int'), i));
       }
       final List<bool> result = await Future.wait(writes, eagerError: true);
       // All writes should succeed.
       expect(result.where((bool element) => !element), isEmpty);
       // The last write should win.
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('int')], writeCount);
+      expect(values[prefixedKey('int')], writeCount);
     });
 
     testWidgets('string clash with lists, big integers and doubles',
         (WidgetTester _) async {
-      final String key = _prefixedKey('akey');
+      final String key = prefixedKey('akey');
       const String value = 'a string value';
       await preferences.clear();
 
diff --git a/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md b/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md
index 99dde9c..d2101e0 100644
--- a/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.1.1
diff --git a/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart
index 3a6bab5..b4b2187 100644
--- a/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart
@@ -38,42 +38,42 @@
 
     // Normally the app-facing package adds the prefix, but since this test
     // bypasses the app-facing package it needs to be manually added.
-    String _prefixedKey(String key) {
+    String prefixedKey(String key) {
       return 'flutter.$key';
     }
 
     testWidgets('reading', (WidgetTester _) async {
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], isNull);
-      expect(values[_prefixedKey('bool')], isNull);
-      expect(values[_prefixedKey('int')], isNull);
-      expect(values[_prefixedKey('double')], isNull);
-      expect(values[_prefixedKey('List')], isNull);
+      expect(values[prefixedKey('String')], isNull);
+      expect(values[prefixedKey('bool')], isNull);
+      expect(values[prefixedKey('int')], isNull);
+      expect(values[prefixedKey('double')], isNull);
+      expect(values[prefixedKey('List')], isNull);
     });
 
     testWidgets('writing', (WidgetTester _) async {
       await Future.wait(<Future<bool>>[
         preferences.setValue(
-            'String', _prefixedKey('String'), kTestValues2['flutter.String']!),
+            'String', prefixedKey('String'), kTestValues2['flutter.String']!),
         preferences.setValue(
-            'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!),
+            'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!),
         preferences.setValue(
-            'Int', _prefixedKey('int'), kTestValues2['flutter.int']!),
+            'Int', prefixedKey('int'), kTestValues2['flutter.int']!),
         preferences.setValue(
-            'Double', _prefixedKey('double'), kTestValues2['flutter.double']!),
+            'Double', prefixedKey('double'), kTestValues2['flutter.double']!),
         preferences.setValue(
-            'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!)
+            'StringList', prefixedKey('List'), kTestValues2['flutter.List']!)
       ]);
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], kTestValues2['flutter.String']);
-      expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']);
-      expect(values[_prefixedKey('int')], kTestValues2['flutter.int']);
-      expect(values[_prefixedKey('double')], kTestValues2['flutter.double']);
-      expect(values[_prefixedKey('List')], kTestValues2['flutter.List']);
+      expect(values[prefixedKey('String')], kTestValues2['flutter.String']);
+      expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']);
+      expect(values[prefixedKey('int')], kTestValues2['flutter.int']);
+      expect(values[prefixedKey('double')], kTestValues2['flutter.double']);
+      expect(values[prefixedKey('List')], kTestValues2['flutter.List']);
     });
 
     testWidgets('removing', (WidgetTester _) async {
-      final String key = _prefixedKey('testKey');
+      final String key = prefixedKey('testKey');
       await preferences.setValue('String', key, kTestValues['flutter.String']!);
       await preferences.setValue('Bool', key, kTestValues['flutter.bool']!);
       await preferences.setValue('Int', key, kTestValues['flutter.int']!);
diff --git a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
index 60f93f3..5d59660 100644
--- a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.1.1
diff --git a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
index 57acd17..176d1d9 100644
--- a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
+++ b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
@@ -20,22 +20,22 @@
     pathProvider = FakePathProviderLinux();
   });
 
-  Future<String> _getFilePath() async {
+  Future<String> getFilePath() async {
     final String? directory = await pathProvider.getApplicationSupportPath();
     return path.join(directory!, 'shared_preferences.json');
   }
 
-  Future<void> _writeTestFile(String value) async {
-    fs.file(await _getFilePath())
+  Future<void> writeTestFile(String value) async {
+    fs.file(await getFilePath())
       ..createSync(recursive: true)
       ..writeAsStringSync(value);
   }
 
-  Future<String> _readTestFile() async {
-    return fs.file(await _getFilePath()).readAsStringSync();
+  Future<String> readTestFile() async {
+    return fs.file(await getFilePath()).readAsStringSync();
   }
 
-  SharedPreferencesLinux _getPreferences() {
+  SharedPreferencesLinux getPreferences() {
     final SharedPreferencesLinux prefs = SharedPreferencesLinux();
     prefs.fs = fs;
     prefs.pathProvider = pathProvider;
@@ -49,8 +49,8 @@
   });
 
   test('getAll', () async {
-    await _writeTestFile('{"key1": "one", "key2": 2}');
-    final SharedPreferencesLinux prefs = _getPreferences();
+    await writeTestFile('{"key1": "one", "key2": 2}');
+    final SharedPreferencesLinux prefs = getPreferences();
 
     final Map<String, Object> values = await prefs.getAll();
     expect(values, hasLength(2));
@@ -59,30 +59,30 @@
   });
 
   test('remove', () async {
-    await _writeTestFile('{"key1":"one","key2":2}');
-    final SharedPreferencesLinux prefs = _getPreferences();
+    await writeTestFile('{"key1":"one","key2":2}');
+    final SharedPreferencesLinux prefs = getPreferences();
 
     await prefs.remove('key2');
 
-    expect(await _readTestFile(), '{"key1":"one"}');
+    expect(await readTestFile(), '{"key1":"one"}');
   });
 
   test('setValue', () async {
-    await _writeTestFile('{}');
-    final SharedPreferencesLinux prefs = _getPreferences();
+    await writeTestFile('{}');
+    final SharedPreferencesLinux prefs = getPreferences();
 
     await prefs.setValue('', 'key1', 'one');
     await prefs.setValue('', 'key2', 2);
 
-    expect(await _readTestFile(), '{"key1":"one","key2":2}');
+    expect(await readTestFile(), '{"key1":"one","key2":2}');
   });
 
   test('clear', () async {
-    await _writeTestFile('{"key1":"one","key2":2}');
-    final SharedPreferencesLinux prefs = _getPreferences();
+    await writeTestFile('{"key1":"one","key2":2}');
+    final SharedPreferencesLinux prefs = getPreferences();
 
     await prefs.clear();
-    expect(await _readTestFile(), '{}');
+    expect(await readTestFile(), '{}');
   });
 }
 
diff --git a/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md b/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md
index bc4e150..fc8a78a 100644
--- a/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.0.4
diff --git a/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart
index 874ceb4..a980eab 100644
--- a/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart
@@ -38,42 +38,42 @@
 
     // Normally the app-facing package adds the prefix, but since this test
     // bypasses the app-facing package it needs to be manually added.
-    String _prefixedKey(String key) {
+    String prefixedKey(String key) {
       return 'flutter.$key';
     }
 
     testWidgets('reading', (WidgetTester _) async {
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], isNull);
-      expect(values[_prefixedKey('bool')], isNull);
-      expect(values[_prefixedKey('int')], isNull);
-      expect(values[_prefixedKey('double')], isNull);
-      expect(values[_prefixedKey('List')], isNull);
+      expect(values[prefixedKey('String')], isNull);
+      expect(values[prefixedKey('bool')], isNull);
+      expect(values[prefixedKey('int')], isNull);
+      expect(values[prefixedKey('double')], isNull);
+      expect(values[prefixedKey('List')], isNull);
     });
 
     testWidgets('writing', (WidgetTester _) async {
       await Future.wait(<Future<bool>>[
         preferences.setValue(
-            'String', _prefixedKey('String'), kTestValues2['flutter.String']!),
+            'String', prefixedKey('String'), kTestValues2['flutter.String']!),
         preferences.setValue(
-            'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!),
+            'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!),
         preferences.setValue(
-            'Int', _prefixedKey('int'), kTestValues2['flutter.int']!),
+            'Int', prefixedKey('int'), kTestValues2['flutter.int']!),
         preferences.setValue(
-            'Double', _prefixedKey('double'), kTestValues2['flutter.double']!),
+            'Double', prefixedKey('double'), kTestValues2['flutter.double']!),
         preferences.setValue(
-            'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!)
+            'StringList', prefixedKey('List'), kTestValues2['flutter.List']!)
       ]);
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[_prefixedKey('String')], kTestValues2['flutter.String']);
-      expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']);
-      expect(values[_prefixedKey('int')], kTestValues2['flutter.int']);
-      expect(values[_prefixedKey('double')], kTestValues2['flutter.double']);
-      expect(values[_prefixedKey('List')], kTestValues2['flutter.List']);
+      expect(values[prefixedKey('String')], kTestValues2['flutter.String']);
+      expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']);
+      expect(values[prefixedKey('int')], kTestValues2['flutter.int']);
+      expect(values[prefixedKey('double')], kTestValues2['flutter.double']);
+      expect(values[prefixedKey('List')], kTestValues2['flutter.List']);
     });
 
     testWidgets('removing', (WidgetTester _) async {
-      final String key = _prefixedKey('testKey');
+      final String key = prefixedKey('testKey');
       await preferences.setValue('String', key, kTestValues['flutter.String']!);
       await preferences.setValue('Bool', key, kTestValues['flutter.bool']!);
       await preferences.setValue('Int', key, kTestValues['flutter.int']!);
diff --git a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
index b8351c8..935a5ee 100644
--- a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 
 ## 2.1.1
diff --git a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
index 0c47e98..04fa335 100644
--- a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
+++ b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
@@ -19,22 +19,22 @@
     pathProvider = FakePathProviderWindows();
   });
 
-  Future<String> _getFilePath() async {
+  Future<String> getFilePath() async {
     final String? directory = await pathProvider.getApplicationSupportPath();
     return path.join(directory!, 'shared_preferences.json');
   }
 
-  Future<void> _writeTestFile(String value) async {
-    fileSystem.file(await _getFilePath())
+  Future<void> writeTestFile(String value) async {
+    fileSystem.file(await getFilePath())
       ..createSync(recursive: true)
       ..writeAsStringSync(value);
   }
 
-  Future<String> _readTestFile() async {
-    return fileSystem.file(await _getFilePath()).readAsStringSync();
+  Future<String> readTestFile() async {
+    return fileSystem.file(await getFilePath()).readAsStringSync();
   }
 
-  SharedPreferencesWindows _getPreferences() {
+  SharedPreferencesWindows getPreferences() {
     final SharedPreferencesWindows prefs = SharedPreferencesWindows();
     prefs.fs = fileSystem;
     prefs.pathProvider = pathProvider;
@@ -48,8 +48,8 @@
   });
 
   test('getAll', () async {
-    await _writeTestFile('{"key1": "one", "key2": 2}');
-    final SharedPreferencesWindows prefs = _getPreferences();
+    await writeTestFile('{"key1": "one", "key2": 2}');
+    final SharedPreferencesWindows prefs = getPreferences();
 
     final Map<String, Object> values = await prefs.getAll();
     expect(values, hasLength(2));
@@ -58,30 +58,30 @@
   });
 
   test('remove', () async {
-    await _writeTestFile('{"key1":"one","key2":2}');
-    final SharedPreferencesWindows prefs = _getPreferences();
+    await writeTestFile('{"key1":"one","key2":2}');
+    final SharedPreferencesWindows prefs = getPreferences();
 
     await prefs.remove('key2');
 
-    expect(await _readTestFile(), '{"key1":"one"}');
+    expect(await readTestFile(), '{"key1":"one"}');
   });
 
   test('setValue', () async {
-    await _writeTestFile('{}');
-    final SharedPreferencesWindows prefs = _getPreferences();
+    await writeTestFile('{}');
+    final SharedPreferencesWindows prefs = getPreferences();
 
     await prefs.setValue('', 'key1', 'one');
     await prefs.setValue('', 'key2', 2);
 
-    expect(await _readTestFile(), '{"key1":"one","key2":2}');
+    expect(await readTestFile(), '{"key1":"one","key2":2}');
   });
 
   test('clear', () async {
-    await _writeTestFile('{"key1":"one","key2":2}');
-    final SharedPreferencesWindows prefs = _getPreferences();
+    await writeTestFile('{"key1":"one","key2":2}');
+    final SharedPreferencesWindows prefs = getPreferences();
 
     await prefs.clear();
-    expect(await _readTestFile(), '{}');
+    expect(await readTestFile(), '{}');
   });
 }
 
diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md
index 53cfabf..0885f28 100644
--- a/packages/video_player/video_player/CHANGELOG.md
+++ b/packages/video_player/video_player/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.4.7
 
 * Updates README via code excerpts.
diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart
index 023c4b3..dd77a2f 100644
--- a/packages/video_player/video_player/example/integration_test/video_player_test.dart
+++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart
@@ -37,22 +37,22 @@
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
-  late VideoPlayerController _controller;
-  tearDown(() async => _controller.dispose());
+  late VideoPlayerController controller;
+  tearDown(() async => controller.dispose());
 
   group('asset videos', () {
     setUp(() {
-      _controller = VideoPlayerController.asset(_videoAssetKey);
+      controller = VideoPlayerController.asset(_videoAssetKey);
     });
 
     testWidgets('can be initialized', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      expect(_controller.value.isInitialized, true);
-      expect(_controller.value.position, Duration.zero);
-      expect(_controller.value.isPlaying, false);
+      expect(controller.value.isInitialized, true);
+      expect(controller.value.position, Duration.zero);
+      expect(controller.value.isPlaying, false);
       // The WebM version has a slightly different duration than the MP4.
-      expect(_controller.value.duration,
+      expect(controller.value.duration,
           const Duration(seconds: 7, milliseconds: kIsWeb ? 544 : 540));
     });
 
@@ -77,16 +77,16 @@
     testWidgets(
       'can be played',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-        await _controller.setVolume(0);
+        await controller.setVolume(0);
 
-        await _controller.play();
+        await controller.play();
         await tester.pumpAndSettle(_playDuration);
 
-        expect(_controller.value.isPlaying, true);
-        expect(_controller.value.position,
+        expect(controller.value.isPlaying, true);
+        expect(controller.value.position,
             (Duration position) => position > Duration.zero);
       },
     );
@@ -94,85 +94,85 @@
     testWidgets(
       'can seek',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
 
-        await _controller.seekTo(const Duration(seconds: 3));
+        await controller.seekTo(const Duration(seconds: 3));
 
-        expect(_controller.value.position, const Duration(seconds: 3));
+        expect(controller.value.position, const Duration(seconds: 3));
       },
     );
 
     testWidgets(
       'can be paused',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-        await _controller.setVolume(0);
+        await controller.setVolume(0);
 
         // Play for a second, then pause, and then wait a second.
-        await _controller.play();
+        await controller.play();
         await tester.pumpAndSettle(_playDuration);
-        await _controller.pause();
-        final Duration pausedPosition = _controller.value.position;
+        await controller.pause();
+        final Duration pausedPosition = controller.value.position;
         await tester.pumpAndSettle(_playDuration);
 
         // Verify that we stopped playing after the pause.
-        expect(_controller.value.isPlaying, false);
-        expect(_controller.value.position, pausedPosition);
+        expect(controller.value.isPlaying, false);
+        expect(controller.value.position, pausedPosition);
       },
     );
 
     testWidgets(
       'stay paused when seeking after video completed',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-        await _controller.setVolume(0);
+        await controller.setVolume(0);
         final Duration tenMillisBeforeEnd =
-            _controller.value.duration - const Duration(milliseconds: 10);
-        await _controller.seekTo(tenMillisBeforeEnd);
-        await _controller.play();
+            controller.value.duration - const Duration(milliseconds: 10);
+        await controller.seekTo(tenMillisBeforeEnd);
+        await controller.play();
         await tester.pumpAndSettle(_playDuration);
-        expect(_controller.value.isPlaying, false);
-        expect(_controller.value.position, _controller.value.duration);
+        expect(controller.value.isPlaying, false);
+        expect(controller.value.position, controller.value.duration);
 
-        await _controller.seekTo(tenMillisBeforeEnd);
+        await controller.seekTo(tenMillisBeforeEnd);
         await tester.pumpAndSettle(_playDuration);
 
-        expect(_controller.value.isPlaying, false);
-        expect(_controller.value.position, tenMillisBeforeEnd);
+        expect(controller.value.isPlaying, false);
+        expect(controller.value.position, tenMillisBeforeEnd);
       },
     );
 
     testWidgets(
       'do not exceed duration on play after video completed',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-        await _controller.setVolume(0);
-        await _controller.seekTo(
-            _controller.value.duration - const Duration(milliseconds: 10));
-        await _controller.play();
+        await controller.setVolume(0);
+        await controller.seekTo(
+            controller.value.duration - const Duration(milliseconds: 10));
+        await controller.play();
         await tester.pumpAndSettle(_playDuration);
-        expect(_controller.value.isPlaying, false);
-        expect(_controller.value.position, _controller.value.duration);
+        expect(controller.value.isPlaying, false);
+        expect(controller.value.position, controller.value.duration);
 
-        await _controller.play();
+        await controller.play();
         await tester.pumpAndSettle(_playDuration);
 
-        expect(_controller.value.position,
-            lessThanOrEqualTo(_controller.value.duration));
+        expect(controller.value.position,
+            lessThanOrEqualTo(controller.value.duration));
       },
     );
 
     testWidgets('test video player view with local asset',
         (WidgetTester tester) async {
       Future<bool> started() async {
-        await _controller.initialize();
-        await _controller.play();
+        await controller.initialize();
+        await controller.play();
         return true;
       }
 
@@ -185,8 +185,8 @@
               builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                 if (snapshot.data ?? false) {
                   return AspectRatio(
-                    aspectRatio: _controller.value.aspectRatio,
-                    child: VideoPlayer(_controller),
+                    aspectRatio: controller.value.aspectRatio,
+                    child: VideoPlayer(controller),
                   );
                 } else {
                   return const Text('waiting for video to load');
@@ -198,7 +198,7 @@
       ));
 
       await tester.pumpAndSettle();
-      expect(_controller.value.isPlaying, true);
+      expect(controller.value.isPlaying, true);
     },
         skip: kIsWeb || // Web does not support local assets.
             // Extremely flaky on iOS: https://github.com/flutter/flutter/issues/86915
@@ -216,54 +216,54 @@
       final File file = File('$tempDir/$filename');
       await file.writeAsBytes(bytes.buffer.asInt8List());
 
-      _controller = VideoPlayerController.file(file);
+      controller = VideoPlayerController.file(file);
     });
 
     testWidgets('test video player using static file() method as constructor',
         (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.play();
-      expect(_controller.value.isPlaying, true);
+      await controller.play();
+      expect(controller.value.isPlaying, true);
 
-      await _controller.pause();
-      expect(_controller.value.isPlaying, false);
+      await controller.pause();
+      expect(controller.value.isPlaying, false);
     }, skip: kIsWeb);
   });
 
   group('network videos', () {
     setUp(() {
-      _controller = VideoPlayerController.network(
+      controller = VideoPlayerController.network(
           getUrlForAssetAsNetworkSource(_videoAssetKey));
     });
 
     testWidgets(
       'reports buffering status',
       (WidgetTester tester) async {
-        await _controller.initialize();
+        await controller.initialize();
         // Mute to allow playing without DOM interaction on Web.
         // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-        await _controller.setVolume(0);
+        await controller.setVolume(0);
         final Completer<void> started = Completer<void>();
         final Completer<void> ended = Completer<void>();
-        _controller.addListener(() {
-          if (!started.isCompleted && _controller.value.isBuffering) {
+        controller.addListener(() {
+          if (!started.isCompleted && controller.value.isBuffering) {
             started.complete();
           }
           if (started.isCompleted &&
-              !_controller.value.isBuffering &&
+              !controller.value.isBuffering &&
               !ended.isCompleted) {
             ended.complete();
           }
         });
 
-        await _controller.play();
-        await _controller.seekTo(const Duration(seconds: 5));
+        await controller.play();
+        await controller.seekTo(const Duration(seconds: 5));
         await tester.pumpAndSettle(_playDuration);
-        await _controller.pause();
+        await controller.pause();
 
-        expect(_controller.value.isPlaying, false);
-        expect(_controller.value.position,
+        expect(controller.value.isPlaying, false);
+        expect(controller.value.position,
             (Duration position) => position > Duration.zero);
 
         await expectLater(started.future, completes);
@@ -277,63 +277,63 @@
   // but could be removed in the future.
   group('asset audios', () {
     setUp(() {
-      _controller = VideoPlayerController.asset('assets/Audio.mp3');
+      controller = VideoPlayerController.asset('assets/Audio.mp3');
     });
 
     testWidgets('can be initialized', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      expect(_controller.value.isInitialized, true);
-      expect(_controller.value.position, Duration.zero);
-      expect(_controller.value.isPlaying, false);
+      expect(controller.value.isInitialized, true);
+      expect(controller.value.position, Duration.zero);
+      expect(controller.value.isPlaying, false);
       // Due to the duration calculation accuracy between platforms,
       // the milliseconds on Web will be a slightly different from natives.
       // The audio was made with 44100 Hz, 192 Kbps CBR, and 32 bits.
       expect(
-        _controller.value.duration,
+        controller.value.duration,
         const Duration(seconds: 5, milliseconds: kIsWeb ? 42 : 41),
       );
     });
 
     testWidgets('can be played', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
       // Mute to allow playing without DOM interaction on Web.
       // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-      await _controller.setVolume(0);
+      await controller.setVolume(0);
 
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
 
-      expect(_controller.value.isPlaying, true);
+      expect(controller.value.isPlaying, true);
       expect(
-        _controller.value.position,
+        controller.value.position,
         (Duration position) => position > Duration.zero,
       );
     });
 
     testWidgets('can seek', (WidgetTester tester) async {
-      await _controller.initialize();
-      await _controller.seekTo(const Duration(seconds: 3));
+      await controller.initialize();
+      await controller.seekTo(const Duration(seconds: 3));
 
-      expect(_controller.value.position, const Duration(seconds: 3));
+      expect(controller.value.position, const Duration(seconds: 3));
     });
 
     testWidgets('can be paused', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
       // Mute to allow playing without DOM interaction on Web.
       // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
-      await _controller.setVolume(0);
+      await controller.setVolume(0);
 
       // Play for a second, then pause, and then wait a second.
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
-      await _controller.pause();
-      final Duration pausedPosition = _controller.value.position;
+      await controller.pause();
+      final Duration pausedPosition = controller.value.position;
       await tester.pumpAndSettle(_playDuration);
 
       // Verify that we stopped playing after the pause.
-      expect(_controller.value.isPlaying, false);
-      expect(_controller.value.position, pausedPosition);
+      expect(controller.value.isPlaying, false);
+      expect(controller.value.position, pausedPosition);
     });
   });
 }
diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart
index e7b3e1d..8e5e98b 100644
--- a/packages/video_player/video_player/test/video_player_test.dart
+++ b/packages/video_player/video_player/test/video_player_test.dart
@@ -105,7 +105,7 @@
 }
 
 void main() {
-  void _verifyPlayStateRespondsToLifecycle(
+  void verifyPlayStateRespondsToLifecycle(
     VideoPlayerController controller, {
     required bool shouldPlayInBackground,
   }) {
@@ -248,7 +248,7 @@
         );
         await controller.initialize();
         await controller.play();
-        _verifyPlayStateRespondsToLifecycle(controller,
+        verifyPlayStateRespondsToLifecycle(controller,
             shouldPlayInBackground: false);
       });
 
@@ -1025,7 +1025,7 @@
       );
       await controller.initialize();
       await controller.play();
-      _verifyPlayStateRespondsToLifecycle(
+      verifyPlayStateRespondsToLifecycle(
         controller,
         shouldPlayInBackground: true,
       );
@@ -1038,7 +1038,7 @@
       );
       await controller.initialize();
       await controller.play();
-      _verifyPlayStateRespondsToLifecycle(
+      verifyPlayStateRespondsToLifecycle(
         controller,
         shouldPlayInBackground: false,
       );
diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md
index 7986d1a..7298bac 100644
--- a/packages/video_player/video_player_android/CHANGELOG.md
+++ b/packages/video_player/video_player_android/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 * Fixes violations of new analysis option use_named_constants.
 
diff --git a/packages/video_player/video_player_android/example/integration_test/video_player_test.dart b/packages/video_player/video_player_android/example/integration_test/video_player_test.dart
index ef7bded..751412c 100644
--- a/packages/video_player/video_player_android/example/integration_test/video_player_test.dart
+++ b/packages/video_player/video_player_android/example/integration_test/video_player_test.dart
@@ -39,12 +39,12 @@
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 
-  late MiniController _controller;
-  tearDown(() async => _controller.dispose());
+  late MiniController controller;
+  tearDown(() async => controller.dispose());
 
   group('asset videos', () {
     setUp(() {
-      _controller = MiniController.asset(_videoAssetKey);
+      controller = MiniController.asset(_videoAssetKey);
     });
 
     testWidgets('registers expected implementation',
@@ -54,44 +54,44 @@
     });
 
     testWidgets('can be initialized', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      expect(_controller.value.isInitialized, true);
-      expect(await _controller.position, Duration.zero);
-      expect(_controller.value.duration,
+      expect(controller.value.isInitialized, true);
+      expect(await controller.position, Duration.zero);
+      expect(controller.value.duration,
           const Duration(seconds: 7, milliseconds: 540));
     });
 
     testWidgets('can be played', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
 
-      expect(await _controller.position, greaterThan(Duration.zero));
+      expect(await controller.position, greaterThan(Duration.zero));
     });
 
     testWidgets('can seek', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.seekTo(const Duration(seconds: 3));
+      await controller.seekTo(const Duration(seconds: 3));
 
-      expect(await _controller.position, const Duration(seconds: 3));
+      expect(await controller.position, const Duration(seconds: 3));
     });
 
     testWidgets('can be paused', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
       // Play for a second, then pause, and then wait a second.
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
-      await _controller.pause();
+      await controller.pause();
       await tester.pumpAndSettle(_playDuration);
-      final Duration pausedPosition = (await _controller.position)!;
+      final Duration pausedPosition = (await controller.position)!;
       await tester.pumpAndSettle(_playDuration);
 
       // Verify that we stopped playing after the pause.
-      expect(await _controller.position, pausedPosition);
+      expect(await controller.position, pausedPosition);
     });
   });
 
@@ -106,48 +106,48 @@
       final File file = File('$tempDir/$filename');
       await file.writeAsBytes(bytes.buffer.asInt8List());
 
-      _controller = MiniController.file(file);
+      controller = MiniController.file(file);
     });
 
     testWidgets('test video player using static file() method as constructor',
         (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
 
-      expect(await _controller.position, greaterThan(Duration.zero));
+      expect(await controller.position, greaterThan(Duration.zero));
     });
   });
 
   group('network videos', () {
     setUp(() {
       final String videoUrl = getUrlForAssetAsNetworkSource(_videoAssetKey);
-      _controller = MiniController.network(videoUrl);
+      controller = MiniController.network(videoUrl);
     });
 
     testWidgets('reports buffering status', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
       final Completer<void> started = Completer<void>();
       final Completer<void> ended = Completer<void>();
-      _controller.addListener(() {
-        if (!started.isCompleted && _controller.value.isBuffering) {
+      controller.addListener(() {
+        if (!started.isCompleted && controller.value.isBuffering) {
           started.complete();
         }
         if (started.isCompleted &&
-            !_controller.value.isBuffering &&
+            !controller.value.isBuffering &&
             !ended.isCompleted) {
           ended.complete();
         }
       });
 
-      await _controller.play();
-      await _controller.seekTo(const Duration(seconds: 5));
+      await controller.play();
+      await controller.seekTo(const Duration(seconds: 5));
       await tester.pumpAndSettle(_playDuration);
-      await _controller.pause();
+      await controller.pause();
 
-      expect(await _controller.position, greaterThan(Duration.zero));
+      expect(await controller.position, greaterThan(Duration.zero));
 
       await expectLater(started.future, completes);
       await expectLater(ended.future, completes);
diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md
index cc4411c..7cfa025 100644
--- a/packages/video_player/video_player_avfoundation/CHANGELOG.md
+++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.3.6
 
 * Fixes a bug in iOS 16 where videos from protected live streams are not shown. 
diff --git a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart
index 15108aa..5027973 100644
--- a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart
+++ b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart
@@ -39,12 +39,12 @@
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 
-  late MiniController _controller;
-  tearDown(() async => _controller.dispose());
+  late MiniController controller;
+  tearDown(() async => controller.dispose());
 
   group('asset videos', () {
     setUp(() {
-      _controller = MiniController.asset(_videoAssetKey);
+      controller = MiniController.asset(_videoAssetKey);
     });
 
     testWidgets('registers expected implementation',
@@ -54,50 +54,50 @@
     });
 
     testWidgets('can be initialized', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      expect(_controller.value.isInitialized, true);
-      expect(await _controller.position, Duration.zero);
-      expect(_controller.value.duration,
+      expect(controller.value.isInitialized, true);
+      expect(await controller.position, Duration.zero);
+      expect(controller.value.duration,
           const Duration(seconds: 7, milliseconds: 540));
     });
 
     testWidgets('can be played', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
 
-      expect(await _controller.position, greaterThan(Duration.zero));
+      expect(await controller.position, greaterThan(Duration.zero));
     });
 
     testWidgets('can seek', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.seekTo(const Duration(seconds: 3));
+      await controller.seekTo(const Duration(seconds: 3));
 
       // TODO(stuartmorgan): Switch to _controller.position once seekTo is
       // fixed on the native side to wait for completion, so this is testing
       // the native code rather than the MiniController position cache.
-      expect(_controller.value.position, const Duration(seconds: 3));
+      expect(controller.value.position, const Duration(seconds: 3));
     });
 
     testWidgets('can be paused', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
       // Play for a second, then pause, and then wait a second.
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
-      await _controller.pause();
-      final Duration pausedPosition = (await _controller.position)!;
+      await controller.pause();
+      final Duration pausedPosition = (await controller.position)!;
       await tester.pumpAndSettle(_playDuration);
 
       // Verify that we stopped playing after the pause.
       // TODO(stuartmorgan): Investigate why this has a slight discrepency, and
       // fix it if possible. Is AVPlayer's pause method internally async?
       const Duration allowableDelta = Duration(milliseconds: 10);
-      expect(await _controller.position,
-          lessThan(pausedPosition + allowableDelta));
+      expect(
+          await controller.position, lessThan(pausedPosition + allowableDelta));
     });
   });
 
@@ -112,51 +112,51 @@
       final File file = File('$tempDir/$filename');
       await file.writeAsBytes(bytes.buffer.asInt8List());
 
-      _controller = MiniController.file(file);
+      controller = MiniController.file(file);
     });
 
     testWidgets('test video player using static file() method as constructor',
         (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
-      await _controller.play();
+      await controller.play();
       await tester.pumpAndSettle(_playDuration);
 
-      expect(await _controller.position, greaterThan(Duration.zero));
+      expect(await controller.position, greaterThan(Duration.zero));
     });
   });
 
   group('network videos', () {
     setUp(() {
       final String videoUrl = getUrlForAssetAsNetworkSource(_videoAssetKey);
-      _controller = MiniController.network(videoUrl);
+      controller = MiniController.network(videoUrl);
     });
 
     testWidgets('reports buffering status', (WidgetTester tester) async {
-      await _controller.initialize();
+      await controller.initialize();
 
       final Completer<void> started = Completer<void>();
       final Completer<void> ended = Completer<void>();
-      _controller.addListener(() {
-        if (!started.isCompleted && _controller.value.isBuffering) {
+      controller.addListener(() {
+        if (!started.isCompleted && controller.value.isBuffering) {
           started.complete();
         }
         if (started.isCompleted &&
-            !_controller.value.isBuffering &&
+            !controller.value.isBuffering &&
             !ended.isCompleted) {
           ended.complete();
         }
       });
 
-      await _controller.play();
-      await _controller.seekTo(const Duration(seconds: 5));
+      await controller.play();
+      await controller.seekTo(const Duration(seconds: 5));
       await tester.pumpAndSettle(_playDuration);
-      await _controller.pause();
+      await controller.pause();
 
       // TODO(stuartmorgan): Switch to _controller.position once seekTo is
       // fixed on the native side to wait for completion, so this is testing
       // the native code rather than the MiniController position cache.
-      expect(_controller.value.position, greaterThan(Duration.zero));
+      expect(controller.value.position, greaterThan(Duration.zero));
 
       await expectLater(started.future, completes);
       await expectLater(ended.future, completes);
diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md
index 73dd7ce..d5559f9 100644
--- a/packages/webview_flutter/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
 * Updates minimum Flutter version to 2.10.
 * Fixes avoid_redundant_argument_values lint warnings and minor typos.
 * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231).
diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
index 8e326fe..63f4384 100644
--- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart
@@ -235,12 +235,12 @@
   testWidgets('set custom userAgent', (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter1 =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent1',
@@ -258,7 +258,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent2',
@@ -274,13 +274,13 @@
       (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     // Build the webView with no user agent to get the default platform user agent.
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: primaryUrl,
           javascriptMode: JavascriptMode.unrestricted,
           onWebViewCreated: (WebViewController controller) {
@@ -296,7 +296,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent',
@@ -310,7 +310,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
         ),
diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
index 4853aec..dfad03e 100644
--- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.10.3
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
index b7c32f5..69c1a46 100644
--- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart
@@ -241,12 +241,12 @@
   testWidgets('set custom userAgent', (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter1 =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent1',
@@ -264,7 +264,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent2',
@@ -280,13 +280,13 @@
       (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     // Build the webView with no user agent to get the default platform user agent.
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: primaryUrl,
           javascriptMode: JavascriptMode.unrestricted,
           onWebViewCreated: (WebViewController controller) {
@@ -302,7 +302,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent',
@@ -316,7 +316,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
         ),
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
index e8eb01e..b7050e4 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.9.5
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 1.9.4
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
index f328817..0e98ea0 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart
@@ -247,30 +247,29 @@
 
   static Map<String, dynamic> _webSettingsToMap(WebSettings? settings) {
     final Map<String, dynamic> map = <String, dynamic>{};
-    void _addIfNonNull(String key, dynamic value) {
+    void addIfNonNull(String key, dynamic value) {
       if (value == null) {
         return;
       }
       map[key] = value;
     }
 
-    void _addSettingIfPresent<T>(String key, WebSetting<T> setting) {
+    void addSettingIfPresent<T>(String key, WebSetting<T> setting) {
       if (!setting.isPresent) {
         return;
       }
       map[key] = setting.value;
     }
 
-    _addIfNonNull('jsMode', settings!.javascriptMode?.index);
-    _addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate);
-    _addIfNonNull('hasProgressTracking', settings.hasProgressTracking);
-    _addIfNonNull('debuggingEnabled', settings.debuggingEnabled);
-    _addIfNonNull(
-        'gestureNavigationEnabled', settings.gestureNavigationEnabled);
-    _addIfNonNull(
+    addIfNonNull('jsMode', settings!.javascriptMode?.index);
+    addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate);
+    addIfNonNull('hasProgressTracking', settings.hasProgressTracking);
+    addIfNonNull('debuggingEnabled', settings.debuggingEnabled);
+    addIfNonNull('gestureNavigationEnabled', settings.gestureNavigationEnabled);
+    addIfNonNull(
         'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback);
-    _addSettingIfPresent('userAgent', settings.userAgent);
-    _addIfNonNull('zoomEnabled', settings.zoomEnabled);
+    addSettingIfPresent('userAgent', settings.userAgent);
+    addIfNonNull('zoomEnabled', settings.zoomEnabled);
     return map;
   }
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
index 4b14872..8f60592 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 1.9.4
+version: 1.9.5
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart
index 30795b0..aec568e 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart
@@ -7,35 +7,35 @@
 import 'package:webview_flutter_platform_interface/src/types/types.dart';
 
 void main() {
-  final Map<String, String> _log = <String, String>{};
-  final Set<JavascriptChannel> _channels = <JavascriptChannel>{
+  final Map<String, String> log = <String, String>{};
+  final Set<JavascriptChannel> channels = <JavascriptChannel>{
     JavascriptChannel(
       name: 'js_channel_1',
       onMessageReceived: (JavascriptMessage message) =>
-          _log['js_channel_1'] = message.message,
+          log['js_channel_1'] = message.message,
     ),
     JavascriptChannel(
       name: 'js_channel_2',
       onMessageReceived: (JavascriptMessage message) =>
-          _log['js_channel_2'] = message.message,
+          log['js_channel_2'] = message.message,
     ),
     JavascriptChannel(
       name: 'js_channel_3',
       onMessageReceived: (JavascriptMessage message) =>
-          _log['js_channel_3'] = message.message,
+          log['js_channel_3'] = message.message,
     ),
   };
 
   tearDown(() {
-    _log.clear();
+    log.clear();
   });
 
   test('ctor should initialize with channels.', () {
     final JavascriptChannelRegistry registry =
-        JavascriptChannelRegistry(_channels);
+        JavascriptChannelRegistry(channels);
 
     expect(registry.channels.length, 3);
-    for (final JavascriptChannel channel in _channels) {
+    for (final JavascriptChannel channel in channels) {
       expect(registry.channels[channel.name], channel);
     }
   });
@@ -43,7 +43,7 @@
   test('onJavascriptChannelMessage should forward message on correct channel.',
       () {
     final JavascriptChannelRegistry registry =
-        JavascriptChannelRegistry(_channels);
+        JavascriptChannelRegistry(channels);
 
     registry.onJavascriptChannelMessage(
       'js_channel_2',
@@ -51,7 +51,7 @@
     );
 
     expect(
-        _log,
+        log,
         containsPair(
           'js_channel_2',
           'test message on channel 2',
@@ -62,7 +62,7 @@
       'onJavascriptChannelMessage should throw ArgumentError when message arrives on non-existing channel.',
       () {
     final JavascriptChannelRegistry registry =
-        JavascriptChannelRegistry(_channels);
+        JavascriptChannelRegistry(channels);
 
     expect(
         () => registry.onJavascriptChannelMessage(
@@ -79,7 +79,7 @@
       'updateJavascriptChannelsFromSet should clear all channels when null is supplied.',
       () {
     final JavascriptChannelRegistry registry =
-        JavascriptChannelRegistry(_channels);
+        JavascriptChannelRegistry(channels);
 
     expect(registry.channels.length, 3);
 
@@ -91,7 +91,7 @@
   test('updateJavascriptChannelsFromSet should update registry with new set.',
       () {
     final JavascriptChannelRegistry registry =
-        JavascriptChannelRegistry(_channels);
+        JavascriptChannelRegistry(channels);
 
     expect(registry.channels.length, 3);
 
@@ -99,12 +99,12 @@
       JavascriptChannel(
         name: 'new_js_channel_1',
         onMessageReceived: (JavascriptMessage message) =>
-            _log['new_js_channel_1'] = message.message,
+            log['new_js_channel_1'] = message.message,
       ),
       JavascriptChannel(
         name: 'new_js_channel_2',
         onMessageReceived: (JavascriptMessage message) =>
-            _log['new_js_channel_2'] = message.message,
+            log['new_js_channel_2'] = message.message,
       ),
     };
 
diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart
index f481edd..8d71771 100644
--- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart
+++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart
@@ -6,17 +6,17 @@
 import 'package:webview_flutter_platform_interface/src/types/javascript_channel.dart';
 
 void main() {
-  final List<String> _validChars =
+  final List<String> validChars =
       'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_'.split('');
-  final List<String> _commonInvalidChars =
+  final List<String> commonInvalidChars =
       r'`~!@#$%^&*()-=+[]{}\|"' ':;/?<>,. '.split('');
-  final List<int> _digits = List<int>.generate(10, (int index) => index++);
+  final List<int> digits = List<int>.generate(10, (int index) => index++);
 
   test(
       'ctor should create JavascriptChannel when name starts with a valid character followed by a number.',
       () {
-    for (final String char in _validChars) {
-      for (final int digit in _digits) {
+    for (final String char in validChars) {
+      for (final int digit in digits) {
         final JavascriptChannel channel =
             JavascriptChannel(name: '$char$digit', onMessageReceived: (_) {});
 
@@ -26,7 +26,7 @@
   });
 
   test('ctor should assert when channel name starts with a number.', () {
-    for (final int i in _digits) {
+    for (final int i in digits) {
       expect(
         () => JavascriptChannel(name: '$i', onMessageReceived: (_) {}),
         throwsAssertionError,
@@ -35,8 +35,8 @@
   });
 
   test('ctor should assert when channel contains invalid char.', () {
-    for (final String validChar in _validChars) {
-      for (final String invalidChar in _commonInvalidChars) {
+    for (final String validChar in validChars) {
+      for (final String invalidChar in commonInvalidChars) {
         expect(
           () => JavascriptChannel(
               name: validChar + invalidChar, onMessageReceived: (_) {}),
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 318ffe6..c0a2ade 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,3 +1,7 @@
+## NEXT
+
+* Updates code for `no_leading_underscores_for_local_identifiers` lint.
+
 ## 2.9.5
 
 * Updates imports for `prefer_relative_imports`.
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
index e259bc7..047d69f 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
+++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart
@@ -253,12 +253,12 @@
   testWidgets('set custom userAgent', (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter1 =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent1',
@@ -276,7 +276,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent2',
@@ -292,13 +292,13 @@
       (WidgetTester tester) async {
     final Completer<WebViewController> controllerCompleter =
         Completer<WebViewController>();
-    final GlobalKey _globalKey = GlobalKey();
+    final GlobalKey globalKey = GlobalKey();
     // Build the webView with no user agent to get the default platform user agent.
     await tester.pumpWidget(
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: primaryUrl,
           javascriptMode: JavascriptMode.unrestricted,
           onWebViewCreated: (WebViewController controller) {
@@ -314,7 +314,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
           userAgent: 'Custom_User_Agent',
@@ -328,7 +328,7 @@
       Directionality(
         textDirection: TextDirection.ltr,
         child: WebView(
-          key: _globalKey,
+          key: globalKey,
           initialUrl: 'about:blank',
           javascriptMode: JavascriptMode.unrestricted,
         ),
diff --git a/script/tool/lib/src/common/package_looping_command.dart b/script/tool/lib/src/common/package_looping_command.dart
index a32ada2..d8b1cf0 100644
--- a/script/tool/lib/src/common/package_looping_command.dart
+++ b/script/tool/lib/src/common/package_looping_command.dart
@@ -428,9 +428,9 @@
             .length;
     // Split the warnings into those from packages that ran, and those that
     // were skipped.
-    final Set<PackageEnumerationEntry> _skippedPackagesWithWarnings =
+    final Set<PackageEnumerationEntry> skippedPackagesWithWarnings =
         _packagesWithWarnings.intersection(skippedPackages);
-    final int skippedWarningCount = _skippedPackagesWithWarnings.length;
+    final int skippedWarningCount = skippedPackagesWithWarnings.length;
     final int runWarningCount =
         _packagesWithWarnings.length - skippedWarningCount;
 
diff --git a/script/tool/lib/src/native_test_command.dart b/script/tool/lib/src/native_test_command.dart
index 81b13cb..af5f4df 100644
--- a/script/tool/lib/src/native_test_command.dart
+++ b/script/tool/lib/src/native_test_command.dart
@@ -406,9 +406,9 @@
       );
 
       // The exit code from 'xcodebuild test' when there are no tests.
-      const int _xcodebuildNoTestExitCode = 66;
+      const int xcodebuildNoTestExitCode = 66;
       switch (exitCode) {
-        case _xcodebuildNoTestExitCode:
+        case xcodebuildNoTestExitCode:
           _printNoExampleTestsMessage(example, platform);
           break;
         case 0:
diff --git a/script/tool/test/dependabot_check_command_test.dart b/script/tool/test/dependabot_check_command_test.dart
index b0558c3..39dd8f4 100644
--- a/script/tool/test/dependabot_check_command_test.dart
+++ b/script/tool/test/dependabot_check_command_test.dart
@@ -36,7 +36,7 @@
     runner.addCommand(command);
   });
 
-  void _setDependabotCoverage({
+  void setDependabotCoverage({
     Iterable<String> gradleDirs = const <String>[],
   }) {
     final Iterable<String> gradleEntries =
@@ -57,7 +57,7 @@
   }
 
   test('skips with no supported ecosystems', () async {
-    _setDependabotCoverage();
+    setDependabotCoverage();
     createFakePackage('a_package', packagesDir);
 
     final List<String> output =
@@ -71,7 +71,7 @@
   });
 
   test('fails for app missing Gradle coverage', () async {
-    _setDependabotCoverage();
+    setDependabotCoverage();
     final RepositoryPackage package =
         createFakePackage('a_package', packagesDir);
     package.directory
@@ -97,7 +97,7 @@
   });
 
   test('fails for plugin missing Gradle coverage', () async {
-    _setDependabotCoverage();
+    setDependabotCoverage();
     final RepositoryPackage plugin = createFakePlugin('a_plugin', packagesDir);
     plugin.directory.childDirectory('android').createSync(recursive: true);
 
@@ -118,7 +118,7 @@
   });
 
   test('passes for correct Gradle coverage', () async {
-    _setDependabotCoverage(gradleDirs: <String>[
+    setDependabotCoverage(gradleDirs: <String>[
       'packages/a_plugin/android',
       'packages/a_plugin/example/android/app',
     ]);
diff --git a/script/tool/test/firebase_test_lab_command_test.dart b/script/tool/test/firebase_test_lab_command_test.dart
index 2d3175e..68ea62b 100644
--- a/script/tool/test/firebase_test_lab_command_test.dart
+++ b/script/tool/test/firebase_test_lab_command_test.dart
@@ -40,7 +40,7 @@
       runner.addCommand(command);
     });
 
-    void _writeJavaTestFile(RepositoryPackage plugin, String relativeFilePath,
+    void writeJavaTestFile(RepositoryPackage plugin, String relativeFilePath,
         {String runnerClass = 'FlutterTestRunner'}) {
       childFileWithSubcomponents(
               plugin.directory, p.posix.split(relativeFilePath))
@@ -67,7 +67,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       Error? commandError;
       final List<String> output = await runCapturingPrint(
@@ -97,7 +97,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       final List<String> output =
           await runCapturingPrint(runner, <String>['firebase-test-lab']);
@@ -120,7 +120,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin1, javaTestFileRelativePath);
+      writeJavaTestFile(plugin1, javaTestFileRelativePath);
       final RepositoryPackage plugin2 =
           createFakePlugin('plugin2', packagesDir, extraFiles: <String>[
         'test/plugin_test.dart',
@@ -128,7 +128,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin2, javaTestFileRelativePath);
+      writeJavaTestFile(plugin2, javaTestFileRelativePath);
 
       final List<String> output = await runCapturingPrint(runner, <String>[
         'firebase-test-lab',
@@ -207,7 +207,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       final List<String> output = await runCapturingPrint(runner, <String>[
         'firebase-test-lab',
@@ -286,7 +286,7 @@
             ],
           ]);
       for (final String example in examples) {
-        _writeJavaTestFile(
+        writeJavaTestFile(
             plugin, 'example/$example/$javaTestFileExampleRelativePath');
       }
 
@@ -347,7 +347,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       processRunner.mockProcessesForExecutable['gcloud'] = <Process>[
         MockProcess(), // auth
@@ -393,7 +393,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       processRunner.mockProcessesForExecutable['gcloud'] = <Process>[
         MockProcess(), // auth
@@ -460,7 +460,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       Error? commandError;
       final List<String> output = await runCapturingPrint(
@@ -501,7 +501,7 @@
         javaTestFileRelativePath,
       ]);
       // Use the wrong @RunWith annotation.
-      _writeJavaTestFile(plugin, javaTestFileRelativePath,
+      writeJavaTestFile(plugin, javaTestFileRelativePath,
           runnerClass: 'AndroidJUnit4.class');
 
       Error? commandError;
@@ -565,7 +565,7 @@
         'example/integration_test/foo_test.dart',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       final List<String> output = await runCapturingPrint(runner, <String>[
         'firebase-test-lab',
@@ -628,7 +628,7 @@
         'example/integration_test/foo_test.dart',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       processRunner.mockProcessesForExecutable['flutter'] = <Process>[
         MockProcess(exitCode: 1) // flutter build
@@ -663,7 +663,7 @@
         'example/integration_test/foo_test.dart',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       final String gradlewPath = plugin
           .getExamples()
@@ -704,7 +704,7 @@
         'example/integration_test/foo_test.dart',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       final String gradlewPath = plugin
           .getExamples()
@@ -750,7 +750,7 @@
         'example/android/gradlew',
         javaTestFileRelativePath,
       ]);
-      _writeJavaTestFile(plugin, javaTestFileRelativePath);
+      writeJavaTestFile(plugin, javaTestFileRelativePath);
 
       await runCapturingPrint(runner, <String>[
         'firebase-test-lab',
diff --git a/script/tool/test/format_command_test.dart b/script/tool/test/format_command_test.dart
index c1c4a21..9a86505 100644
--- a/script/tool/test/format_command_test.dart
+++ b/script/tool/test/format_command_test.dart
@@ -49,7 +49,7 @@
 
   /// Returns a modified version of a list of [relativePaths] that are relative
   /// to [package] to instead be relative to [packagesDir].
-  List<String> _getPackagesDirRelativePaths(
+  List<String> getPackagesDirRelativePaths(
       RepositoryPackage package, List<String> relativePaths) {
     final p.Context path = analyzeCommand.path;
     final String relativeBase =
@@ -65,7 +65,7 @@
   ///
   /// This is for each of testing batching, since it means each file will
   /// consume 100 characters of the batch length.
-  List<String> _get99CharacterPathExtraFiles(String packageName, int count) {
+  List<String> get99CharacterPathExtraFiles(String packageName, int count) {
     final int padding = 99 -
         packageName.length -
         1 - // the path separator after the package name
@@ -99,10 +99,7 @@
         orderedEquals(<ProcessCall>[
           ProcessCall(
               getFlutterCommand(mockPlatform),
-              <String>[
-                'format',
-                ..._getPackagesDirRelativePaths(plugin, files)
-              ],
+              <String>['format', ...getPackagesDirRelativePaths(plugin, files)],
               packagesDir.path),
         ]));
   });
@@ -138,7 +135,7 @@
               getFlutterCommand(mockPlatform),
               <String>[
                 'format',
-                ..._getPackagesDirRelativePaths(plugin, formattedFiles)
+                ...getPackagesDirRelativePaths(plugin, formattedFiles)
               ],
               packagesDir.path),
         ]));
@@ -191,7 +188,7 @@
                 '-jar',
                 javaFormatPath,
                 '--replace',
-                ..._getPackagesDirRelativePaths(plugin, files)
+                ...getPackagesDirRelativePaths(plugin, files)
               ],
               packagesDir.path),
         ]));
@@ -271,7 +268,7 @@
                 '-jar',
                 javaFormatPath,
                 '--replace',
-                ..._getPackagesDirRelativePaths(plugin, files)
+                ...getPackagesDirRelativePaths(plugin, files)
               ],
               packagesDir.path),
         ]));
@@ -303,7 +300,7 @@
               <String>[
                 '-i',
                 '--style=file',
-                ..._getPackagesDirRelativePaths(plugin, files)
+                ...getPackagesDirRelativePaths(plugin, files)
               ],
               packagesDir.path),
         ]));
@@ -358,7 +355,7 @@
               <String>[
                 '-i',
                 '--style=file',
-                ..._getPackagesDirRelativePaths(plugin, files)
+                ...getPackagesDirRelativePaths(plugin, files)
               ],
               packagesDir.path),
         ]));
@@ -426,14 +423,14 @@
               <String>[
                 '-i',
                 '--style=file',
-                ..._getPackagesDirRelativePaths(plugin, clangFiles)
+                ...getPackagesDirRelativePaths(plugin, clangFiles)
               ],
               packagesDir.path),
           ProcessCall(
               getFlutterCommand(mockPlatform),
               <String>[
                 'format',
-                ..._getPackagesDirRelativePaths(plugin, dartFiles)
+                ...getPackagesDirRelativePaths(plugin, dartFiles)
               ],
               packagesDir.path),
           ProcessCall(
@@ -442,7 +439,7 @@
                 '-jar',
                 javaFormatPath,
                 '--replace',
-                ..._getPackagesDirRelativePaths(plugin, javaFiles)
+                ...getPackagesDirRelativePaths(plugin, javaFiles)
               ],
               packagesDir.path),
         ]));
@@ -541,7 +538,7 @@
 
     // Make the file list one file longer than would fit in the batch.
     final List<String> batch1 =
-        _get99CharacterPathExtraFiles(pluginName, batchSize + 1);
+        get99CharacterPathExtraFiles(pluginName, batchSize + 1);
     final String extraFile = batch1.removeLast();
 
     createFakePlugin(
@@ -578,7 +575,7 @@
 
     // Make the file list one file longer than would fit in a Windows batch.
     final List<String> batch =
-        _get99CharacterPathExtraFiles(pluginName, batchSize + 1);
+        get99CharacterPathExtraFiles(pluginName, batchSize + 1);
 
     createFakePlugin(
       pluginName,
@@ -598,7 +595,7 @@
 
     // Make the file list one file longer than would fit in the batch.
     final List<String> batch1 =
-        _get99CharacterPathExtraFiles(pluginName, batchSize + 1);
+        get99CharacterPathExtraFiles(pluginName, batchSize + 1);
     final String extraFile = batch1.removeLast();
 
     createFakePlugin(
diff --git a/script/tool/test/license_check_command_test.dart b/script/tool/test/license_check_command_test.dart
index 005b77d..09841df 100644
--- a/script/tool/test/license_check_command_test.dart
+++ b/script/tool/test/license_check_command_test.dart
@@ -48,7 +48,7 @@
     /// [commentString] is added to the start of each line.
     /// [prefix] is added to the start of the entire block.
     /// [suffix] is added to the end of the entire block.
-    void _writeLicense(
+    void writeLicense(
       File file, {
       String comment = '// ',
       String prefix = '',
@@ -164,7 +164,7 @@
     test('passes if all checked files have license blocks', () async {
       final File checked = root.childFile('checked.cc');
       checked.createSync();
-      _writeLicense(checked);
+      writeLicense(checked);
       final File notChecked = root.childFile('not_checked.md');
       notChecked.createSync();
 
@@ -183,7 +183,7 @@
     test('passes correct license blocks on Windows', () async {
       final File checked = root.childFile('checked.cc');
       checked.createSync();
-      _writeLicense(checked, useCrlf: true);
+      writeLicense(checked, useCrlf: true);
 
       final List<String> output =
           await runCapturingPrint(runner, <String>['license-check']);
@@ -200,13 +200,13 @@
     test('handles the comment styles for all supported languages', () async {
       final File fileA = root.childFile('file_a.cc');
       fileA.createSync();
-      _writeLicense(fileA);
+      writeLicense(fileA);
       final File fileB = root.childFile('file_b.sh');
       fileB.createSync();
-      _writeLicense(fileB, comment: '# ');
+      writeLicense(fileB, comment: '# ');
       final File fileC = root.childFile('file_c.html');
       fileC.createSync();
-      _writeLicense(fileC, comment: '', prefix: '<!-- ', suffix: ' -->');
+      writeLicense(fileC, comment: '', prefix: '<!-- ', suffix: ' -->');
 
       final List<String> output =
           await runCapturingPrint(runner, <String>['license-check']);
@@ -225,10 +225,10 @@
     test('fails if any checked files are missing license blocks', () async {
       final File goodA = root.childFile('good.cc');
       goodA.createSync();
-      _writeLicense(goodA);
+      writeLicense(goodA);
       final File goodB = root.childFile('good.h');
       goodB.createSync();
-      _writeLicense(goodB);
+      writeLicense(goodB);
       root.childFile('bad.cc').createSync();
       root.childFile('bad.h').createSync();
 
@@ -255,10 +255,10 @@
     test('fails if any checked files are missing just the copyright', () async {
       final File good = root.childFile('good.cc');
       good.createSync();
-      _writeLicense(good);
+      writeLicense(good);
       final File bad = root.childFile('bad.cc');
       bad.createSync();
-      _writeLicense(bad, copyright: '');
+      writeLicense(bad, copyright: '');
 
       Error? commandError;
       final List<String> output = await runCapturingPrint(
@@ -282,10 +282,10 @@
     test('fails if any checked files are missing just the license', () async {
       final File good = root.childFile('good.cc');
       good.createSync();
-      _writeLicense(good);
+      writeLicense(good);
       final File bad = root.childFile('bad.cc');
       bad.createSync();
-      _writeLicense(bad, license: <String>[]);
+      writeLicense(bad, license: <String>[]);
 
       Error? commandError;
       final List<String> output = await runCapturingPrint(
@@ -310,7 +310,7 @@
         () async {
       final File thirdPartyFile = root.childFile('third_party.cc');
       thirdPartyFile.createSync();
-      _writeLicense(thirdPartyFile, copyright: 'Copyright 2017 Someone Else');
+      writeLicense(thirdPartyFile, copyright: 'Copyright 2017 Someone Else');
 
       Error? commandError;
       final List<String> output = await runCapturingPrint(
@@ -339,7 +339,7 @@
           .childDirectory('third_party')
           .childFile('file.cc');
       thirdPartyFile.createSync(recursive: true);
-      _writeLicense(thirdPartyFile,
+      writeLicense(thirdPartyFile,
           copyright: 'Copyright 2017 Workiva Inc.',
           license: <String>[
             'Licensed under the Apache License, Version 2.0 (the "License");',
@@ -366,7 +366,7 @@
           .childDirectory('third_party')
           .childFile('first_party.cc');
       firstPartyFileInThirdParty.createSync(recursive: true);
-      _writeLicense(firstPartyFileInThirdParty);
+      writeLicense(firstPartyFileInThirdParty);
 
       final List<String> output =
           await runCapturingPrint(runner, <String>['license-check']);
@@ -383,10 +383,10 @@
     test('fails for licenses that the tool does not expect', () async {
       final File good = root.childFile('good.cc');
       good.createSync();
-      _writeLicense(good);
+      writeLicense(good);
       final File bad = root.childDirectory('third_party').childFile('bad.cc');
       bad.createSync(recursive: true);
-      _writeLicense(bad, license: <String>[
+      writeLicense(bad, license: <String>[
         'This program is free software: you can redistribute it and/or modify',
         'it under the terms of the GNU General Public License',
       ]);
@@ -414,10 +414,10 @@
         () async {
       final File good = root.childFile('good.cc');
       good.createSync();
-      _writeLicense(good);
+      writeLicense(good);
       final File bad = root.childDirectory('third_party').childFile('bad.cc');
       bad.createSync(recursive: true);
-      _writeLicense(
+      writeLicense(
         bad,
         copyright: 'Copyright 2017 Some New Authors.',
         license: <String>[
diff --git a/script/tool/test/make_deps_path_based_command_test.dart b/script/tool/test/make_deps_path_based_command_test.dart
index 36753e8..e846a63 100644
--- a/script/tool/test/make_deps_path_based_command_test.dart
+++ b/script/tool/test/make_deps_path_based_command_test.dart
@@ -49,7 +49,7 @@
 
   /// Adds dummy 'dependencies:' entries for each package in [dependencies]
   /// to [package].
-  void _addDependencies(
+  void addDependencies(
       RepositoryPackage package, Iterable<String> dependencies) {
     final List<String> lines = package.pubspecFile.readAsLinesSync();
     final int dependenciesStartIndex = lines.indexOf('dependencies:');
@@ -62,7 +62,7 @@
 
   /// Adds a 'dev_dependencies:' section with entries for each package in
   /// [dependencies] to [package].
-  void _addDevDependenciesSection(
+  void addDevDependenciesSection(
       RepositoryPackage package, Iterable<String> devDependencies) {
     final String originalContent = package.pubspecFile.readAsStringSync();
     package.pubspecFile.writeAsStringSync('''
@@ -77,7 +77,7 @@
     createFakePackage('foo', packagesDir, isFlutter: true);
     final RepositoryPackage packageBar =
         createFakePackage('bar', packagesDir, isFlutter: true);
-    _addDependencies(packageBar, <String>['foo']);
+    addDependencies(packageBar, <String>['foo']);
     final String originalPubspecContents =
         packageBar.pubspecFile.readAsStringSync();
 
@@ -105,16 +105,16 @@
     final RepositoryPackage pluginAppFacing =
         createFakePlugin('bar', pluginGroup);
 
-    _addDependencies(simplePackage, <String>[
+    addDependencies(simplePackage, <String>[
       'bar',
       'bar_android',
       'bar_platform_interface',
     ]);
-    _addDependencies(pluginAppFacing, <String>[
+    addDependencies(pluginAppFacing, <String>[
       'bar_platform_interface',
       'bar_android',
     ]);
-    _addDependencies(pluginImplementation, <String>[
+    addDependencies(pluginImplementation, <String>[
       'bar_platform_interface',
     ]);
 
@@ -160,7 +160,7 @@
     final RepositoryPackage builderPackage =
         createFakePackage('foo_builder', packagesDir);
 
-    _addDevDependenciesSection(builderPackage, <String>[
+    addDevDependenciesSection(builderPackage, <String>[
       'foo',
     ]);
 
@@ -193,8 +193,8 @@
     final RepositoryPackage targetPackage =
         createFakePackage('target', packagesDir);
 
-    _addDependencies(targetPackage, <String>['a', 'c']);
-    _addDevDependenciesSection(targetPackage, <String>['b']);
+    addDependencies(targetPackage, <String>['a', 'c']);
+    addDevDependenciesSection(targetPackage, <String>['b']);
 
     final List<String> output = await runCapturingPrint(runner,
         <String>['make-deps-path-based', '--target-dependencies=c,a,b']);
@@ -233,16 +233,16 @@
     final RepositoryPackage pluginAppFacing =
         createFakePlugin('bar', pluginGroup);
 
-    _addDependencies(simplePackage, <String>[
+    addDependencies(simplePackage, <String>[
       'bar',
       'bar_android',
       'bar_platform_interface',
     ]);
-    _addDependencies(pluginAppFacing, <String>[
+    addDependencies(pluginAppFacing, <String>[
       'bar_platform_interface',
       'bar_android',
     ]);
-    _addDependencies(pluginImplementation, <String>[
+    addDependencies(pluginImplementation, <String>[
       'bar_platform_interface',
     ]);
 
diff --git a/script/tool/test/native_test_command_test.dart b/script/tool/test/native_test_command_test.dart
index d420184..f24d014 100644
--- a/script/tool/test/native_test_command_test.dart
+++ b/script/tool/test/native_test_command_test.dart
@@ -68,7 +68,7 @@
 // TODO(stuartmorgan): Rework these tests to use a mock Xcode instead of
 // doing all the process mocking and validation.
 void main() {
-  const String _kDestination = '--ios-destination';
+  const String kDestination = '--ios-destination';
 
   group('test native_test_command on Posix', () {
     late FileSystem fileSystem;
@@ -95,7 +95,7 @@
 
     // Returns a MockProcess to provide for "xcrun xcodebuild -list" for a
     // project that contains [targets].
-    MockProcess _getMockXcodebuildListProcess(List<String> targets) {
+    MockProcess getMockXcodebuildListProcess(List<String> targets) {
       final Map<String, dynamic> projects = <String, dynamic>{
         'project': <String, dynamic>{
           'targets': targets,
@@ -106,7 +106,7 @@
 
     // Returns the ProcessCall to expect for checking the targets present in
     // the [package]'s [platform]/Runner.xcodeproj.
-    ProcessCall _getTargetCheckCall(Directory package, String platform) {
+    ProcessCall getTargetCheckCall(Directory package, String platform) {
       return ProcessCall(
           'xcrun',
           <String>[
@@ -124,7 +124,7 @@
 
     // Returns the ProcessCall to expect for running the tests in the
     // workspace [platform]/Runner.xcworkspace, with the given extra flags.
-    ProcessCall _getRunTestCall(
+    ProcessCall getRunTestCall(
       Directory package,
       String platform, {
       String? destination,
@@ -150,7 +150,7 @@
 
     // Returns the ProcessCall to expect for build the Linux unit tests for the
     // given plugin.
-    ProcessCall _getLinuxBuildCall(RepositoryPackage plugin) {
+    ProcessCall getLinuxBuildCall(RepositoryPackage plugin) {
       return ProcessCall(
           'cmake',
           <String>[
@@ -212,7 +212,7 @@
       final Directory pluginExampleDirectory = getExampleDir(plugin);
 
       processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-        _getMockXcodebuildListProcess(<String>['RunnerTests', 'RunnerUITests']),
+        getMockXcodebuildListProcess(<String>['RunnerTests', 'RunnerUITests']),
         // Exit code 66 from testing indicates no tests.
         MockProcess(exitCode: 66),
       ];
@@ -229,8 +229,8 @@
       expect(
           processRunner.recordedCalls,
           orderedEquals(<ProcessCall>[
-            _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-            _getRunTestCall(pluginExampleDirectory, 'macos',
+            getTargetCheckCall(pluginExampleDirectory, 'macos'),
+            getRunTestCall(pluginExampleDirectory, 'macos',
                 extraFlags: <String>['-only-testing:RunnerUITests']),
           ]));
     });
@@ -243,7 +243,7 @@
             });
 
         final List<String> output = await runCapturingPrint(runner,
-            <String>['native-test', '--ios', _kDestination, 'foo_destination']);
+            <String>['native-test', '--ios', kDestination, 'foo_destination']);
         expect(
             output,
             containsAllInOrder(<Matcher>[
@@ -260,7 +260,7 @@
             });
 
         final List<String> output = await runCapturingPrint(runner,
-            <String>['native-test', '--ios', _kDestination, 'foo_destination']);
+            <String>['native-test', '--ios', kDestination, 'foo_destination']);
         expect(
             output,
             containsAllInOrder(<Matcher>[
@@ -279,14 +279,14 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
         final List<String> output = await runCapturingPrint(runner, <String>[
           'native-test',
           '--ios',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -300,8 +300,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'ios'),
-              _getRunTestCall(pluginExampleDirectory, 'ios',
+              getTargetCheckCall(pluginExampleDirectory, 'ios'),
+              getRunTestCall(pluginExampleDirectory, 'ios',
                   destination: 'foo_destination'),
             ]));
       });
@@ -316,7 +316,7 @@
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
           MockProcess(stdout: jsonEncode(_kDeviceListMap)), // simctl
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -336,8 +336,8 @@
                     '--json',
                   ],
                   null),
-              _getTargetCheckCall(pluginExampleDirectory, 'ios'),
-              _getRunTestCall(pluginExampleDirectory, 'ios',
+              getTargetCheckCall(pluginExampleDirectory, 'ios'),
+              getRunTestCall(pluginExampleDirectory, 'ios',
                   destination: 'id=1E76A0FD-38AC-4537-A989-EA639D7D012A'),
             ]));
       });
@@ -386,7 +386,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -403,8 +403,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-              _getRunTestCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getRunTestCall(pluginExampleDirectory, 'macos'),
             ]));
       });
     });
@@ -918,7 +918,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getLinuxBuildCall(plugin),
+              getLinuxBuildCall(plugin),
               ProcessCall(testBinary.path, const <String>[], null),
             ]));
       });
@@ -958,7 +958,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getLinuxBuildCall(plugin),
+              getLinuxBuildCall(plugin),
               ProcessCall(releaseTestBinary.path, const <String>[], null),
             ]));
       });
@@ -1017,7 +1017,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getLinuxBuildCall(plugin),
+              getLinuxBuildCall(plugin),
             ]));
       });
 
@@ -1058,7 +1058,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getLinuxBuildCall(plugin),
+              getLinuxBuildCall(plugin),
               ProcessCall(testBinary.path, const <String>[], null),
             ]));
       });
@@ -1102,7 +1102,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -1121,8 +1121,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-              _getRunTestCall(pluginExampleDirectory, 'macos',
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getRunTestCall(pluginExampleDirectory, 'macos',
                   extraFlags: <String>['-only-testing:RunnerTests']),
             ]));
       });
@@ -1137,7 +1137,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin1);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -1156,8 +1156,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-              _getRunTestCall(pluginExampleDirectory, 'macos',
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getRunTestCall(pluginExampleDirectory, 'macos',
                   extraFlags: <String>['-only-testing:RunnerUITests']),
             ]));
       });
@@ -1173,7 +1173,7 @@
 
         // Simulate a project with unit tests but no integration tests...
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(<String>['RunnerTests']),
+          getMockXcodebuildListProcess(<String>['RunnerTests']),
         ];
 
         // ... then try to run only integration tests.
@@ -1193,7 +1193,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
             ]));
       });
 
@@ -1207,7 +1207,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin1);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(<String>['RunnerUITests']),
+          getMockXcodebuildListProcess(<String>['RunnerUITests']),
         ];
 
         Error? commandError;
@@ -1232,7 +1232,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
             ]));
       });
 
@@ -1269,7 +1269,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
             ]));
       });
     });
@@ -1295,10 +1295,10 @@
             pluginExampleDirectory.childDirectory('android');
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']), // iOS list
           MockProcess(), // iOS run
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']), // macOS list
           MockProcess(), // macOS run
         ];
@@ -1308,7 +1308,7 @@
           '--android',
           '--ios',
           '--macos',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -1325,11 +1325,11 @@
             orderedEquals(<ProcessCall>[
               ProcessCall(androidFolder.childFile('gradlew').path,
                   const <String>['testDebugUnitTest'], androidFolder.path),
-              _getTargetCheckCall(pluginExampleDirectory, 'ios'),
-              _getRunTestCall(pluginExampleDirectory, 'ios',
+              getTargetCheckCall(pluginExampleDirectory, 'ios'),
+              getRunTestCall(pluginExampleDirectory, 'ios',
                   destination: 'foo_destination'),
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-              _getRunTestCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getRunTestCall(pluginExampleDirectory, 'macos'),
             ]));
       });
 
@@ -1342,7 +1342,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -1350,7 +1350,7 @@
           'native-test',
           '--ios',
           '--macos',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -1364,8 +1364,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'macos'),
-              _getRunTestCall(pluginExampleDirectory, 'macos'),
+              getTargetCheckCall(pluginExampleDirectory, 'macos'),
+              getRunTestCall(pluginExampleDirectory, 'macos'),
             ]));
       });
 
@@ -1378,7 +1378,7 @@
         final Directory pluginExampleDirectory = getExampleDir(plugin);
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -1386,7 +1386,7 @@
           'native-test',
           '--ios',
           '--macos',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -1400,8 +1400,8 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getTargetCheckCall(pluginExampleDirectory, 'ios'),
-              _getRunTestCall(pluginExampleDirectory, 'ios',
+              getTargetCheckCall(pluginExampleDirectory, 'ios'),
+              getRunTestCall(pluginExampleDirectory, 'ios',
                   destination: 'foo_destination'),
             ]));
       });
@@ -1415,7 +1415,7 @@
           '--ios',
           '--macos',
           '--windows',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -1447,7 +1447,7 @@
           'native-test',
           '--macos',
           '--windows',
-          _kDestination,
+          kDestination,
           'foo_destination',
         ]);
 
@@ -1477,7 +1477,7 @@
         );
 
         processRunner.mockProcessesForExecutable['xcrun'] = <io.Process>[
-          _getMockXcodebuildListProcess(
+          getMockXcodebuildListProcess(
               <String>['RunnerTests', 'RunnerUITests']),
         ];
 
@@ -1598,7 +1598,7 @@
 
     // Returns the ProcessCall to expect for build the Windows unit tests for
     // the given plugin.
-    ProcessCall _getWindowsBuildCall(RepositoryPackage plugin) {
+    ProcessCall getWindowsBuildCall(RepositoryPackage plugin) {
       return ProcessCall(
           _fakeCmakeCommand,
           <String>[
@@ -1647,7 +1647,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getWindowsBuildCall(plugin),
+              getWindowsBuildCall(plugin),
               ProcessCall(testBinary.path, const <String>[], null),
             ]));
       });
@@ -1687,7 +1687,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getWindowsBuildCall(plugin),
+              getWindowsBuildCall(plugin),
               ProcessCall(debugTestBinary.path, const <String>[], null),
             ]));
       });
@@ -1746,7 +1746,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getWindowsBuildCall(plugin),
+              getWindowsBuildCall(plugin),
             ]));
       });
 
@@ -1787,7 +1787,7 @@
         expect(
             processRunner.recordedCalls,
             orderedEquals(<ProcessCall>[
-              _getWindowsBuildCall(plugin),
+              getWindowsBuildCall(plugin),
               ProcessCall(testBinary.path, const <String>[], null),
             ]));
       });
diff --git a/script/tool/test/publish_command_test.dart b/script/tool/test/publish_command_test.dart
index 19e8bdd..da5f9c8 100644
--- a/script/tool/test/publish_command_test.dart
+++ b/script/tool/test/publish_command_test.dart
@@ -33,7 +33,7 @@
   // Map of package name to mock response.
   late Map<String, Map<String, dynamic>> mockHttpResponses;
 
-  void _createMockCredentialFile() {
+  void createMockCredentialFile() {
     final String credentialPath = PublishCommand.getCredentialPath();
     fileSystem.file(credentialPath)
       ..createSync(recursive: true)
@@ -204,7 +204,7 @@
     test(
         '--skip-confirmation flag automatically adds --force to --pub-publish-flags',
         () async {
-      _createMockCredentialFile();
+      createMockCredentialFile();
       final RepositoryPackage plugin =
           createFakePlugin('foo', packagesDir, examples: <String>[]);
 
@@ -225,7 +225,7 @@
     });
 
     test('--force is only added once, regardless of plugin count', () async {
-      _createMockCredentialFile();
+      createMockCredentialFile();
       final RepositoryPackage plugin1 =
           createFakePlugin('plugin_a', packagesDir, examples: <String>[]);
       final RepositoryPackage plugin2 =
@@ -393,7 +393,7 @@
 
     test('does not ask for user input if the --skip-confirmation flag is on',
         () async {
-      _createMockCredentialFile();
+      createMockCredentialFile();
       createFakePlugin('foo', packagesDir, examples: <String>[]);
 
       final List<String> output =
diff --git a/script/tool/test/remove_dev_dependencies_test.dart b/script/tool/test/remove_dev_dependencies_test.dart
index 6b21287..776cbf1 100644
--- a/script/tool/test/remove_dev_dependencies_test.dart
+++ b/script/tool/test/remove_dev_dependencies_test.dart
@@ -27,7 +27,7 @@
     runner.addCommand(command);
   });
 
-  void _addToPubspec(RepositoryPackage package, String addition) {
+  void addToPubspec(RepositoryPackage package, String addition) {
     final String originalContent = package.pubspecFile.readAsStringSync();
     package.pubspecFile.writeAsStringSync('''
 $originalContent
@@ -53,7 +53,7 @@
     final RepositoryPackage package =
         createFakePackage('a_package', packagesDir, version: '1.0.0');
 
-    _addToPubspec(package, '''
+    addToPubspec(package, '''
 dev_dependencies:
   some_dependency: ^2.1.8
   another_dependency: ^1.0.0
@@ -79,7 +79,7 @@
         createFakePackage('a_package', packagesDir, version: '1.0.0');
 
     final RepositoryPackage example = package.getExamples().first;
-    _addToPubspec(example, '''
+    addToPubspec(example, '''
 dev_dependencies:
   some_dependency: ^2.1.8
   another_dependency: ^1.0.0
diff --git a/script/tool/test/version_check_command_test.dart b/script/tool/test/version_check_command_test.dart
index 598176b..d485d81 100644
--- a/script/tool/test/version_check_command_test.dart
+++ b/script/tool/test/version_check_command_test.dart
@@ -681,8 +681,7 @@
     });
 
     group('missing change detection', () {
-      Future<List<String>> _runWithMissingChangeDetection(
-          List<String> extraArgs,
+      Future<List<String>> runWithMissingChangeDetection(List<String> extraArgs,
           {void Function(Error error)? errorHandler}) async {
         return runCapturingPrint(
             runner,
@@ -712,7 +711,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -743,7 +742,7 @@
         ];
 
         Error? commandError;
-        final List<String> output = await _runWithMissingChangeDetection(
+        final List<String> output = await runWithMissingChangeDetection(
             <String>[], errorHandler: (Error e) {
           commandError = e;
         });
@@ -780,7 +779,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -810,7 +809,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -843,7 +842,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -874,7 +873,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[
+            await runWithMissingChangeDetection(<String>[
           '--pr-labels=some label,override: no versioning needed,another-label'
         ]);
 
@@ -906,7 +905,7 @@
         ];
 
         Error? commandError;
-        final List<String> output = await _runWithMissingChangeDetection(
+        final List<String> output = await runWithMissingChangeDetection(
             <String>[], errorHandler: (Error e) {
           commandError = e;
         });
@@ -942,7 +941,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -973,7 +972,7 @@
         ];
 
         Error? commandError;
-        final List<String> output = await _runWithMissingChangeDetection(
+        final List<String> output = await runWithMissingChangeDetection(
             <String>[], errorHandler: (Error e) {
           commandError = e;
         });
@@ -1006,7 +1005,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[
+            await runWithMissingChangeDetection(<String>[
           '--pr-labels=some label,override: no changelog needed,another-label'
         ]);
 
@@ -1050,7 +1049,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
@@ -1082,7 +1081,7 @@
         ];
 
         final List<String> output =
-            await _runWithMissingChangeDetection(<String>[]);
+            await runWithMissingChangeDetection(<String>[]);
 
         expect(
           output,
