diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md
index 992c8b2..382798f 100644
--- a/packages/image_picker/image_picker/CHANGELOG.md
+++ b/packages/image_picker/image_picker/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.8.4+9
+
+* Internal code cleanup for stricter analysis options.
+
 ## 0.8.4+8
 
 * Configures the `UIImagePicker` to default to gallery instead of camera when
diff --git a/packages/image_picker/image_picker/analysis_options.yaml b/packages/image_picker/image_picker/analysis_options.yaml
deleted file mode 100644
index 5aeb4e7..0000000
--- a/packages/image_picker/image_picker/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../../analysis_options_legacy.yaml
diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart
index 0f5ba76..f3ad237 100755
--- a/packages/image_picker/image_picker/example/lib/main.dart
+++ b/packages/image_picker/image_picker/example/lib/main.dart
@@ -19,7 +19,7 @@
 class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
-    return MaterialApp(
+    return const MaterialApp(
       title: 'Image Picker Demo',
       home: MyHomePage(title: 'Image Picker Example'),
     );
@@ -27,7 +27,7 @@
 }
 
 class MyHomePage extends StatefulWidget {
-  MyHomePage({Key? key, this.title}) : super(key: key);
+  const MyHomePage({Key? key, this.title}) : super(key: key);
 
   final String? title;
 
@@ -39,7 +39,7 @@
   List<XFile>? _imageFileList;
 
   set _imageFile(XFile? value) {
-    _imageFileList = value == null ? null : [value];
+    _imageFileList = value == null ? null : <XFile>[value];
   }
 
   dynamic _pickImageError;
@@ -69,7 +69,7 @@
       // Mute the video so it auto-plays in web!
       // This is not needed if the call to .play is the result of user
       // interaction (clicking on a "play" button, for example).
-      final double volume = kIsWeb ? 0.0 : 1.0;
+      const double volume = kIsWeb ? 0.0 : 1.0;
       await controller.setVolume(volume);
       await controller.initialize();
       await controller.setLooping(true);
@@ -78,7 +78,7 @@
     }
   }
 
-  void _onImageButtonPressed(ImageSource source,
+  Future<void> _onImageButtonPressed(ImageSource source,
       {BuildContext? context, bool isMultiImage = false}) async {
     if (_controller != null) {
       await _controller!.setVolume(0.0);
@@ -91,7 +91,7 @@
       await _displayPickImageDialog(context!,
           (double? maxWidth, double? maxHeight, int? quality) async {
         try {
-          final pickedFileList = await _picker.pickMultiImage(
+          final List<XFile>? pickedFileList = await _picker.pickMultiImage(
             maxWidth: maxWidth,
             maxHeight: maxHeight,
             imageQuality: quality,
@@ -109,7 +109,7 @@
       await _displayPickImageDialog(context!,
           (double? maxWidth, double? maxHeight, int? quality) async {
         try {
-          final pickedFile = await _picker.pickImage(
+          final XFile? pickedFile = await _picker.pickImage(
             source: source,
             maxWidth: maxWidth,
             maxHeight: maxHeight,
@@ -179,7 +179,7 @@
       return Semantics(
           child: ListView.builder(
             key: UniqueKey(),
-            itemBuilder: (context, index) {
+            itemBuilder: (BuildContext context, int index) {
               // Why network for web?
               // See https://pub.dev/packages/image_picker#getting-ready-for-the-web-platform
               return Semantics(
@@ -358,28 +358,30 @@
       BuildContext context, OnPickImageCallback onPick) async {
     return showDialog(
         context: context,
-        builder: (context) {
+        builder: (BuildContext context) {
           return AlertDialog(
-            title: Text('Add optional parameters'),
+            title: const Text('Add optional parameters'),
             content: Column(
               children: <Widget>[
                 TextField(
                   controller: maxWidthController,
-                  keyboardType: TextInputType.numberWithOptions(decimal: true),
-                  decoration:
-                      InputDecoration(hintText: "Enter maxWidth if desired"),
+                  keyboardType:
+                      const TextInputType.numberWithOptions(decimal: true),
+                  decoration: const InputDecoration(
+                      hintText: 'Enter maxWidth if desired'),
                 ),
                 TextField(
                   controller: maxHeightController,
-                  keyboardType: TextInputType.numberWithOptions(decimal: true),
-                  decoration:
-                      InputDecoration(hintText: "Enter maxHeight if desired"),
+                  keyboardType:
+                      const TextInputType.numberWithOptions(decimal: true),
+                  decoration: const InputDecoration(
+                      hintText: 'Enter maxHeight if desired'),
                 ),
                 TextField(
                   controller: qualityController,
                   keyboardType: TextInputType.number,
-                  decoration:
-                      InputDecoration(hintText: "Enter quality if desired"),
+                  decoration: const InputDecoration(
+                      hintText: 'Enter quality if desired'),
                 ),
               ],
             ),
@@ -393,13 +395,13 @@
               TextButton(
                   child: const Text('PICK'),
                   onPressed: () {
-                    double? width = maxWidthController.text.isNotEmpty
+                    final double? width = maxWidthController.text.isNotEmpty
                         ? double.parse(maxWidthController.text)
                         : null;
-                    double? height = maxHeightController.text.isNotEmpty
+                    final double? height = maxHeightController.text.isNotEmpty
                         ? double.parse(maxHeightController.text)
                         : null;
-                    int? quality = qualityController.text.isNotEmpty
+                    final int? quality = qualityController.text.isNotEmpty
                         ? int.parse(qualityController.text)
                         : null;
                     onPick(width, height, quality);
@@ -411,11 +413,11 @@
   }
 }
 
-typedef void OnPickImageCallback(
+typedef OnPickImageCallback = void Function(
     double? maxWidth, double? maxHeight, int? quality);
 
 class AspectRatioVideo extends StatefulWidget {
-  AspectRatioVideo(this.controller);
+  const AspectRatioVideo(this.controller);
 
   final VideoPlayerController? controller;
 
diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml
index e11da82..28b3719 100755
--- a/packages/image_picker/image_picker/example/pubspec.yaml
+++ b/packages/image_picker/image_picker/example/pubspec.yaml
@@ -7,7 +7,6 @@
   flutter: ">=2.5.0"
 
 dependencies:
-  video_player: ^2.1.4
   flutter:
     sdk: flutter
   flutter_plugin_android_lifecycle: ^2.0.1
@@ -18,6 +17,7 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
+  video_player: ^2.1.4
 
 dev_dependencies:
   espresso: ^0.1.0+2
@@ -25,7 +25,6 @@
     sdk: flutter
   integration_test:
     sdk: flutter
-  pedantic: ^1.10.0
 
 flutter:
   uses-material-design: true
diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml
index 43143f1..1d280f1 100755
--- a/packages/image_picker/image_picker/pubspec.yaml
+++ b/packages/image_picker/image_picker/pubspec.yaml
@@ -3,7 +3,7 @@
   library, and taking new pictures with the camera.
 repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
-version: 0.8.4+8
+version: 0.8.4+9
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
@@ -31,5 +31,4 @@
   flutter_test:
     sdk: flutter
   mockito: ^5.0.0
-  pedantic: ^1.10.0
   plugin_platform_interface: ^2.0.0
diff --git a/packages/image_picker/image_picker/test/image_picker_deprecated_test.dart b/packages/image_picker/image_picker/test/image_picker_deprecated_test.dart
index f295e3d..00049e1 100644
--- a/packages/image_picker/image_picker/test/image_picker_deprecated_test.dart
+++ b/packages/image_picker/image_picker/test/image_picker_deprecated_test.dart
@@ -23,7 +23,7 @@
 
     final List<MethodCall> log = <MethodCall>[];
 
-    final picker = ImagePicker();
+    final ImagePicker picker = ImagePicker();
 
     test('ImagePicker platform instance overrides the actual platform used',
         () {
@@ -359,7 +359,7 @@
       setUp(() {
         channel.setMockMethodCallHandler((MethodCall methodCall) async {
           log.add(methodCall);
-          return [];
+          return <dynamic>[];
         });
         log.clear();
       });
diff --git a/packages/image_picker/image_picker/test/image_picker_test.dart b/packages/image_picker/image_picker/test/image_picker_test.dart
index 10bc640..b41fbe3 100644
--- a/packages/image_picker/image_picker/test/image_picker_test.dart
+++ b/packages/image_picker/image_picker/test/image_picker_test.dart
@@ -18,7 +18,7 @@
 
     final List<MethodCall> log = <MethodCall>[];
 
-    final picker = ImagePicker();
+    final ImagePicker picker = ImagePicker();
 
     test('ImagePicker platform instance overrides the actual platform used',
         () {
@@ -321,7 +321,7 @@
             return <String, dynamic>{
               'type': 'image',
               'path': '/example/path1',
-              'pathList': ['/example/path0', '/example/path1'],
+              'pathList': <dynamic>['/example/path0', '/example/path1'],
             };
           });
 
@@ -372,7 +372,7 @@
       setUp(() {
         channel.setMockMethodCallHandler((MethodCall methodCall) async {
           log.add(methodCall);
-          return [];
+          return <dynamic>[];
         });
         log.clear();
       });
diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md
index 78629a4..dcf353f 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.6
+
+* Internal code cleanup for stricter analysis options.
+
 ## 2.1.5
 
 * Removes dependency on `meta`.
diff --git a/packages/image_picker/image_picker_for_web/analysis_options.yaml b/packages/image_picker/image_picker_for_web/analysis_options.yaml
deleted file mode 100644
index 5aeb4e7..0000000
--- a/packages/image_picker/image_picker_for_web/analysis_options.yaml
+++ /dev/null
@@ -1 +0,0 @@
-include: ../../../analysis_options_legacy.yaml
diff --git a/packages/image_picker/image_picker_for_web/example/integration_test/image_picker_for_web_test.dart b/packages/image_picker/image_picker_for_web/example/integration_test/image_picker_for_web_test.dart
index c1025a9..9fe40da 100644
--- a/packages/image_picker/image_picker_for_web/example/integration_test/image_picker_for_web_test.dart
+++ b/packages/image_picker/image_picker_for_web/example/integration_test/image_picker_for_web_test.dart
@@ -11,16 +11,17 @@
 import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
 import 'package:integration_test/integration_test.dart';
 
-final String expectedStringContents = 'Hello, world!';
-final String otherStringContents = 'Hello again, world!';
+const String expectedStringContents = 'Hello, world!';
+const String otherStringContents = 'Hello again, world!';
 final Uint8List bytes = utf8.encode(expectedStringContents) as Uint8List;
 final Uint8List otherBytes = utf8.encode(otherStringContents) as Uint8List;
-final Map<String, dynamic> options = {
+final Map<String, dynamic> options = <String, dynamic>{
   'type': 'text/plain',
   'lastModified': DateTime.utc(2017, 12, 13).millisecondsSinceEpoch,
 };
-final html.File textFile = html.File([bytes], 'hello.txt', options);
-final html.File secondTextFile = html.File([otherBytes], 'secondFile.txt');
+final html.File textFile = html.File(<Uint8List>[bytes], 'hello.txt', options);
+final html.File secondTextFile =
+    html.File(<Uint8List>[otherBytes], 'secondFile.txt');
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
@@ -33,16 +34,17 @@
   });
 
   testWidgets('Can select a file (Deprecated)', (WidgetTester tester) async {
-    final mockInput = html.FileUploadInputElement();
+    final html.FileUploadInputElement mockInput = html.FileUploadInputElement();
 
-    final overrides = ImagePickerPluginTestOverrides()
-      ..createInputElement = ((_, __) => mockInput)
-      ..getMultipleFilesFromInput = ((_) => [textFile]);
+    final ImagePickerPluginTestOverrides overrides =
+        ImagePickerPluginTestOverrides()
+          ..createInputElement = ((_, __) => mockInput)
+          ..getMultipleFilesFromInput = ((_) => <html.File>[textFile]);
 
-    final plugin = ImagePickerPlugin(overrides: overrides);
+    final ImagePickerPlugin plugin = ImagePickerPlugin(overrides: overrides);
 
     // Init the pick file dialog...
-    final file = plugin.pickFile();
+    final Future<PickedFile> file = plugin.pickFile();
 
     // Mock the browser behavior of selecting a file...
     mockInput.dispatchEvent(html.Event('change'));
@@ -54,16 +56,17 @@
   });
 
   testWidgets('Can select a file', (WidgetTester tester) async {
-    final mockInput = html.FileUploadInputElement();
+    final html.FileUploadInputElement mockInput = html.FileUploadInputElement();
 
-    final overrides = ImagePickerPluginTestOverrides()
-      ..createInputElement = ((_, __) => mockInput)
-      ..getMultipleFilesFromInput = ((_) => [textFile]);
+    final ImagePickerPluginTestOverrides overrides =
+        ImagePickerPluginTestOverrides()
+          ..createInputElement = ((_, __) => mockInput)
+          ..getMultipleFilesFromInput = ((_) => <html.File>[textFile]);
 
-    final plugin = ImagePickerPlugin(overrides: overrides);
+    final ImagePickerPlugin plugin = ImagePickerPlugin(overrides: overrides);
 
     // Init the pick file dialog...
-    final image = plugin.getImage(source: ImageSource.camera);
+    final Future<XFile> image = plugin.getImage(source: ImageSource.camera);
 
     // Mock the browser behavior of selecting a file...
     mockInput.dispatchEvent(html.Event('change'));
@@ -85,16 +88,18 @@
   });
 
   testWidgets('Can select multiple files', (WidgetTester tester) async {
-    final mockInput = html.FileUploadInputElement();
+    final html.FileUploadInputElement mockInput = html.FileUploadInputElement();
 
-    final overrides = ImagePickerPluginTestOverrides()
-      ..createInputElement = ((_, __) => mockInput)
-      ..getMultipleFilesFromInput = ((_) => [textFile, secondTextFile]);
+    final ImagePickerPluginTestOverrides overrides =
+        ImagePickerPluginTestOverrides()
+          ..createInputElement = ((_, __) => mockInput)
+          ..getMultipleFilesFromInput =
+              ((_) => <html.File>[textFile, secondTextFile]);
 
-    final plugin = ImagePickerPlugin(overrides: overrides);
+    final ImagePickerPlugin plugin = ImagePickerPlugin(overrides: overrides);
 
     // Init the pick file dialog...
-    final files = plugin.getMultiImage();
+    final Future<List<XFile>> files = plugin.getMultiImage();
 
     // Mock the browser behavior of selecting a file...
     mockInput.dispatchEvent(html.Event('change'));
@@ -135,7 +140,7 @@
 
   group('createInputElement', () {
     testWidgets('accept: any, capture: null', (WidgetTester tester) async {
-      html.Element input = plugin.createInputElement('any', null);
+      final html.Element input = plugin.createInputElement('any', null);
 
       expect(input.attributes, containsPair('accept', 'any'));
       expect(input.attributes, isNot(contains('capture')));
@@ -143,7 +148,7 @@
     });
 
     testWidgets('accept: any, capture: something', (WidgetTester tester) async {
-      html.Element input = plugin.createInputElement('any', 'something');
+      final html.Element input = plugin.createInputElement('any', 'something');
 
       expect(input.attributes, containsPair('accept', 'any'));
       expect(input.attributes, containsPair('capture', 'something'));
@@ -152,7 +157,7 @@
 
     testWidgets('accept: any, capture: null, multi: true',
         (WidgetTester tester) async {
-      html.Element input =
+      final html.Element input =
           plugin.createInputElement('any', null, multiple: true);
 
       expect(input.attributes, containsPair('accept', 'any'));
@@ -162,7 +167,7 @@
 
     testWidgets('accept: any, capture: something, multi: true',
         (WidgetTester tester) async {
-      html.Element input =
+      final html.Element input =
           plugin.createInputElement('any', 'something', multiple: true);
 
       expect(input.attributes, containsPair('accept', 'any'));
diff --git a/packages/image_picker/image_picker_for_web/example/integration_test/image_resizer_test.dart b/packages/image_picker/image_picker_for_web/example/integration_test/image_resizer_test.dart
index 067c775..91794a7 100644
--- a/packages/image_picker/image_picker_for_web/example/integration_test/image_resizer_test.dart
+++ b/packages/image_picker/image_picker_for_web/example/integration_test/image_resizer_test.dart
@@ -13,8 +13,8 @@
 import 'package:integration_test/integration_test.dart';
 
 //This is a sample 10x10 png image
-final String pngFileBase64Contents =
-    "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABlBMVEXqQzX+/v6lfubTAAAAAWJLR0QB/wIt3gAAAAlwSFlzAAAHEwAABxMBziAPCAAAAAd0SU1FB+UJHgsdDM0ErZoAAAALSURBVAjXY2DABwAAHgABboVHMgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wOS0zMFQxMToyOToxMi0wNDowMHCDC24AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDktMzBUMTE6Mjk6MTItMDQ6MDAB3rPSAAAAAElFTkSuQmCC";
+const String pngFileBase64Contents =
+    'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKAQMAAAC3/F3+AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABlBMVEXqQzX+/v6lfubTAAAAAWJLR0QB/wIt3gAAAAlwSFlzAAAHEwAABxMBziAPCAAAAAd0SU1FB+UJHgsdDM0ErZoAAAALSURBVAjXY2DABwAAHgABboVHMgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wOS0zMFQxMToyOToxMi0wNDowMHCDC24AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDktMzBUMTE6Mjk6MTItMDQ6MDAB3rPSAAAAAElFTkSuQmCC';
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
@@ -24,105 +24,114 @@
   late XFile pngFile;
   setUp(() {
     imageResizer = ImageResizer();
-    final pngHtmlFile = _base64ToFile(pngFileBase64Contents, "pngImage.png");
+    final html.File pngHtmlFile =
+        _base64ToFile(pngFileBase64Contents, 'pngImage.png');
     pngFile = XFile(html.Url.createObjectUrl(pngHtmlFile),
         name: pngHtmlFile.name, mimeType: pngHtmlFile.type);
   });
 
-  testWidgets("image is loaded correctly ", (WidgetTester tester) async {
-    final imageElement = await imageResizer.loadImage(pngFile.path);
+  testWidgets('image is loaded correctly ', (WidgetTester tester) async {
+    final html.ImageElement imageElement =
+        await imageResizer.loadImage(pngFile.path);
     expect(imageElement.width!, 10);
     expect(imageElement.height!, 10);
   });
 
   testWidgets(
       "canvas is loaded with image's width and height when max width and max height are null",
-      (widgetTester) async {
-    final imageElement = await imageResizer.loadImage(pngFile.path);
-    final canvas = imageResizer.resizeImageElement(imageElement, null, null);
+      (WidgetTester widgetTester) async {
+    final html.ImageElement imageElement =
+        await imageResizer.loadImage(pngFile.path);
+    final html.CanvasElement canvas =
+        imageResizer.resizeImageElement(imageElement, null, null);
     expect(canvas.width, imageElement.width);
     expect(canvas.height, imageElement.height);
   });
 
   testWidgets(
-      "canvas size is scaled when max width and max height are not null",
-      (widgetTester) async {
-    final imageElement = await imageResizer.loadImage(pngFile.path);
-    final canvas = imageResizer.resizeImageElement(imageElement, 8, 8);
+      'canvas size is scaled when max width and max height are not null',
+      (WidgetTester widgetTester) async {
+    final html.ImageElement imageElement =
+        await imageResizer.loadImage(pngFile.path);
+    final html.CanvasElement canvas =
+        imageResizer.resizeImageElement(imageElement, 8, 8);
     expect(canvas.width, 8);
     expect(canvas.height, 8);
   });
 
-  testWidgets("resized image is returned after converting canvas to file",
-      (widgetTester) async {
-    final imageElement = await imageResizer.loadImage(pngFile.path);
-    final canvas = imageResizer.resizeImageElement(imageElement, null, null);
-    final resizedImage =
+  testWidgets('resized image is returned after converting canvas to file',
+      (WidgetTester widgetTester) async {
+    final html.ImageElement imageElement =
+        await imageResizer.loadImage(pngFile.path);
+    final html.CanvasElement canvas =
+        imageResizer.resizeImageElement(imageElement, null, null);
+    final XFile resizedImage =
         await imageResizer.writeCanvasToFile(pngFile, canvas, null);
-    expect(resizedImage.name, "scaled_${pngFile.name}");
+    expect(resizedImage.name, 'scaled_${pngFile.name}');
   });
 
-  testWidgets("image is scaled when maxWidth is set",
+  testWidgets('image is scaled when maxWidth is set',
       (WidgetTester tester) async {
-    final scaledImage =
+    final XFile scaledImage =
         await imageResizer.resizeImageIfNeeded(pngFile, 5, null, null);
-    expect(scaledImage.name, "scaled_${pngFile.name}");
-    final scaledImageSize = await _getImageSize(scaledImage);
-    expect(scaledImageSize, Size(5, 5));
+    expect(scaledImage.name, 'scaled_${pngFile.name}');
+    final Size scaledImageSize = await _getImageSize(scaledImage);
+    expect(scaledImageSize, const Size(5, 5));
   });
 
-  testWidgets("image is scaled when maxHeight is set",
+  testWidgets('image is scaled when maxHeight is set',
       (WidgetTester tester) async {
-    final scaledImage =
+    final XFile scaledImage =
         await imageResizer.resizeImageIfNeeded(pngFile, null, 6, null);
-    expect(scaledImage.name, "scaled_${pngFile.name}");
-    final scaledImageSize = await _getImageSize(scaledImage);
-    expect(scaledImageSize, Size(6, 6));
+    expect(scaledImage.name, 'scaled_${pngFile.name}');
+    final Size scaledImageSize = await _getImageSize(scaledImage);
+    expect(scaledImageSize, const Size(6, 6));
   });
 
-  testWidgets("image is scaled when imageQuality is set",
+  testWidgets('image is scaled when imageQuality is set',
       (WidgetTester tester) async {
-    final scaledImage =
+    final XFile scaledImage =
         await imageResizer.resizeImageIfNeeded(pngFile, null, null, 89);
-    expect(scaledImage.name, "scaled_${pngFile.name}");
+    expect(scaledImage.name, 'scaled_${pngFile.name}');
   });
 
-  testWidgets("image is scaled when maxWidth,maxHeight,imageQuality are set",
+  testWidgets('image is scaled when maxWidth,maxHeight,imageQuality are set',
       (WidgetTester tester) async {
-    final scaledImage =
+    final XFile scaledImage =
         await imageResizer.resizeImageIfNeeded(pngFile, 3, 4, 89);
-    expect(scaledImage.name, "scaled_${pngFile.name}");
+    expect(scaledImage.name, 'scaled_${pngFile.name}');
   });
 
-  testWidgets("image is not scaled when maxWidth,maxHeight, is set",
+  testWidgets('image is not scaled when maxWidth,maxHeight, is set',
       (WidgetTester tester) async {
-    final scaledImage =
+    final XFile scaledImage =
         await imageResizer.resizeImageIfNeeded(pngFile, null, null, null);
     expect(scaledImage.name, pngFile.name);
   });
 }
 
 Future<Size> _getImageSize(XFile file) async {
-  final completer = Completer<Size>();
-  final image = html.ImageElement(src: file.path);
-  image.onLoad.listen((event) {
+  final Completer<Size> completer = Completer<Size>();
+  final html.ImageElement image = html.ImageElement(src: file.path);
+  image.onLoad.listen((html.Event event) {
     completer.complete(Size(image.width!.toDouble(), image.height!.toDouble()));
   });
-  image.onError.listen((event) {
-    completer.complete(Size(0, 0));
+  image.onError.listen((html.Event event) {
+    completer.complete(const Size(0, 0));
   });
   return completer.future;
 }
 
 html.File _base64ToFile(String data, String fileName) {
-  var arr = data.split(',');
-  var bstr = html.window.atob(arr[1]);
-  var n = bstr.length, u8arr = Uint8List(n);
+  final List<String> arr = data.split(',');
+  final String bstr = html.window.atob(arr[1]);
+  int n = bstr.length;
+  final Uint8List u8arr = Uint8List(n);
 
   while (n >= 1) {
     u8arr[n - 1] = bstr.codeUnitAt(n - 1);
     n--;
   }
 
-  return html.File([u8arr], fileName);
+  return html.File(<Uint8List>[u8arr], fileName);
 }
diff --git a/packages/image_picker/image_picker_for_web/example/lib/main.dart b/packages/image_picker/image_picker_for_web/example/lib/main.dart
index e1a38dc..341913a 100644
--- a/packages/image_picker/image_picker_for_web/example/lib/main.dart
+++ b/packages/image_picker/image_picker_for_web/example/lib/main.dart
@@ -17,7 +17,7 @@
 class _MyAppState extends State<MyApp> {
   @override
   Widget build(BuildContext context) {
-    return Directionality(
+    return const Directionality(
       textDirection: TextDirection.ltr,
       child: Text('Testing... Look at the console output for results!'),
     );
diff --git a/packages/image_picker/image_picker_for_web/example/pubspec.yaml b/packages/image_picker/image_picker_for_web/example/pubspec.yaml
index 306a857..a9d6c7b 100644
--- a/packages/image_picker/image_picker_for_web/example/pubspec.yaml
+++ b/packages/image_picker/image_picker_for_web/example/pubspec.yaml
@@ -6,16 +6,16 @@
   flutter: ">=2.2.0"
 
 dependencies:
-  image_picker_for_web:
-    path: ../
   flutter:
     sdk: flutter
+  image_picker_for_web:
+    path: ../
 
 dev_dependencies:
-  js: ^0.6.3
-  flutter_test:
-    sdk: flutter
   flutter_driver:
     sdk: flutter
+  flutter_test:
+    sdk: flutter
   integration_test:
     sdk: flutter
+  js: ^0.6.3
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 1320875..88d439c 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
@@ -10,22 +10,14 @@
 import 'package:image_picker_for_web/src/image_resizer.dart';
 import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
 
-final String _kImagePickerInputsDomId = '__image_picker_web-file-input';
-final String _kAcceptImageMimeType = 'image/*';
-final String _kAcceptVideoMimeType = 'video/3gpp,video/x-m4v,video/mp4,video/*';
+const String _kImagePickerInputsDomId = '__image_picker_web-file-input';
+const String _kAcceptImageMimeType = 'image/*';
+const String _kAcceptVideoMimeType = 'video/3gpp,video/x-m4v,video/mp4,video/*';
 
 /// The web implementation of [ImagePickerPlatform].
 ///
 /// This class implements the `package:image_picker` functionality for the web.
 class ImagePickerPlugin extends ImagePickerPlatform {
-  final ImagePickerPluginTestOverrides? _overrides;
-
-  bool get _hasOverrides => _overrides != null;
-
-  late html.Element _target;
-
-  late ImageResizer _imageResizer;
-
   /// A constructor that allows tests to override the function that creates file inputs.
   ImagePickerPlugin({
     @visibleForTesting ImagePickerPluginTestOverrides? overrides,
@@ -35,6 +27,14 @@
     _target = _ensureInitialized(_kImagePickerInputsDomId);
   }
 
+  final ImagePickerPluginTestOverrides? _overrides;
+
+  bool get _hasOverrides => _overrides != null;
+
+  late html.Element _target;
+
+  late ImageResizer _imageResizer;
+
   /// Registers this class as the default instance of [ImagePickerPlatform].
   static void registerWith(Registrar registrar) {
     ImagePickerPlatform.instance = ImagePickerPlugin();
@@ -60,7 +60,8 @@
     int? imageQuality,
     CameraDevice preferredCameraDevice = CameraDevice.rear,
   }) {
-    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
+    final String? capture =
+        computeCaptureAttribute(source, preferredCameraDevice);
     return pickFile(accept: _kAcceptImageMimeType, capture: capture);
   }
 
@@ -82,7 +83,8 @@
     CameraDevice preferredCameraDevice = CameraDevice.rear,
     Duration? maxDuration,
   }) {
-    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
+    final String? capture =
+        computeCaptureAttribute(source, preferredCameraDevice);
     return pickFile(accept: _kAcceptVideoMimeType, capture: capture);
   }
 
@@ -96,7 +98,7 @@
     String? accept,
     String? capture,
   }) {
-    html.FileUploadInputElement input =
+    final html.FileUploadInputElement input =
         createInputElement(accept, capture) as html.FileUploadInputElement;
     _injectAndActivate(input);
     return _getSelectedFile(input);
@@ -122,8 +124,9 @@
     int? imageQuality,
     CameraDevice preferredCameraDevice = CameraDevice.rear,
   }) async {
-    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
-    List<XFile> files = await getFiles(
+    final String? capture =
+        computeCaptureAttribute(source, preferredCameraDevice);
+    final List<XFile> files = await getFiles(
       accept: _kAcceptImageMimeType,
       capture: capture,
     );
@@ -153,8 +156,9 @@
     CameraDevice preferredCameraDevice = CameraDevice.rear,
     Duration? maxDuration,
   }) async {
-    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
-    List<XFile> files = await getFiles(
+    final String? capture =
+        computeCaptureAttribute(source, preferredCameraDevice);
+    final List<XFile> files = await getFiles(
       accept: _kAcceptVideoMimeType,
       capture: capture,
     );
@@ -173,7 +177,7 @@
       multiple: true,
     );
     final Iterable<Future<XFile>> resized = images.map(
-      (image) => _imageResizer.resizeImageIfNeeded(
+      (XFile image) => _imageResizer.resizeImageIfNeeded(
         image,
         maxWidth,
         maxHeight,
@@ -199,7 +203,7 @@
     String? capture,
     bool multiple = false,
   }) {
-    html.FileUploadInputElement input = createInputElement(
+    final html.FileUploadInputElement input = createInputElement(
       accept,
       capture,
       multiple: multiple,
@@ -232,24 +236,24 @@
   /// Handles the OnChange event from a FileUploadInputElement object
   /// Returns a list of selected files.
   List<html.File>? _handleOnChangeEvent(html.Event event) {
-    final html.FileUploadInputElement input =
-        event.target as html.FileUploadInputElement;
-    return _getFilesFromInput(input);
+    final html.FileUploadInputElement? input =
+        event.target as html.FileUploadInputElement?;
+    return input == null ? null : _getFilesFromInput(input);
   }
 
   /// Monitors an <input type="file"> and returns the selected file.
   Future<PickedFile> _getSelectedFile(html.FileUploadInputElement input) {
     final Completer<PickedFile> _completer = Completer<PickedFile>();
     // Observe the input until we can return something
-    input.onChange.first.then((event) {
-      final files = _handleOnChangeEvent(event);
+    input.onChange.first.then((html.Event event) {
+      final List<html.File>? files = _handleOnChangeEvent(event);
       if (!_completer.isCompleted && files != null) {
         _completer.complete(PickedFile(
           html.Url.createObjectUrl(files.first),
         ));
       }
     });
-    input.onError.first.then((event) {
+    input.onError.first.then((html.Event event) {
       if (!_completer.isCompleted) {
         _completer.completeError(event);
       }
@@ -264,10 +268,10 @@
   Future<List<XFile>> _getSelectedXFiles(html.FileUploadInputElement input) {
     final Completer<List<XFile>> _completer = Completer<List<XFile>>();
     // Observe the input until we can return something
-    input.onChange.first.then((event) {
-      final files = _handleOnChangeEvent(event);
+    input.onChange.first.then((html.Event event) {
+      final List<html.File>? files = _handleOnChangeEvent(event);
       if (!_completer.isCompleted && files != null) {
-        _completer.complete(files.map((file) {
+        _completer.complete(files.map((html.File file) {
           return XFile(
             html.Url.createObjectUrl(file),
             name: file.name,
@@ -280,7 +284,7 @@
         }).toList());
       }
     });
-    input.onError.first.then((event) {
+    input.onError.first.then((html.Event event) {
       if (!_completer.isCompleted) {
         _completer.completeError(event);
       }
@@ -293,7 +297,7 @@
 
   /// Initializes a DOM container where we can host input elements.
   html.Element _ensureInitialized(String id) {
-    var target = html.querySelector('#${id}');
+    html.Element? target = html.querySelector('#$id');
     if (target == null) {
       final html.Element targetElement =
           html.Element.tag('flt-image-picker-inputs')..id = id;
@@ -316,7 +320,7 @@
       return _overrides!.createInputElement(accept, capture);
     }
 
-    html.Element element = html.FileUploadInputElement()
+    final html.Element element = html.FileUploadInputElement()
       ..accept = accept
       ..multiple = multiple;
 
diff --git a/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart b/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart
index 6ee7c5f..e063099 100644
--- a/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart
+++ b/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart
@@ -3,11 +3,12 @@
 // found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:html' as html;
 import 'dart:math';
 import 'dart:ui';
+
 import 'package:image_picker_for_web/src/image_resizer_utils.dart';
 import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
-import 'dart:html' as html;
 
 /// Helper class that resizes images.
 class ImageResizer {
@@ -16,14 +17,16 @@
   Future<XFile> resizeImageIfNeeded(XFile file, double? maxWidth,
       double? maxHeight, int? imageQuality) async {
     if (!imageResizeNeeded(maxWidth, maxHeight, imageQuality) ||
-        file.mimeType == "image/gif") {
+        file.mimeType == 'image/gif') {
       // Implement maxWidth and maxHeight for image/gif
       return file;
     }
     try {
-      final imageElement = await loadImage(file.path);
-      final canvas = resizeImageElement(imageElement, maxWidth, maxHeight);
-      final resizedImage = await writeCanvasToFile(file, canvas, imageQuality);
+      final html.ImageElement imageElement = await loadImage(file.path);
+      final html.CanvasElement canvas =
+          resizeImageElement(imageElement, maxWidth, maxHeight);
+      final XFile resizedImage =
+          await writeCanvasToFile(file, canvas, imageQuality);
       html.Url.revokeObjectUrl(file.path);
       return resizedImage;
     } catch (e) {
@@ -33,15 +36,16 @@
 
   /// function that loads the blobUrl into an imageElement
   Future<html.ImageElement> loadImage(String blobUrl) {
-    final imageLoadCompleter = Completer<html.ImageElement>();
-    final imageElement = html.ImageElement();
+    final Completer<html.ImageElement> imageLoadCompleter =
+        Completer<html.ImageElement>();
+    final html.ImageElement imageElement = html.ImageElement();
     imageElement.src = blobUrl;
 
-    imageElement.onLoad.listen((event) {
+    imageElement.onLoad.listen((html.Event event) {
       imageLoadCompleter.complete(imageElement);
     });
-    imageElement.onError.listen((event) {
-      final exception = ("Error while loading image.");
+    imageElement.onError.listen((html.Event event) {
+      const String exception = 'Error while loading image.';
       imageElement.remove();
       imageLoadCompleter.completeError(exception);
     });
@@ -51,14 +55,14 @@
   /// Draws image to a canvas while resizing the image to fit the [maxWidth],[maxHeight] constraints
   html.CanvasElement resizeImageElement(
       html.ImageElement source, double? maxWidth, double? maxHeight) {
-    final newImageSize = calculateSizeOfDownScaledImage(
+    final Size newImageSize = calculateSizeOfDownScaledImage(
         Size(source.width!.toDouble(), source.height!.toDouble()),
         maxWidth,
         maxHeight);
-    final canvas = html.CanvasElement();
+    final html.CanvasElement canvas = html.CanvasElement();
     canvas.width = newImageSize.width.toInt();
     canvas.height = newImageSize.height.toInt();
-    final context = canvas.context2D;
+    final html.CanvasRenderingContext2D context = canvas.context2D;
     if (maxHeight == null && maxWidth == null) {
       context.drawImage(source, 0, 0);
     } else {
@@ -71,12 +75,13 @@
   /// [imageQuality] is only supported for jpeg and webp images.
   Future<XFile> writeCanvasToFile(
       XFile originalFile, html.CanvasElement canvas, int? imageQuality) async {
-    final calculatedImageQuality = ((min(imageQuality ?? 100, 100)) / 100.0);
-    final blob =
+    final double calculatedImageQuality =
+        (min(imageQuality ?? 100, 100)) / 100.0;
+    final html.Blob blob =
         await canvas.toBlob(originalFile.mimeType, calculatedImageQuality);
     return XFile(html.Url.createObjectUrlFromBlob(blob),
         mimeType: originalFile.mimeType,
-        name: "scaled_" + originalFile.name,
+        name: 'scaled_' + originalFile.name,
         lastModified: DateTime.now(),
         length: blob.size);
   }
diff --git a/packages/image_picker/image_picker_for_web/lib/src/image_resizer_utils.dart b/packages/image_picker/image_picker_for_web/lib/src/image_resizer_utils.dart
index 6ef7892..e906a88 100644
--- a/packages/image_picker/image_picker_for_web/lib/src/image_resizer_utils.dart
+++ b/packages/image_picker/image_picker_for_web/lib/src/image_resizer_utils.dart
@@ -16,7 +16,7 @@
 
 /// a function that checks if image quality is between 0 to 100
 bool isImageQualityValid(int imageQuality) {
-  return (imageQuality >= 0 && imageQuality <= 100);
+  return imageQuality >= 0 && imageQuality <= 100;
 }
 
 /// a function that calculates the size of the downScaled image.
@@ -26,8 +26,9 @@
 /// maxHeight is the maximum height of the scaled image
 Size calculateSizeOfDownScaledImage(
     Size imageSize, double? maxWidth, double? maxHeight) {
-  double widthFactor = maxWidth != null ? imageSize.width / maxWidth : 1;
-  double heightFactor = maxHeight != null ? imageSize.height / maxHeight : 1;
-  double resizeFactor = max(widthFactor, heightFactor);
-  return (resizeFactor > 1 ? imageSize ~/ resizeFactor : imageSize);
+  final double widthFactor = maxWidth != null ? imageSize.width / maxWidth : 1;
+  final double heightFactor =
+      maxHeight != null ? imageSize.height / maxHeight : 1;
+  final double resizeFactor = max(widthFactor, heightFactor);
+  return resizeFactor > 1 ? imageSize ~/ resizeFactor : imageSize;
 }
diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml
index 285656a..deccd2b 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.5
+version: 2.1.6
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
@@ -22,7 +22,6 @@
   flutter_web_plugins:
     sdk: flutter
   image_picker_platform_interface: ^2.2.0
-  pedantic: ^1.10.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/image_picker/image_picker_for_web/test/image_resizer_utils_test.dart b/packages/image_picker/image_picker_for_web/test/image_resizer_utils_test.dart
index 352d2be..0bfa817 100644
--- a/packages/image_picker/image_picker_for_web/test/image_resizer_utils_test.dart
+++ b/packages/image_picker/image_picker_for_web/test/image_resizer_utils_test.dart
@@ -8,34 +8,34 @@
 
 void main() {
   group('Image Resizer Utils', () {
-    group("calculateSizeOfScaledImage", () {
+    group('calculateSizeOfScaledImage', () {
       test(
           "scaled image height and width are same if max width and max height are same as image's width and height",
           () {
-        expect(calculateSizeOfDownScaledImage(Size(500, 300), 500, 300),
-            Size(500, 300));
+        expect(calculateSizeOfDownScaledImage(const Size(500, 300), 500, 300),
+            const Size(500, 300));
       });
 
       test(
-          "scaled image height and width are same if max width and max height are null",
+          'scaled image height and width are same if max width and max height are null',
           () {
-        expect(calculateSizeOfDownScaledImage(Size(500, 300), null, null),
-            Size(500, 300));
+        expect(calculateSizeOfDownScaledImage(const Size(500, 300), null, null),
+            const Size(500, 300));
       });
 
-      test("image size is scaled when maxWidth is set", () {
-        final imageSize = Size(500, 300);
-        final maxWidth = 400;
-        final scaledSize = calculateSizeOfDownScaledImage(
+      test('image size is scaled when maxWidth is set', () {
+        const Size imageSize = Size(500, 300);
+        const int maxWidth = 400;
+        final Size scaledSize = calculateSizeOfDownScaledImage(
             Size(imageSize.width, imageSize.height), maxWidth.toDouble(), null);
         expect(scaledSize.height <= imageSize.height, true);
         expect(scaledSize.width <= maxWidth, true);
       });
 
-      test("image size is scaled when maxHeight is set", () {
-        final imageSize = Size(500, 300);
-        final maxHeight = 400;
-        final scaledSize = calculateSizeOfDownScaledImage(
+      test('image size is scaled when maxHeight is set', () {
+        const Size imageSize = Size(500, 300);
+        const int maxHeight = 400;
+        final Size scaledSize = calculateSizeOfDownScaledImage(
             Size(imageSize.width, imageSize.height),
             null,
             maxHeight.toDouble());
@@ -43,11 +43,11 @@
         expect(scaledSize.width <= imageSize.width, true);
       });
 
-      test("image size is scaled when both maxWidth and maxHeight is set", () {
-        final imageSize = Size(1120, 2000);
-        final maxHeight = 1200;
-        final maxWidth = 99;
-        final scaledSize = calculateSizeOfDownScaledImage(
+      test('image size is scaled when both maxWidth and maxHeight is set', () {
+        const Size imageSize = Size(1120, 2000);
+        const int maxHeight = 1200;
+        const int maxWidth = 99;
+        final Size scaledSize = calculateSizeOfDownScaledImage(
             Size(imageSize.width, imageSize.height),
             maxWidth.toDouble(),
             maxHeight.toDouble());
@@ -55,34 +55,34 @@
         expect(scaledSize.width <= maxWidth, true);
       });
     });
-    group("imageResizeNeeded", () {
-      test("image needs to be resized when maxWidth is set", () {
+    group('imageResizeNeeded', () {
+      test('image needs to be resized when maxWidth is set', () {
         expect(imageResizeNeeded(50, null, null), true);
       });
 
-      test("image needs to be resized when maxHeight is set", () {
+      test('image needs to be resized when maxHeight is set', () {
         expect(imageResizeNeeded(null, 50, null), true);
       });
 
-      test("image needs to be resized  when imageQuality is set", () {
+      test('image needs to be resized  when imageQuality is set', () {
         expect(imageResizeNeeded(null, null, 100), true);
       });
 
-      test("image will not be resized when imageQuality is not valid", () {
+      test('image will not be resized when imageQuality is not valid', () {
         expect(imageResizeNeeded(null, null, 101), false);
         expect(imageResizeNeeded(null, null, -1), false);
       });
     });
 
-    group("isImageQualityValid", () {
-      test("image quality is valid in 0 to 100", () {
+    group('isImageQualityValid', () {
+      test('image quality is valid in 0 to 100', () {
         expect(isImageQualityValid(50), true);
         expect(isImageQualityValid(0), true);
         expect(isImageQualityValid(100), true);
       });
 
       test(
-          "image quality is not valid when imageQuality is less than 0 or greater than 100",
+          'image quality is not valid when imageQuality is less than 0 or greater than 100',
           () {
         expect(isImageQualityValid(-1), false);
         expect(isImageQualityValid(101), false);
diff --git a/script/configs/custom_analysis.yaml b/script/configs/custom_analysis.yaml
index d434b5d..13a6819 100644
--- a/script/configs/custom_analysis.yaml
+++ b/script/configs/custom_analysis.yaml
@@ -17,8 +17,6 @@
 - google_sign_in/google_sign_in
 - google_sign_in/google_sign_in_platform_interface
 - google_sign_in/google_sign_in_web
-- image_picker/image_picker
-- image_picker/image_picker_for_web
 - image_picker/image_picker_platform_interface
 - in_app_purchase/in_app_purchase
 - in_app_purchase/in_app_purchase_android
