[image_picker] Fix use_build_context_synchronously violations (#3969)
- Fixes a violation of `use_build_context_synchronously` that was
previously undected, which will soon be detected, unblocking future
rolls.
- Reduces unnecessary drift between different versions of the example,
some of which unnecessarily had context be nullable, or passed it
slightly differently.
- Fixes newly-found `use_build_context_synchronously` violations from
making `BuildContext` non-nullable; apparently the lint rule doesn't
work for nullable contexts yet.
diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md
index 117f6af..f1e09f5 100644
--- a/packages/image_picker/image_picker/CHANGELOG.md
+++ b/packages/image_picker/image_picker/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.8.7+5
+
+* Fixes `BuildContext` handling in example.
+
## 0.8.7+4
* Updates README to mention usage of `launchMode: singleInstance` for Android.
diff --git a/packages/image_picker/image_picker/example/lib/main.dart b/packages/image_picker/image_picker/example/lib/main.dart
index 247c0a9..4a96ce1 100755
--- a/packages/image_picker/image_picker/example/lib/main.dart
+++ b/packages/image_picker/image_picker/example/lib/main.dart
@@ -81,51 +81,53 @@
}
Future<void> _onImageButtonPressed(ImageSource source,
- {BuildContext? context, bool isMultiImage = false}) async {
+ {required BuildContext context, bool isMultiImage = false}) async {
if (_controller != null) {
await _controller!.setVolume(0.0);
}
- if (isVideo) {
- final XFile? file = await _picker.pickVideo(
- source: source, maxDuration: const Duration(seconds: 10));
- await _playVideo(file);
- } else if (isMultiImage) {
- await _displayPickImageDialog(context!,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final List<XFile> pickedFileList = await _picker.pickMultiImage(
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: quality,
- );
- setState(() {
- _imageFileList = pickedFileList;
- });
- } catch (e) {
- setState(() {
- _pickImageError = e;
- });
- }
- });
- } else {
- await _displayPickImageDialog(context!,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final XFile? pickedFile = await _picker.pickImage(
- source: source,
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: quality,
- );
- setState(() {
- _setImageFileListFromFile(pickedFile);
- });
- } catch (e) {
- setState(() {
- _pickImageError = e;
- });
- }
- });
+ if (context.mounted) {
+ if (isVideo) {
+ final XFile? file = await _picker.pickVideo(
+ source: source, maxDuration: const Duration(seconds: 10));
+ await _playVideo(file);
+ } else if (isMultiImage) {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final List<XFile> pickedFileList = await _picker.pickMultiImage(
+ maxWidth: maxWidth,
+ maxHeight: maxHeight,
+ imageQuality: quality,
+ );
+ setState(() {
+ _imageFileList = pickedFileList;
+ });
+ } catch (e) {
+ setState(() {
+ _pickImageError = e;
+ });
+ }
+ });
+ } else {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final XFile? pickedFile = await _picker.pickImage(
+ source: source,
+ maxWidth: maxWidth,
+ maxHeight: maxHeight,
+ imageQuality: quality,
+ );
+ setState(() {
+ _setImageFileListFromFile(pickedFile);
+ });
+ } catch (e) {
+ setState(() {
+ _pickImageError = e;
+ });
+ }
+ });
+ }
}
}
@@ -332,7 +334,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(ImageSource.gallery);
+ _onImageButtonPressed(ImageSource.gallery, context: context);
},
heroTag: 'video0',
tooltip: 'Pick Video from gallery',
@@ -345,7 +347,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(ImageSource.camera);
+ _onImageButtonPressed(ImageSource.camera, context: context);
},
heroTag: 'video1',
tooltip: 'Take a Video',
diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml
index c1bb222..530cf5a 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/packages/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.7+4
+version: 0.8.7+5
environment:
sdk: ">=2.18.0 <4.0.0"
diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md
index 08b8150..654a05f 100644
--- a/packages/image_picker/image_picker_android/CHANGELOG.md
+++ b/packages/image_picker/image_picker_android/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.8.6+13
+
+* Fixes `BuildContext` handling in example.
+
## 0.8.6+12
* Improves image resizing performance by decoding Bitmap only when needed.
diff --git a/packages/image_picker/image_picker_android/example/lib/main.dart b/packages/image_picker/image_picker_android/example/lib/main.dart
index c456fb9..fa87587 100755
--- a/packages/image_picker/image_picker_android/example/lib/main.dart
+++ b/packages/image_picker/image_picker_android/example/lib/main.dart
@@ -98,55 +98,57 @@
}
Future<void> _onImageButtonPressed(
- BuildContext context, {
- required ImageSource source,
+ ImageSource source, {
+ required BuildContext context,
bool isMultiImage = false,
}) async {
if (_controller != null) {
await _controller!.setVolume(0.0);
}
- if (isVideo) {
- final XFile? file = await _picker.getVideo(
- source: source, maxDuration: const Duration(seconds: 10));
- if (file != null && context.mounted) {
- _showPickedSnackBar(context, <XFile>[file]);
+ if (context.mounted) {
+ if (isVideo) {
+ final XFile? file = await _picker.getVideo(
+ source: source, maxDuration: const Duration(seconds: 10));
+ if (file != null && context.mounted) {
+ _showPickedSnackBar(context, <XFile>[file]);
+ }
+ await _playVideo(file);
+ } else if (isMultiImage) {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final List<XFile>? pickedFileList = await _picker.getMultiImage(
+ maxWidth: maxWidth,
+ maxHeight: maxHeight,
+ imageQuality: quality,
+ );
+ if (pickedFileList != null && context.mounted) {
+ _showPickedSnackBar(context, pickedFileList);
+ }
+ setState(() => _imageFileList = pickedFileList);
+ } catch (e) {
+ setState(() => _pickImageError = e);
+ }
+ });
+ } else {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final XFile? pickedFile = await _picker.getImage(
+ source: source,
+ maxWidth: maxWidth,
+ maxHeight: maxHeight,
+ imageQuality: quality,
+ );
+ if (pickedFile != null && context.mounted) {
+ _showPickedSnackBar(context, <XFile>[pickedFile]);
+ }
+ setState(() => _setImageFileListFromFile(pickedFile));
+ } catch (e) {
+ setState(() => _pickImageError = e);
+ }
+ });
}
- await _playVideo(file);
- } else if (isMultiImage && context.mounted) {
- await _displayPickImageDialog(context,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final List<XFile>? pickedFileList = await _picker.getMultiImage(
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: quality,
- );
- if (pickedFileList != null && context.mounted) {
- _showPickedSnackBar(context, pickedFileList);
- }
- setState(() => _imageFileList = pickedFileList);
- } catch (e) {
- setState(() => _pickImageError = e);
- }
- });
- } else {
- await _displayPickImageDialog(context,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final XFile? pickedFile = await _picker.getImage(
- source: source,
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: quality,
- );
- if (pickedFile != null && context.mounted) {
- _showPickedSnackBar(context, <XFile>[pickedFile]);
- }
- setState(() => _setImageFileListFromFile(pickedFile));
- } catch (e) {
- setState(() => _pickImageError = e);
- }
- });
}
}
@@ -315,7 +317,7 @@
key: const Key('image_picker_example_from_gallery'),
onPressed: () {
isVideo = false;
- _onImageButtonPressed(context, source: ImageSource.gallery);
+ _onImageButtonPressed(ImageSource.gallery, context: context);
},
heroTag: 'image0',
tooltip: 'Pick Image from gallery',
@@ -328,8 +330,8 @@
onPressed: () {
isVideo = false;
_onImageButtonPressed(
- context,
- source: ImageSource.gallery,
+ ImageSource.gallery,
+ context: context,
isMultiImage: true,
);
},
@@ -343,7 +345,7 @@
child: FloatingActionButton(
onPressed: () {
isVideo = false;
- _onImageButtonPressed(context, source: ImageSource.camera);
+ _onImageButtonPressed(ImageSource.camera, context: context);
},
heroTag: 'image2',
tooltip: 'Take a Photo',
@@ -356,7 +358,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(context, source: ImageSource.gallery);
+ _onImageButtonPressed(ImageSource.gallery, context: context);
},
heroTag: 'video0',
tooltip: 'Pick Video from gallery',
@@ -369,7 +371,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(context, source: ImageSource.camera);
+ _onImageButtonPressed(ImageSource.camera, context: context);
},
heroTag: 'video1',
tooltip: 'Take a Video',
diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml
index c3e47b9..da3f364 100755
--- a/packages/image_picker/image_picker_android/pubspec.yaml
+++ b/packages/image_picker/image_picker_android/pubspec.yaml
@@ -3,7 +3,7 @@
repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
-version: 0.8.6+12
+version: 0.8.6+13
environment:
sdk: ">=2.18.0 <4.0.0"
diff --git a/packages/image_picker/image_picker_ios/CHANGELOG.md b/packages/image_picker/image_picker_ios/CHANGELOG.md
index c03b646..1173ddf 100644
--- a/packages/image_picker/image_picker_ios/CHANGELOG.md
+++ b/packages/image_picker/image_picker_ios/CHANGELOG.md
@@ -1,4 +1,5 @@
-## NEXT
+## 0.8.7+4
+* Fixes `BuildContext` handling in example.
* Updates metadata unit test to work on iOS 16.2.
## 0.8.7+3
diff --git a/packages/image_picker/image_picker_ios/example/lib/main.dart b/packages/image_picker/image_picker_ios/example/lib/main.dart
index 7f8956a..76076a5 100755
--- a/packages/image_picker/image_picker_ios/example/lib/main.dart
+++ b/packages/image_picker/image_picker_ios/example/lib/main.dart
@@ -81,58 +81,60 @@
}
Future<void> _onImageButtonPressed(ImageSource source,
- {BuildContext? context, bool isMultiImage = false}) async {
+ {required BuildContext context, bool isMultiImage = false}) async {
if (_controller != null) {
await _controller!.setVolume(0.0);
}
- if (isVideo) {
- final XFile? file = await _picker.getVideo(
- source: source, maxDuration: const Duration(seconds: 10));
- await _playVideo(file);
- } else if (isMultiImage) {
- await _displayPickImageDialog(context!,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final List<XFile> pickedFileList =
- await _picker.getMultiImageWithOptions(
- options: MultiImagePickerOptions(
- imageOptions: ImageOptions(
+ if (context.mounted) {
+ if (isVideo) {
+ final XFile? file = await _picker.getVideo(
+ source: source, maxDuration: const Duration(seconds: 10));
+ await _playVideo(file);
+ } else if (isMultiImage) {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final List<XFile> pickedFileList =
+ await _picker.getMultiImageWithOptions(
+ options: MultiImagePickerOptions(
+ imageOptions: ImageOptions(
+ maxWidth: maxWidth,
+ maxHeight: maxHeight,
+ imageQuality: quality,
+ ),
+ ),
+ );
+ setState(() {
+ _imageFileList = pickedFileList;
+ });
+ } catch (e) {
+ setState(() {
+ _pickImageError = e;
+ });
+ }
+ });
+ } else {
+ await _displayPickImageDialog(context,
+ (double? maxWidth, double? maxHeight, int? quality) async {
+ try {
+ final XFile? pickedFile = await _picker.getImageFromSource(
+ source: source,
+ options: ImagePickerOptions(
maxWidth: maxWidth,
maxHeight: maxHeight,
imageQuality: quality,
),
- ),
- );
- setState(() {
- _imageFileList = pickedFileList;
- });
- } catch (e) {
- setState(() {
- _pickImageError = e;
- });
- }
- });
- } else {
- await _displayPickImageDialog(context!,
- (double? maxWidth, double? maxHeight, int? quality) async {
- try {
- final XFile? pickedFile = await _picker.getImageFromSource(
- source: source,
- options: ImagePickerOptions(
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: quality,
- ),
- );
- setState(() {
- _setImageFileListFromFile(pickedFile);
- });
- } catch (e) {
- setState(() {
- _pickImageError = e;
- });
- }
- });
+ );
+ setState(() {
+ _setImageFileListFromFile(pickedFile);
+ });
+ } catch (e) {
+ setState(() {
+ _pickImageError = e;
+ });
+ }
+ });
+ }
}
}
@@ -281,7 +283,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(ImageSource.gallery);
+ _onImageButtonPressed(ImageSource.gallery, context: context);
},
heroTag: 'video0',
tooltip: 'Pick Video from gallery',
@@ -294,7 +296,7 @@
backgroundColor: Colors.red,
onPressed: () {
isVideo = true;
- _onImageButtonPressed(ImageSource.camera);
+ _onImageButtonPressed(ImageSource.camera, context: context);
},
heroTag: 'video1',
tooltip: 'Take a Video',
diff --git a/packages/image_picker/image_picker_ios/pubspec.yaml b/packages/image_picker/image_picker_ios/pubspec.yaml
index 8665e93..99c94fa 100755
--- a/packages/image_picker/image_picker_ios/pubspec.yaml
+++ b/packages/image_picker/image_picker_ios/pubspec.yaml
@@ -2,7 +2,7 @@
description: iOS implementation of the image_picker plugin.
repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_ios
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22
-version: 0.8.7+3
+version: 0.8.7+4
environment:
sdk: ">=2.18.0 <4.0.0"