Skip to content

Commit 108796a

Browse files
committed
🥅 Throw or rethrow exceptions that used to be caught
Fix #41
1 parent 06ba936 commit 108796a

File tree

2 files changed

+82
-108
lines changed

2 files changed

+82
-108
lines changed

lib/src/widget/camera_picker.dart

Lines changed: 44 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,11 @@ class CameraPicker extends StatefulWidget {
143143
ImageFormatGroup imageFormatGroup = ImageFormatGroup.unknown,
144144
Widget Function(CameraValue)? foregroundBuilder,
145145
EntitySaveCallback? onEntitySaving,
146-
}) async {
146+
}) {
147147
if (enableRecording != true && onlyEnableRecording == true) {
148148
throw ArgumentError('Recording mode error.');
149149
}
150-
final AssetEntity? result = await Navigator.of(
151-
context,
152-
rootNavigator: true,
153-
).push<AssetEntity>(
150+
return Navigator.of(context, rootNavigator: true).push<AssetEntity>(
154151
SlidePageTransitionBuilder<AssetEntity>(
155152
builder: CameraPicker(
156153
enableRecording: enableRecording,
@@ -174,7 +171,6 @@ class CameraPicker extends StatefulWidget {
174171
transitionDuration: _kRouteDuration,
175172
),
176173
);
177-
return result;
178174
}
179175

180176
/// Build a dark theme according to the theme color.
@@ -387,12 +383,7 @@ class CameraPickerState extends State<CameraPicker>
387383

388384
Future<void>.delayed(_kRouteDuration, () {
389385
if (mounted) {
390-
try {
391-
initCameras();
392-
} catch (e) {
393-
realDebugPrint('Error when initializing: $e');
394-
Navigator.of(context).pop();
395-
}
386+
initCameras();
396387
}
397388
});
398389
}
@@ -511,8 +502,10 @@ class CameraPickerState extends State<CameraPicker>
511502
// After cameras fetched, judge again with the list is empty or not to
512503
// ensure there is at least an available camera for use.
513504
if (cameraDescription == null && (cameras.isEmpty)) {
514-
realDebugPrint('No cameras found.');
515-
return;
505+
throw CameraException(
506+
'No CameraDescription found.',
507+
'No cameras are available in the controller.',
508+
);
516509
}
517510

518511
// Initialize the controller with the given resolution preset.
@@ -523,7 +516,10 @@ class CameraPickerState extends State<CameraPicker>
523516
imageFormatGroup: widget.imageFormatGroup,
524517
)..addListener(() {
525518
if (controller.value.hasError) {
526-
realDebugPrint('Camera error ${controller.value.errorDescription}');
519+
throw CameraException(
520+
'CameraController exception',
521+
controller.value.errorDescription,
522+
);
527523
}
528524
});
529525

@@ -539,8 +535,8 @@ class CameraPickerState extends State<CameraPicker>
539535
(() async =>
540536
_minAvailableZoom = await controller.getMinZoomLevel())(),
541537
]);
542-
} on CameraException catch (e) {
543-
realDebugPrint('CameraException: $e');
538+
} catch (_) {
539+
rethrow;
544540
} finally {
545541
safeSetState(() {});
546542
}
@@ -564,21 +560,17 @@ class CameraPickerState extends State<CameraPicker>
564560
/// The method to switch between flash modes.
565561
/// 切换闪光灯模式的方法
566562
Future<void> switchFlashesMode() async {
567-
try {
568-
switch (controller.value.flashMode) {
569-
case FlashMode.off:
570-
await controller.setFlashMode(FlashMode.auto);
571-
break;
572-
case FlashMode.auto:
573-
await controller.setFlashMode(FlashMode.always);
574-
break;
575-
case FlashMode.always:
576-
case FlashMode.torch:
577-
await controller.setFlashMode(FlashMode.off);
578-
break;
579-
}
580-
} catch (e) {
581-
realDebugPrint('Error when switch flash mode: $e');
563+
switch (controller.value.flashMode) {
564+
case FlashMode.off:
565+
await controller.setFlashMode(FlashMode.auto);
566+
break;
567+
case FlashMode.auto:
568+
await controller.setFlashMode(FlashMode.always);
569+
break;
570+
case FlashMode.always:
571+
case FlashMode.torch:
572+
await controller.setFlashMode(FlashMode.off);
573+
break;
582574
}
583575
}
584576

@@ -731,23 +723,19 @@ class CameraPickerState extends State<CameraPicker>
731723
/// 仅当初始化成功且相机未在拍照时拍照。
732724
Future<void> takePicture() async {
733725
if (controller.value.isInitialized && !controller.value.isTakingPicture) {
734-
try {
735-
final AssetEntity? entity = await CameraPickerViewer.pushToViewer(
736-
context,
737-
pickerState: this,
738-
pickerType: CameraPickerViewType.image,
739-
previewXFile: await controller.takePicture(),
740-
theme: theme,
741-
shouldDeletePreviewFile: shouldDeletePreviewFile,
742-
onEntitySaving: widget.onEntitySaving,
743-
);
744-
if (entity != null) {
745-
Navigator.of(context).pop(entity);
746-
} else {
747-
safeSetState(() {});
748-
}
749-
} catch (e) {
750-
realDebugPrint('Error when taking pictures: $e');
726+
final AssetEntity? entity = await CameraPickerViewer.pushToViewer(
727+
context,
728+
pickerState: this,
729+
pickerType: CameraPickerViewType.image,
730+
previewXFile: await controller.takePicture(),
731+
theme: theme,
732+
shouldDeletePreviewFile: shouldDeletePreviewFile,
733+
onEntitySaving: widget.onEntitySaving,
734+
);
735+
if (entity != null) {
736+
Navigator.of(context).pop(entity);
737+
} else {
738+
safeSetState(() {});
751739
}
752740
}
753741
}
@@ -798,13 +786,15 @@ class CameraPickerState extends State<CameraPicker>
798786
stopRecordingVideo();
799787
});
800788
}
801-
}).catchError((dynamic e) {
802-
realDebugPrint('Error when recording video: $e');
789+
}).catchError((Object e) {
790+
realDebugPrint('Error when start recording video: $e');
803791
if (controller.value.isRecordingVideo) {
804-
controller.stopVideoRecording().catchError((dynamic e) {
792+
controller.stopVideoRecording().catchError((Object e) {
805793
realDebugPrint('Error when stop recording video: $e');
794+
throw e;
806795
});
807796
}
797+
throw e;
808798
});
809799
}
810800
}
@@ -827,8 +817,9 @@ class CameraPickerState extends State<CameraPicker>
827817
} else {
828818
safeSetState(() {});
829819
}
830-
}).catchError((dynamic e) {
820+
}).catchError((Object e) {
831821
realDebugPrint('Error when stop recording video: $e');
822+
throw e;
832823
}).whenComplete(() {
833824
isShootingButtonAnimate = false;
834825
});

lib/src/widget/camera_picker_viewer.dart

Lines changed: 38 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -84,25 +84,17 @@ class CameraPickerViewer extends StatefulWidget {
8484
required ThemeData theme,
8585
bool shouldDeletePreviewFile = false,
8686
EntitySaveCallback? onEntitySaving,
87-
}) async {
88-
try {
89-
final Widget viewer = CameraPickerViewer(
90-
pickerState: pickerState,
91-
pickerType: pickerType,
92-
previewXFile: previewXFile,
93-
theme: theme,
94-
shouldDeletePreviewFile: shouldDeletePreviewFile,
95-
onEntitySaving: onEntitySaving,
96-
);
97-
final PageRouteBuilder<AssetEntity?> pageRoute =
98-
PageRouteBuilder<AssetEntity?>(
99-
pageBuilder: (
100-
BuildContext context,
101-
Animation<double> animation,
102-
Animation<double> secondaryAnimation,
103-
) {
104-
return viewer;
105-
},
87+
}) {
88+
return Navigator.of(context).push<AssetEntity?>(
89+
PageRouteBuilder<AssetEntity?>(
90+
pageBuilder: (_, __, ___) => CameraPickerViewer(
91+
pickerState: pickerState,
92+
pickerType: pickerType,
93+
previewXFile: previewXFile,
94+
theme: theme,
95+
shouldDeletePreviewFile: shouldDeletePreviewFile,
96+
onEntitySaving: onEntitySaving,
97+
),
10698
transitionsBuilder: (
10799
BuildContext context,
108100
Animation<double> animation,
@@ -111,14 +103,8 @@ class CameraPickerViewer extends StatefulWidget {
111103
) {
112104
return FadeTransition(opacity: animation, child: child);
113105
},
114-
);
115-
final AssetEntity? result =
116-
await Navigator.of(context).push<AssetEntity?>(pageRoute);
117-
return result;
118-
} catch (e) {
119-
realDebugPrint('Error when calling camera picker viewer: $e');
120-
return null;
121-
}
106+
),
107+
);
122108
}
123109

124110
@override
@@ -188,8 +174,9 @@ class _CameraPickerViewerState extends State<CameraPickerViewer> {
188174
videoController.addListener(videoPlayerListener);
189175
hasLoaded = true;
190176
} catch (e) {
191-
realDebugPrint('Error when initialize video controller: $e');
192177
hasErrorWhenInitializing = true;
178+
realDebugPrint('Error when initializing video controller: $e');
179+
rethrow;
193180
} finally {
194181
if (mounted) {
195182
setState(() {});
@@ -237,34 +224,30 @@ class _CameraPickerViewerState extends State<CameraPickerViewer> {
237224
);
238225
return;
239226
}
240-
try {
241-
Future<AssetEntity?> saveFuture;
242-
243-
switch (pickerType) {
244-
case CameraPickerViewType.image:
245-
final Uint8List data = await previewFile.readAsBytes();
246-
saveFuture = PhotoManager.editor.saveImage(
247-
data,
248-
title: path.basename(previewFile.path),
249-
);
250-
break;
251-
case CameraPickerViewType.video:
252-
saveFuture = PhotoManager.editor.saveVideo(
253-
previewFile,
254-
title: path.basename(previewFile.path),
255-
);
256-
break;
257-
}
258-
259-
saveFuture.then((AssetEntity? entity) {
260-
if (shouldDeletePreviewFile && previewFile.existsSync()) {
261-
previewFile.delete();
262-
}
263-
Navigator.of(context).pop(entity);
264-
});
265-
} catch (e) {
266-
realDebugPrint('Error when creating entity: $e');
227+
Future<AssetEntity?> saveFuture;
228+
229+
switch (pickerType) {
230+
case CameraPickerViewType.image:
231+
final Uint8List data = await previewFile.readAsBytes();
232+
saveFuture = PhotoManager.editor.saveImage(
233+
data,
234+
title: path.basename(previewFile.path),
235+
);
236+
break;
237+
case CameraPickerViewType.video:
238+
saveFuture = PhotoManager.editor.saveVideo(
239+
previewFile,
240+
title: path.basename(previewFile.path),
241+
);
242+
break;
267243
}
244+
245+
saveFuture.then((AssetEntity? entity) {
246+
if (shouldDeletePreviewFile && previewFile.existsSync()) {
247+
previewFile.delete();
248+
}
249+
Navigator.of(context).pop(entity);
250+
});
268251
}
269252

270253
/// The back button for the preview section.

0 commit comments

Comments
 (0)