[image_picker] Update app-facing and web analysis options (#4838)
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