[camera_platform_interface] Fix asynchronous exceptions handling of the `initializeCamera` method (#4660)
diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md
index 35a39e1..6ed662b 100644
--- a/packages/camera/camera_platform_interface/CHANGELOG.md
+++ b/packages/camera/camera_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.1.5
+
+* Fixes asynchronous exceptions handling of the `initializeCamera` method.
+
## 2.1.4
* Removes dependency on `meta`.
diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
index ab66769..ec84c20 100644
--- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
+++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart
@@ -126,6 +126,16 @@
'cameraId': cameraId,
'imageFormatGroup': imageFormatGroup.name(),
},
+ ).catchError(
+ (Object error, StackTrace stackTrace) {
+ if (error is! PlatformException) {
+ throw error;
+ }
+ _completer.completeError(
+ CameraException(error.code, error.message),
+ stackTrace,
+ );
+ },
);
return _completer.future;
diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml
index bd6aa5a..b28008d 100644
--- a/packages/camera/camera_platform_interface/pubspec.yaml
+++ b/packages/camera/camera_platform_interface/pubspec.yaml
@@ -4,7 +4,7 @@
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
# NOTE: We strongly prefer non-breaking changes, even at the expense of a
# less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 2.1.4
+version: 2.1.5
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
index 012b190..27fe7c6 100644
--- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
+++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart
@@ -126,6 +126,38 @@
);
});
+ test(
+ 'Should throw CameraException when initialize throws a PlatformException',
+ () {
+ // Arrange
+ MethodChannelMock(
+ channelName: 'plugins.flutter.io/camera',
+ methods: <String, dynamic>{
+ 'initialize': PlatformException(
+ code: 'TESTING_ERROR_CODE',
+ message: 'Mock error message used during testing.',
+ )
+ },
+ );
+ final MethodChannelCamera camera = MethodChannelCamera();
+
+ // Act
+ expect(
+ () => camera.initializeCamera(0),
+ throwsA(
+ isA<CameraException>()
+ .having((CameraException e) => e.code, 'code',
+ 'TESTING_ERROR_CODE')
+ .having(
+ (CameraException e) => e.description,
+ 'description',
+ 'Mock error message used during testing.',
+ ),
+ ),
+ );
+ },
+ );
+
test('Should send initialization data', () async {
// Arrange
final MethodChannelMock cameraMockChannel = MethodChannelMock(