[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();