From 515a3b68e88422726b10311dafbe9328535d5aad Mon Sep 17 00:00:00 2001 From: Mike Date: Wed, 29 Nov 2023 17:15:54 -0800 Subject: [PATCH 1/6] [image_picker] Adopt code excerpts in README --- .../image_picker_for_web/CHANGELOG.md | 3 +- .../image_picker_for_web/README.md | 12 ++-- .../example/assets/flutter-mark-square-64.png | Bin 0 -> 482 bytes .../example/lib/readme_excerpts.dart | 35 +++++++++++ .../example/test/readme_excerpts_test.dart | 59 ++++++++++++++++++ .../image_picker_for_web/pubspec.yaml | 2 +- script/configs/temp_exclude_excerpt.yaml | 1 - 7 files changed, 102 insertions(+), 10 deletions(-) create mode 100644 packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png create mode 100644 packages/image_picker/image_picker_for_web/example/lib/readme_excerpts.dart create mode 100644 packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md index 6b01e90c0e0..936924d949a 100644 --- a/packages/image_picker/image_picker_for_web/CHANGELOG.md +++ b/packages/image_picker/image_picker_for_web/CHANGELOG.md @@ -1,6 +1,7 @@ -## NEXT +## 3.0.2 * Updates minimum supported SDK version to Flutter 3.10/Dart 3.0. +* Improves README example and updates it to use code excerpts. ## 3.0.1 diff --git a/packages/image_picker/image_picker_for_web/README.md b/packages/image_picker/image_picker_for_web/README.md index 6583105ea37..9e581d550dd 100644 --- a/packages/image_picker/image_picker_for_web/README.md +++ b/packages/image_picker/image_picker_for_web/README.md @@ -76,22 +76,20 @@ The instance will also let you retrieve the bytes of the selected file across al If you want to use the path directly, your code would need look like this: + ```dart -... if (kIsWeb) { - Image.network(pickedFile.path); + image = Image.network(pickedFile.path); } else { - Image.file(File(pickedFile.path)); + image = Image.file(File(pickedFile.path)); } -... ``` Or, using bytes: + ```dart -... -Image.memory(await pickedFile.readAsBytes()) -... +image = Image.memory(await pickedFile.readAsBytes()); ``` [1]: https://pub.dev/packages/image_picker diff --git a/packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png b/packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png new file mode 100644 index 0000000000000000000000000000000000000000..56f22d5bd8f4a90724fcd9aca3a0ec85932c4a48 GIT binary patch literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU|i|x;uuoF`1Z2ugcwJGV;|p6 z=ni)jO-nO7y=V2ICr!s!^v(QOS^8?m8P&kV5BJt^?KqcXA$#u8o}as3UH)A6f7SB? zPp>{KSXli&>dLdr8;Y$S>6-c-)_L&xQvu z98wQbTSPu6HMxNV_H-=ZjEmz!=r$12SI%gi&KPyYV(MDis-vgRf9-qmWSZcb|Ht_E zJxN{YwyZ!uxa5G5)}dSf()Z{DoECW%_~Ty+L$T7Dmz76O-?{43ShmdL{&fa5mx#On z8m7DPd9a%G+A=}A2j$0S`b{@ry`_5YpWrmt zS-M=`IVU6vPLls`%O)tm2ttrBt*_x}KfIUy@9U-0TlteyfpN#+>FVdQ&MBb@01H0d A0ssI2 literal 0 HcmV?d00001 diff --git a/packages/image_picker/image_picker_for_web/example/lib/readme_excerpts.dart b/packages/image_picker/image_picker_for_web/example/lib/readme_excerpts.dart new file mode 100644 index 00000000000..4ad3100e97e --- /dev/null +++ b/packages/image_picker/image_picker_for_web/example/lib/readme_excerpts.dart @@ -0,0 +1,35 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; + +/// Demonstrates creating an Image widget from an XFile's path. +Image getImageFromPath(XFile pickedFile) { + final Image image; + +// #docregion ImageFromPath + if (kIsWeb) { + image = Image.network(pickedFile.path); + } else { + image = Image.file(File(pickedFile.path)); + } +// #enddocregion ImageFromPath + + return image; +} + +/// Demonstrates creating an Image widget from an XFile's bytes. +Future getImageFromBytes(XFile pickedFile) async { + final Image image; + +// #docregion ImageFromBytes + image = Image.memory(await pickedFile.readAsBytes()); +// #enddocregion ImageFromBytes + + return image; +} diff --git a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart new file mode 100644 index 00000000000..871a2711120 --- /dev/null +++ b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart @@ -0,0 +1,59 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:image_picker_for_web_integration_tests/readme_excerpts.dart'; +import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; + +void main() { + testWidgets('getImageFromPath loads image from XFile path', + (WidgetTester tester) async { + // Create an XFile using the test image path. + final XFile pickedFile = XFile('assets/flutter-mark-square-64.png'); + + // Use the excerpt code to get an Image from the XFile path. + final Image image = getImageFromPath(pickedFile); + + // Create a simple widget with the Image. + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: image, + ), + )); + + // Check if Image widget is present. + expect(find.byType(Image), findsOneWidget); + }); + + testWidgets('getImageFromPath loads image from XFile bytes', + (WidgetTester tester) async { + // Encode a small Base64 image (1x1 pixel transparent PNG). + const String base64Image = + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAYUBjVgJBK4AAAAASUVORK5CYII='; + + // Decode the Base64 string to bytes. + final Uint8List bytes = base64Decode(base64Image); + + // Create an XFile from the byte data. + final XFile pickedFile = XFile.fromData(bytes); + + // Use the excerpt code to get an Image from the XFile byte data. + final Image image = await getImageFromBytes(pickedFile); + + // Create a simple widget with the Image. + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: image, + ), + )); + + // Check if Image widget is present. + expect(find.byType(Image), findsOneWidget); + }); +} diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml index 4a1c4ea861e..65c8196de80 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/packages/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: 3.0.1 +version: 3.0.2 environment: sdk: ">=3.0.0 <4.0.0" diff --git a/script/configs/temp_exclude_excerpt.yaml b/script/configs/temp_exclude_excerpt.yaml index c1fe3e9aa86..b1921e51634 100644 --- a/script/configs/temp_exclude_excerpt.yaml +++ b/script/configs/temp_exclude_excerpt.yaml @@ -11,7 +11,6 @@ - flutter_image - go_router_builder - google_sign_in/google_sign_in -- image_picker_for_web - in_app_purchase/in_app_purchase - ios_platform_images - multicast_dns From 4dec5ee179afde1a286a1d8f99a8854fd7fa09d5 Mon Sep 17 00:00:00 2001 From: Mike Date: Wed, 29 Nov 2023 17:22:50 -0800 Subject: [PATCH 2/6] fix test name --- .../image_picker_for_web/example/test/readme_excerpts_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart index 871a2711120..3e0a7083daa 100644 --- a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart +++ b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart @@ -31,7 +31,7 @@ void main() { expect(find.byType(Image), findsOneWidget); }); - testWidgets('getImageFromPath loads image from XFile bytes', + testWidgets('getImageFromBytes loads image from XFile bytes', (WidgetTester tester) async { // Encode a small Base64 image (1x1 pixel transparent PNG). const String base64Image = From da1bafde6e4221a165fb4effd29f35440897db14 Mon Sep 17 00:00:00 2001 From: Mike Date: Tue, 9 Jan 2024 11:57:20 -0800 Subject: [PATCH 3/6] Create blob instead of loading assets on web --- .../example/assets/flutter-mark-square-64.png | Bin 482 -> 0 bytes .../example/test/readme_excerpts_test.dart | 25 ++++++++---------- 2 files changed, 11 insertions(+), 14 deletions(-) delete mode 100644 packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png diff --git a/packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png b/packages/image_picker/image_picker_for_web/example/assets/flutter-mark-square-64.png deleted file mode 100644 index 56f22d5bd8f4a90724fcd9aca3a0ec85932c4a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU|i|x;uuoF`1Z2ugcwJGV;|p6 z=ni)jO-nO7y=V2ICr!s!^v(QOS^8?m8P&kV5BJt^?KqcXA$#u8o}as3UH)A6f7SB? zPp>{KSXli&>dLdr8;Y$S>6-c-)_L&xQvu z98wQbTSPu6HMxNV_H-=ZjEmz!=r$12SI%gi&KPyYV(MDis-vgRf9-qmWSZcb|Ht_E zJxN{YwyZ!uxa5G5)}dSf()Z{DoECW%_~Ty+L$T7Dmz76O-?{43ShmdL{&fa5mx#On z8m7DPd9a%G+A=}A2j$0S`b{@ry`_5YpWrmt zS-M=`IVU6vPLls`%O)tm2ttrBt*_x}KfIUy@9U-0TlteyfpN#+>FVdQ&MBb@01H0d A0ssI2 diff --git a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart index 3e0a7083daa..72911358e83 100644 --- a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart +++ b/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/material.dart'; @@ -14,11 +13,10 @@ import 'package:image_picker_platform_interface/image_picker_platform_interface. void main() { testWidgets('getImageFromPath loads image from XFile path', (WidgetTester tester) async { - // Create an XFile using the test image path. - final XFile pickedFile = XFile('assets/flutter-mark-square-64.png'); + final XFile file = createXFileWeb(); // Use the excerpt code to get an Image from the XFile path. - final Image image = getImageFromPath(pickedFile); + final Image image = getImageFromPath(file); // Create a simple widget with the Image. await tester.pumpWidget(MaterialApp( @@ -33,18 +31,10 @@ void main() { testWidgets('getImageFromBytes loads image from XFile bytes', (WidgetTester tester) async { - // Encode a small Base64 image (1x1 pixel transparent PNG). - const String base64Image = - 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/wcAAYUBjVgJBK4AAAAASUVORK5CYII='; - - // Decode the Base64 string to bytes. - final Uint8List bytes = base64Decode(base64Image); - - // Create an XFile from the byte data. - final XFile pickedFile = XFile.fromData(bytes); + final XFile file = createXFileWeb(); // Use the excerpt code to get an Image from the XFile byte data. - final Image image = await getImageFromBytes(pickedFile); + final Image image = await getImageFromBytes(file); // Create a simple widget with the Image. await tester.pumpWidget(MaterialApp( @@ -57,3 +47,10 @@ void main() { expect(find.byType(Image), findsOneWidget); }); } + +XFile createXFileWeb() { + const String content = '1001'; + final Uint8List data = Uint8List.fromList(content.codeUnits); + return XFile.fromData(data, + name: 'identity.png', lastModified: DateTime.now()); +} From d2b1bcf9153bd7088bb1852843c8d386f3f06415 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 12 Apr 2024 16:34:02 -0700 Subject: [PATCH 4/6] Move test file to integration_test. --- .../example/{test => integration_test}/readme_excerpts_test.dart | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/image_picker/image_picker_for_web/example/{test => integration_test}/readme_excerpts_test.dart (100%) diff --git a/packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart b/packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart similarity index 100% rename from packages/image_picker/image_picker_for_web/example/test/readme_excerpts_test.dart rename to packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart From bb23141322098c510c50c3847846d3f22513c40d Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 12 Apr 2024 16:49:57 -0700 Subject: [PATCH 5/6] Tweak integration test. --- .../readme_excerpts_test.dart | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart b/packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart index 72911358e83..65c1081dfb8 100644 --- a/packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart +++ b/packages/image_picker/image_picker_for_web/example/integration_test/readme_excerpts_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/material.dart'; @@ -9,8 +10,11 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:image_picker_for_web_integration_tests/readme_excerpts.dart'; import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; +import 'package:integration_test/integration_test.dart'; void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + testWidgets('getImageFromPath loads image from XFile path', (WidgetTester tester) async { final XFile file = createXFileWeb(); @@ -18,12 +22,7 @@ void main() { // Use the excerpt code to get an Image from the XFile path. final Image image = getImageFromPath(file); - // Create a simple widget with the Image. - await tester.pumpWidget(MaterialApp( - home: Scaffold( - body: image, - ), - )); + await pumpImage(tester, image); // Check if Image widget is present. expect(find.byType(Image), findsOneWidget); @@ -36,21 +35,31 @@ void main() { // Use the excerpt code to get an Image from the XFile byte data. final Image image = await getImageFromBytes(file); - // Create a simple widget with the Image. - await tester.pumpWidget(MaterialApp( - home: Scaffold( - body: image, - ), - )); + await pumpImage(tester, image); // Check if Image widget is present. expect(find.byType(Image), findsOneWidget); }); } +/// Creates an XFile with a 1x1 png file. XFile createXFileWeb() { - const String content = '1001'; - final Uint8List data = Uint8List.fromList(content.codeUnits); - return XFile.fromData(data, - name: 'identity.png', lastModified: DateTime.now()); + const String pixel = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR' + '42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII='; + final Uint8List data = base64Decode(pixel); + return XFile.fromData( + data, + name: 'identity.png', + mimeType: 'image/png', + lastModified: DateTime.now(), + ); +} + +/// Pumps an [image] widget into a [tester]. +Future pumpImage(WidgetTester tester, Image image) async { + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: image, + ), + )); } From 2c0e85e249b2f3f54cf5f8c20974ff63f53ab354 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 15 Apr 2024 10:59:42 -0400 Subject: [PATCH 6/6] Fix config merge --- script/configs/temp_exclude_excerpt.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/script/configs/temp_exclude_excerpt.yaml b/script/configs/temp_exclude_excerpt.yaml index 514b59c45b3..dbaa5d71535 100644 --- a/script/configs/temp_exclude_excerpt.yaml +++ b/script/configs/temp_exclude_excerpt.yaml @@ -7,8 +7,6 @@ # https://github.com/flutter/flutter/issues/102679 - espresso - go_router_builder -- google_sign_in/google_sign_in -- image_picker_for_web - in_app_purchase/in_app_purchase - palette_generator - pointer_interceptor