diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 992c8b299345..382798f53f90 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 5aeb4e7c5e21..000000000000 --- 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 0f5ba76db6df..f3ad2375b8f2 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 @@ void main() { 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 MyApp extends StatelessWidget { } 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 @@ class _MyHomePageState extends State { List? _imageFileList; set _imageFile(XFile? value) { - _imageFileList = value == null ? null : [value]; + _imageFileList = value == null ? null : [value]; } dynamic _pickImageError; @@ -69,7 +69,7 @@ class _MyHomePageState extends State { // 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 @@ class _MyHomePageState extends State { } } - void _onImageButtonPressed(ImageSource source, + Future _onImageButtonPressed(ImageSource source, {BuildContext? context, bool isMultiImage = false}) async { if (_controller != null) { await _controller!.setVolume(0.0); @@ -91,7 +91,7 @@ class _MyHomePageState extends State { await _displayPickImageDialog(context!, (double? maxWidth, double? maxHeight, int? quality) async { try { - final pickedFileList = await _picker.pickMultiImage( + final List? pickedFileList = await _picker.pickMultiImage( maxWidth: maxWidth, maxHeight: maxHeight, imageQuality: quality, @@ -109,7 +109,7 @@ class _MyHomePageState extends State { 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 @@ class _MyHomePageState extends State { 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 @@ class _MyHomePageState extends State { 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: [ 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 @@ class _MyHomePageState extends State { 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 @@ class _MyHomePageState extends State { } } -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 e11da82d5da8..28b37197d8ff 100755 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -7,7 +7,6 @@ environment: flutter: ">=2.5.0" dependencies: - video_player: ^2.1.4 flutter: sdk: flutter flutter_plugin_android_lifecycle: ^2.0.1 @@ -18,6 +17,7 @@ dependencies: # 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 @@ dev_dependencies: 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 43143f1dbd57..1d280f16560b 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for selecting images from the Android and iOS image 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 @@ dev_dependencies: 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 f295e3d02f66..00049e14f808 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 @@ void main() { final List log = []; - final picker = ImagePicker(); + final ImagePicker picker = ImagePicker(); test('ImagePicker platform instance overrides the actual platform used', () { @@ -359,7 +359,7 @@ void main() { setUp(() { channel.setMockMethodCallHandler((MethodCall methodCall) async { log.add(methodCall); - return []; + return []; }); 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 10bc64082aca..b41fbe3381df 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 @@ void main() { final List log = []; - final picker = ImagePicker(); + final ImagePicker picker = ImagePicker(); test('ImagePicker platform instance overrides the actual platform used', () { @@ -321,7 +321,7 @@ void main() { return { 'type': 'image', 'path': '/example/path1', - 'pathList': ['/example/path0', '/example/path1'], + 'pathList': ['/example/path0', '/example/path1'], }; }); @@ -372,7 +372,7 @@ void main() { setUp(() { channel.setMockMethodCallHandler((MethodCall methodCall) async { log.add(methodCall); - return []; + return []; }); 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 78629a4d252d..dcf353fe19b1 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 5aeb4e7c5e21..000000000000 --- 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 c1025a9f07d3..9fe40da2557c 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_for_web/image_picker_for_web.dart'; 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 options = { +final Map options = { '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([bytes], 'hello.txt', options); +final html.File secondTextFile = + html.File([otherBytes], 'secondFile.txt'); void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -33,16 +34,17 @@ void main() { }); 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 = ((_) => [textFile]); - final plugin = ImagePickerPlugin(overrides: overrides); + final ImagePickerPlugin plugin = ImagePickerPlugin(overrides: overrides); // Init the pick file dialog... - final file = plugin.pickFile(); + final Future file = plugin.pickFile(); // Mock the browser behavior of selecting a file... mockInput.dispatchEvent(html.Event('change')); @@ -54,16 +56,17 @@ void main() { }); 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 = ((_) => [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 image = plugin.getImage(source: ImageSource.camera); // Mock the browser behavior of selecting a file... mockInput.dispatchEvent(html.Event('change')); @@ -85,16 +88,18 @@ void main() { }); 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 = + ((_) => [textFile, secondTextFile]); - final plugin = ImagePickerPlugin(overrides: overrides); + final ImagePickerPlugin plugin = ImagePickerPlugin(overrides: overrides); // Init the pick file dialog... - final files = plugin.getMultiImage(); + final Future> files = plugin.getMultiImage(); // Mock the browser behavior of selecting a file... mockInput.dispatchEvent(html.Event('change')); @@ -135,7 +140,7 @@ void main() { 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 @@ void main() { }); 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 @@ void main() { 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 @@ void main() { 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 067c7750eb11..91794a7d5e78 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:image_picker_platform_interface/image_picker_platform_interface. 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 @@ void main() { 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 _getImageSize(XFile file) async { - final completer = Completer(); - final image = html.ImageElement(src: file.path); - image.onLoad.listen((event) { + final Completer completer = Completer(); + 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 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([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 e1a38dcdcd46..341913a18490 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 MyApp extends StatefulWidget { class _MyAppState extends State { @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 306a857731e8..a9d6c7b9b5bd 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 @@ environment: 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 132087576c1d..88d439c5487f 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:flutter_web_plugins/flutter_web_plugins.dart'; 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { _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 @@ class ImagePickerPlugin extends ImagePickerPlatform { 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { int? imageQuality, CameraDevice preferredCameraDevice = CameraDevice.rear, }) async { - String? capture = computeCaptureAttribute(source, preferredCameraDevice); - List files = await getFiles( + final String? capture = + computeCaptureAttribute(source, preferredCameraDevice); + final List files = await getFiles( accept: _kAcceptImageMimeType, capture: capture, ); @@ -153,8 +156,9 @@ class ImagePickerPlugin extends ImagePickerPlatform { CameraDevice preferredCameraDevice = CameraDevice.rear, Duration? maxDuration, }) async { - String? capture = computeCaptureAttribute(source, preferredCameraDevice); - List files = await getFiles( + final String? capture = + computeCaptureAttribute(source, preferredCameraDevice); + final List files = await getFiles( accept: _kAcceptVideoMimeType, capture: capture, ); @@ -173,7 +177,7 @@ class ImagePickerPlugin extends ImagePickerPlatform { multiple: true, ); final Iterable> resized = images.map( - (image) => _imageResizer.resizeImageIfNeeded( + (XFile image) => _imageResizer.resizeImageIfNeeded( image, maxWidth, maxHeight, @@ -199,7 +203,7 @@ class ImagePickerPlugin extends ImagePickerPlatform { String? capture, bool multiple = false, }) { - html.FileUploadInputElement input = createInputElement( + final html.FileUploadInputElement input = createInputElement( accept, capture, multiple: multiple, @@ -232,24 +236,24 @@ class ImagePickerPlugin extends ImagePickerPlatform { /// Handles the OnChange event from a FileUploadInputElement object /// Returns a list of selected files. List? _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 and returns the selected file. Future _getSelectedFile(html.FileUploadInputElement input) { final Completer _completer = Completer(); // 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? 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { Future> _getSelectedXFiles(html.FileUploadInputElement input) { final Completer> _completer = Completer>(); // 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? 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { }).toList()); } }); - input.onError.first.then((event) { + input.onError.first.then((html.Event event) { if (!_completer.isCompleted) { _completer.completeError(event); } @@ -293,7 +297,7 @@ class ImagePickerPlugin extends ImagePickerPlatform { /// 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 @@ class ImagePickerPlugin extends ImagePickerPlatform { 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 6ee7c5f015e2..e063099e3319 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 @@ class ImageResizer { Future 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 @@ class ImageResizer { /// function that loads the blobUrl into an imageElement Future loadImage(String blobUrl) { - final imageLoadCompleter = Completer(); - final imageElement = html.ImageElement(); + final Completer imageLoadCompleter = + Completer(); + 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 @@ class ImageResizer { /// 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 @@ class ImageResizer { /// [imageQuality] is only supported for jpeg and webp images. Future 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 6ef789254b3f..e906a88f00fe 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 @@ bool imageResizeNeeded(double? maxWidth, double? maxHeight, int? imageQuality) { /// 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 @@ bool isImageQualityValid(int imageQuality) { /// 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 285656ac9e4f..deccd2b50a1f 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 @@ name: image_picker_for_web 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 @@ dependencies: 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 352d2bea48a5..0bfa81729bf0 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 @@ import 'package:image_picker_for_web/src/image_resizer_utils.dart'; 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 @@ void main() { 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 @@ void main() { 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 493b6e69a54c..7bf18bf36791 100644 --- a/script/configs/custom_analysis.yaml +++ b/script/configs/custom_analysis.yaml @@ -19,8 +19,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