[image_picker_web] Migrate to null-safety (#3535)

diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md
index 4c452ee..37b17b3 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.0.0-nullsafety
+
+* Migrate to null safety.
+
 # 0.1.0+3
 
 * Update Flutter SDK constraint.
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 e50b4aa..0c05980 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
@@ -13,14 +13,14 @@
 ///
 /// This class implements the `package:image_picker` functionality for the web.
 class ImagePickerPlugin extends ImagePickerPlatform {
-  final ImagePickerPluginTestOverrides _overrides;
+  final ImagePickerPluginTestOverrides? _overrides;
   bool get _hasOverrides => _overrides != null;
 
-  html.Element _target;
+  late html.Element _target;
 
   /// A constructor that allows tests to override the function that creates file inputs.
   ImagePickerPlugin({
-    @visibleForTesting ImagePickerPluginTestOverrides overrides,
+    @visibleForTesting ImagePickerPluginTestOverrides? overrides,
   }) : _overrides = overrides {
     _target = _ensureInitialized(_kImagePickerInputsDomId);
   }
@@ -32,23 +32,23 @@
 
   @override
   Future<PickedFile> pickImage({
-    @required ImageSource source,
-    double maxWidth,
-    double maxHeight,
-    int imageQuality,
+    required ImageSource source,
+    double? maxWidth,
+    double? maxHeight,
+    int? imageQuality,
     CameraDevice preferredCameraDevice = CameraDevice.rear,
   }) {
-    String capture = computeCaptureAttribute(source, preferredCameraDevice);
+    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
     return pickFile(accept: _kAcceptImageMimeType, capture: capture);
   }
 
   @override
   Future<PickedFile> pickVideo({
-    @required ImageSource source,
+    required ImageSource source,
     CameraDevice preferredCameraDevice = CameraDevice.rear,
-    Duration maxDuration,
+    Duration? maxDuration,
   }) {
-    String capture = computeCaptureAttribute(source, preferredCameraDevice);
+    String? capture = computeCaptureAttribute(source, preferredCameraDevice);
     return pickFile(accept: _kAcceptVideoMimeType, capture: capture);
   }
 
@@ -59,10 +59,11 @@
   /// See https://caniuse.com/#feat=html-media-capture
   @visibleForTesting
   Future<PickedFile> pickFile({
-    String accept,
-    String capture,
+    String? accept,
+    String? capture,
   }) {
-    html.FileUploadInputElement input = createInputElement(accept, capture);
+    html.FileUploadInputElement input =
+        createInputElement(accept, capture) as html.FileUploadInputElement;
     _injectAndActivate(input);
     return _getSelectedFile(input);
   }
@@ -73,25 +74,26 @@
   ///
   /// See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#capture
   @visibleForTesting
-  String computeCaptureAttribute(ImageSource source, CameraDevice device) {
+  String? computeCaptureAttribute(ImageSource source, CameraDevice device) {
     if (source == ImageSource.camera) {
       return (device == CameraDevice.front) ? 'user' : 'environment';
     }
     return null;
   }
 
-  html.File _getFileFromInput(html.FileUploadInputElement input) {
+  html.File? _getFileFromInput(html.FileUploadInputElement input) {
     if (_hasOverrides) {
-      return _overrides.getFileFromInput(input);
+      return _overrides!.getFileFromInput(input);
     }
-    return input?.files?.first;
+    return input.files?.first;
   }
 
   /// Handles the OnChange event from a FileUploadInputElement object
   /// Returns the objectURL of the selected file.
-  String _handleOnChangeEvent(html.Event event) {
-    final html.FileUploadInputElement input = event?.target;
-    final html.File file = _getFileFromInput(input);
+  String? _handleOnChangeEvent(html.Event event) {
+    final html.FileUploadInputElement input =
+        event.target as html.FileUploadInputElement;
+    final html.File? file = _getFileFromInput(input);
 
     if (file != null) {
       return html.Url.createObjectUrl(file);
@@ -105,7 +107,7 @@
     // Observe the input until we can return something
     input.onChange.first.then((event) {
       final objectUrl = _handleOnChangeEvent(event);
-      if (!_completer.isCompleted) {
+      if (!_completer.isCompleted && objectUrl != null) {
         _completer.complete(PickedFile(objectUrl));
       }
     });
@@ -127,7 +129,7 @@
       final html.Element targetElement =
           html.Element.tag('flt-image-picker-inputs')..id = id;
 
-      html.querySelector('body').children.add(targetElement);
+      html.querySelector('body')!.children.add(targetElement);
       target = targetElement;
     }
     return target;
@@ -136,9 +138,9 @@
   /// Creates an input element that accepts certain file types, and
   /// allows to `capture` from the device's cameras (where supported)
   @visibleForTesting
-  html.Element createInputElement(String accept, String capture) {
+  html.Element createInputElement(String? accept, String? capture) {
     if (_hasOverrides) {
-      return _overrides.createInputElement(accept, capture);
+      return _overrides!.createInputElement(accept, capture);
     }
 
     html.Element element = html.FileUploadInputElement()..accept = accept;
@@ -162,22 +164,22 @@
 /// A function that creates a file input with the passed in `accept` and `capture` attributes.
 @visibleForTesting
 typedef OverrideCreateInputFunction = html.Element Function(
-  String accept,
-  String capture,
+  String? accept,
+  String? capture,
 );
 
 /// A function that extracts a [html.File] from the file `input` passed in.
 @visibleForTesting
 typedef OverrideExtractFilesFromInputFunction = html.File Function(
-  html.Element input,
+  html.Element? input,
 );
 
 /// Overrides for some of the functionality above.
 @visibleForTesting
 class ImagePickerPluginTestOverrides {
   /// Override the creation of the input element.
-  OverrideCreateInputFunction createInputElement;
+  late OverrideCreateInputFunction createInputElement;
 
   /// Override the extraction of the selected file from an input element.
-  OverrideExtractFilesFromInputFunction getFileFromInput;
+  late OverrideExtractFilesFromInputFunction getFileFromInput;
 }
diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml
index b7e079b..c270cd5 100644
--- a/packages/image_picker/image_picker_for_web/pubspec.yaml
+++ b/packages/image_picker/image_picker_for_web/pubspec.yaml
@@ -1,10 +1,8 @@
 name: image_picker_for_web
 description: Web platform implementation of image_picker
 homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker_for_web
-# 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump
-# the version to 2.0.0.
-# See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0
-version: 0.1.0+3
+
+version: 2.0.0-nullsafety
 
 flutter:
   plugin:
@@ -14,19 +12,19 @@
         fileName: image_picker_for_web.dart
 
 dependencies:
-  image_picker_platform_interface: ^1.1.0
+  image_picker_platform_interface: ^2.0.0-nullsafety
   flutter:
     sdk: flutter
   flutter_web_plugins:
     sdk: flutter
-  meta: ^1.1.7
-  js: ^0.6.0
+  meta: ^1.3.0-nullsafety.6
+  js: ^0.6.3-nullsafety.3
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
-  pedantic: ^1.8.0
+  pedantic: ^1.10.0
 
 environment:
-  sdk: ">=2.5.0 <3.0.0"
+  sdk: ">=2.12.0-0 <3.0.0"
   flutter: ">=1.10.0"
diff --git a/packages/image_picker/image_picker_for_web/test/image_picker_for_web_test.dart b/packages/image_picker/image_picker_for_web/test/image_picker_for_web_test.dart
index 96d048d..fcc2c00 100644
--- a/packages/image_picker/image_picker_for_web/test/image_picker_for_web_test.dart
+++ b/packages/image_picker/image_picker_for_web/test/image_picker_for_web_test.dart
@@ -13,12 +13,12 @@
 import 'package:image_picker_platform_interface/image_picker_platform_interface.dart';
 
 final String expectedStringContents = "Hello, world!";
-final Uint8List bytes = utf8.encode(expectedStringContents);
+final Uint8List bytes = utf8.encode(expectedStringContents) as Uint8List;
 final html.File textFile = html.File([bytes], "hello.txt");
 
 void main() {
   // Under test...
-  ImagePickerPlugin plugin;
+  late ImagePickerPlugin plugin;
 
   setUp(() {
     plugin = ImagePickerPlugin();