Skip to content

Commit 42edb43

Browse files
authored
🚸 Improve stop capturing experiences (#146)
1 parent 692376b commit 42edb43

File tree

3 files changed

+35
-13
lines changed

3 files changed

+35
-13
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ that can be found in the LICENSE file. -->
88

99
### Improvements
1010

11-
- Precache captured image for better experience. (#145)
11+
- Improve stop-capturing experiences. (#146)
12+
- Precache captured images for better experiences. (#145)
1213

1314
## 3.6.3
1415

lib/src/states/camera_picker_state.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -575,13 +575,7 @@ class CameraPickerState extends State<CameraPicker>
575575
}
576576
try {
577577
final XFile file = await controller.takePicture();
578-
// Delay disposing the controller to hold the preview.
579-
Future<void>.delayed(const Duration(milliseconds: 500), () {
580-
innerController?.dispose();
581-
safeSetState(() {
582-
innerController = null;
583-
});
584-
});
578+
await controller.pausePreview();
585579
final bool? isCapturedFileHandled = pickerConfig.onXFileCaptured?.call(
586580
file,
587581
CameraPickerViewType.image,
@@ -597,11 +591,12 @@ class CameraPickerState extends State<CameraPicker>
597591
Navigator.of(context).pop(entity);
598592
return;
599593
}
600-
initCameras(currentCamera);
601-
safeSetState(() {});
594+
await controller.resumePreview();
602595
} catch (e) {
603596
realDebugPrint('Error when preview the captured file: $e');
604597
handleErrorWithHandler(e, pickerConfig.onError);
598+
} finally {
599+
safeSetState(() {});
605600
}
606601
}
607602

@@ -688,8 +683,12 @@ class CameraPickerState extends State<CameraPicker>
688683
handleError();
689684
return;
690685
}
686+
safeSetState(() {
687+
isShootingButtonAnimate = false;
688+
});
691689
try {
692690
final XFile file = await controller.stopVideoRecording();
691+
await controller.pausePreview();
693692
final bool? isCapturedFileHandled = pickerConfig.onXFileCaptured?.call(
694693
file,
695694
CameraPickerViewType.video,
@@ -703,6 +702,8 @@ class CameraPickerState extends State<CameraPicker>
703702
);
704703
if (entity != null) {
705704
Navigator.of(context).pop(entity);
705+
} else {
706+
await controller.resumePreview();
706707
}
707708
} catch (e, s) {
708709
realDebugPrint('Error when stop recording video: $e');
@@ -711,7 +712,6 @@ class CameraPickerState extends State<CameraPicker>
711712
handleError();
712713
handleErrorWithHandler(e, pickerConfig.onError, s: s);
713714
} finally {
714-
isShootingButtonAnimate = false;
715715
safeSetState(() {});
716716
}
717717
}
@@ -991,6 +991,7 @@ class CameraPickerState extends State<CameraPicker>
991991
if ((innerController?.value.isRecordingVideo ?? false) &&
992992
isRecordingRestricted)
993993
CameraProgressButton(
994+
isAnimating: isShootingButtonAnimate,
994995
duration: pickerConfig.maximumRecordingDuration!,
995996
outerRadius: outerSize.width,
996997
ringsColor: theme.indicatorColor,

lib/src/widgets/camera_progress_button.dart

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import '../internals/methods.dart';
1212
class CameraProgressButton extends StatefulWidget {
1313
const CameraProgressButton({
1414
Key? key,
15+
required this.isAnimating,
1516
required this.outerRadius,
1617
required this.ringsWidth,
1718
this.ringsColor = wechatThemeColor,
1819
this.progress = 0.0,
1920
this.duration = const Duration(seconds: 15),
2021
}) : super(key: key);
2122

23+
final bool isAnimating;
2224
final double outerRadius;
2325
final double ringsWidth;
2426
final Color ringsColor;
@@ -42,10 +44,24 @@ class _CircleProgressState extends State<CameraProgressButton>
4244
void initState() {
4345
super.initState();
4446
ambiguate(WidgetsBinding.instance)?.addPostFrameCallback((_) {
45-
progressController.forward();
47+
if (widget.isAnimating) {
48+
progressController.forward();
49+
}
4650
});
4751
}
4852

53+
@override
54+
void didUpdateWidget(CameraProgressButton oldWidget) {
55+
super.didUpdateWidget(oldWidget);
56+
if (widget.isAnimating != oldWidget.isAnimating) {
57+
if (widget.isAnimating) {
58+
progressController.forward();
59+
} else {
60+
progressController.stop();
61+
}
62+
}
63+
}
64+
4965
@override
5066
void dispose() {
5167
progressController.dispose();
@@ -112,5 +128,9 @@ class CameraProgressButtonPainter extends CustomPainter {
112128
}
113129

114130
@override
115-
bool shouldRepaint(CameraProgressButtonPainter oldDelegate) => true;
131+
bool shouldRepaint(CameraProgressButtonPainter oldDelegate) {
132+
return oldDelegate.ringsWidth != ringsWidth ||
133+
oldDelegate.ringsColor != ringsColor ||
134+
oldDelegate.progress != progress;
135+
}
116136
}

0 commit comments

Comments
 (0)