@@ -49,6 +49,7 @@ class CameraPicker extends StatefulWidget {
49
49
this .cameraQuarterTurns = 0 ,
50
50
this .foregroundBuilder,
51
51
this .onEntitySaving,
52
+ this .onError,
52
53
CameraPickerTextDelegate ? textDelegate,
53
54
}) : assert (
54
55
enableRecording == true || onlyEnableRecording != true ,
@@ -123,6 +124,9 @@ class CameraPicker extends StatefulWidget {
123
124
/// {@macro wechat_camera_picker.EntitySaveCallback}
124
125
final EntitySaveCallback ? onEntitySaving;
125
126
127
+ /// {@macro wechat_camera_picker.CameraErrorHandler}
128
+ final CameraErrorHandler ? onError;
129
+
126
130
/// Static method to create [AssetEntity] through camera.
127
131
/// 通过相机创建 [AssetEntity] 的静态方法
128
132
static Future <AssetEntity ?> pickFromCamera (
@@ -143,6 +147,7 @@ class CameraPicker extends StatefulWidget {
143
147
ImageFormatGroup imageFormatGroup = ImageFormatGroup .unknown,
144
148
Widget Function (CameraValue )? foregroundBuilder,
145
149
EntitySaveCallback ? onEntitySaving,
150
+ CameraErrorHandler ? onError,
146
151
bool useRootNavigator = true ,
147
152
}) {
148
153
if (enableRecording != true && onlyEnableRecording == true ) {
@@ -170,6 +175,7 @@ class CameraPicker extends StatefulWidget {
170
175
imageFormatGroup: imageFormatGroup,
171
176
foregroundBuilder: foregroundBuilder,
172
177
onEntitySaving: onEntitySaving,
178
+ onError: onError,
173
179
),
174
180
transitionCurve: Curves .easeIn,
175
181
transitionDuration: _kRouteDuration,
@@ -472,9 +478,12 @@ class CameraPickerState extends State<CameraPicker>
472
478
// After cameras fetched, judge again with the list is empty or not to
473
479
// ensure there is at least an available camera for use.
474
480
if (cameraDescription == null && (cameras.isEmpty)) {
475
- throw CameraException (
476
- 'No CameraDescription found.' ,
477
- 'No cameras are available in the controller.' ,
481
+ handleErrorWithHandler (
482
+ CameraException (
483
+ 'No CameraDescription found.' ,
484
+ 'No cameras are available in the controller.' ,
485
+ ),
486
+ widget.onError,
478
487
);
479
488
}
480
489
@@ -486,9 +495,12 @@ class CameraPickerState extends State<CameraPicker>
486
495
imageFormatGroup: widget.imageFormatGroup,
487
496
)..addListener (() {
488
497
if (controller.value.hasError) {
489
- throw CameraException (
490
- 'CameraController exception' ,
491
- controller.value.errorDescription,
498
+ handleErrorWithHandler (
499
+ CameraException (
500
+ 'CameraController exception' ,
501
+ controller.value.errorDescription,
502
+ ),
503
+ widget.onError,
492
504
);
493
505
}
494
506
});
@@ -505,8 +517,8 @@ class CameraPickerState extends State<CameraPicker>
505
517
(() async =>
506
518
_minAvailableZoom = await controller.getMinZoomLevel ())(),
507
519
]);
508
- } catch (_ ) {
509
- rethrow ;
520
+ } catch (e ) {
521
+ handleErrorWithHandler (e, widget.onError) ;
510
522
} finally {
511
523
safeSetState (() {});
512
524
}
@@ -692,7 +704,10 @@ class CameraPickerState extends State<CameraPicker>
692
704
/// 仅当初始化成功且相机未在拍照时拍照。
693
705
Future <void > takePicture () async {
694
706
if (! controller.value.isInitialized) {
695
- throw StateError ('Camera has not initialized.' );
707
+ handleErrorWithHandler (
708
+ StateError ('Camera has not initialized.' ),
709
+ widget.onError,
710
+ );
696
711
}
697
712
if (controller.value.isTakingPicture) {
698
713
return ;
@@ -720,7 +735,7 @@ class CameraPickerState extends State<CameraPicker>
720
735
safeSetState (() {});
721
736
} catch (e) {
722
737
realDebugPrint ('Error when preview the captured file: $e ' );
723
- rethrow ;
738
+ handleErrorWithHandler (e, widget.onError) ;
724
739
}
725
740
}
726
741
@@ -784,7 +799,7 @@ class CameraPickerState extends State<CameraPicker>
784
799
stopRecordingVideo ();
785
800
});
786
801
}
787
- throw e ;
802
+ handleErrorWithHandler (e, widget.onError) ;
788
803
});
789
804
}
790
805
}
@@ -816,7 +831,7 @@ class CameraPickerState extends State<CameraPicker>
816
831
realDebugPrint ('Try to initialize a new CameraController...' );
817
832
initCameras ();
818
833
_handleError ();
819
- throw e ;
834
+ handleErrorWithHandler (e, widget.onError) ;
820
835
}).whenComplete (() {
821
836
isShootingButtonAnimate = false ;
822
837
safeSetState (() {});
0 commit comments