diff --git a/mobile/lib/widgets/photo_view/src/controller/photo_view_controller.dart b/mobile/lib/widgets/photo_view/src/controller/photo_view_controller.dart index b9475a9ee2..c86591fc83 100644 --- a/mobile/lib/widgets/photo_view/src/controller/photo_view_controller.dart +++ b/mobile/lib/widgets/photo_view/src/controller/photo_view_controller.dart @@ -38,12 +38,13 @@ abstract class PhotoViewControllerBase { /// Closes streams and removes eventual listeners. void dispose(); - void positionAnimationBuilder(void Function(Offset)? value); - void scaleAnimationBuilder(void Function(double)? value); - void rotationAnimationBuilder(void Function(double)? value); + void positionAnimationBuilder(Future Function(Offset)? value); + void scaleAnimationBuilder(Future Function(double)? value); + void rotationAnimationBuilder(Future Function(double)? value); - /// Animates multiple fields of the state - void animateMultiple({Offset? position, double? scale, double? rotation}); + /// Animates multiple fields of the state. The returned future completes + /// when all underlying animations have settled. + Future animateMultiple({Offset? position, double? scale, double? rotation}); /// Add a listener that will ignore updates made internally /// @@ -148,9 +149,9 @@ class PhotoViewController implements PhotoViewControllerBase Function(Offset)? _animatePosition; + late Future Function(double)? _animateScale; + late Future Function(double)? _animateRotation; @override Stream get outputStateStream => _outputCtrl.stream; @@ -159,17 +160,17 @@ class PhotoViewController implements PhotoViewControllerBase Function(Offset)? value) { _animatePosition = value; } @override - void scaleAnimationBuilder(void Function(double)? value) { + void scaleAnimationBuilder(Future Function(double)? value) { _animateScale = value; } @override - void rotationAnimationBuilder(void Function(double)? value) { + void rotationAnimationBuilder(Future Function(double)? value) { _animateRotation = value; } @@ -193,18 +194,18 @@ class PhotoViewController implements PhotoViewControllerBase animateMultiple({Offset? position, double? scale, double? rotation}) { + final futures = >[]; if (position != null && _animatePosition != null) { - _animatePosition!(position); + futures.add(_animatePosition!(position)); } - if (scale != null && _animateScale != null) { - _animateScale!(scale); + futures.add(_animateScale!(scale)); } - if (rotation != null && _animateRotation != null) { - _animateRotation!(rotation); + futures.add(_animateRotation!(rotation)); } + return Future.wait(futures); } @override diff --git a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart index 2f775f57e2..66540983a0 100644 --- a/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart +++ b/mobile/lib/widgets/photo_view/src/core/photo_view_core.dart @@ -237,34 +237,31 @@ class PhotoViewCoreState extends State nextScaleState(); } - void animateScale(double from, double to) { + Future animateScale(double from, double to) { if (!mounted) { - return; + return Future.value(); } _scaleAnimation = Tween(begin: from, end: to).animate(_scaleAnimationController); - _scaleAnimationController - ..value = 0.0 - ..fling(velocity: 0.4); + _scaleAnimationController.value = 0.0; + return _scaleAnimationController.fling(velocity: 0.4); } - void animatePosition(Offset from, Offset to) { + Future animatePosition(Offset from, Offset to) { if (!mounted) { - return; + return Future.value(); } _positionAnimation = Tween(begin: from, end: to).animate(_positionAnimationController); - _positionAnimationController - ..value = 0.0 - ..fling(velocity: 0.4); + _positionAnimationController.value = 0.0; + return _positionAnimationController.fling(velocity: 0.4); } - void animateRotation(double from, double to) { + Future animateRotation(double from, double to) { if (!mounted) { - return; + return Future.value(); } _rotationAnimation = Tween(begin: from, end: to).animate(_rotationAnimationController); - _rotationAnimationController - ..value = 0.0 - ..fling(velocity: 0.4); + _rotationAnimationController.value = 0.0; + return _rotationAnimationController.fling(velocity: 0.4); } void onAnimationStatus(AnimationStatus status) { @@ -280,18 +277,19 @@ class PhotoViewCoreState extends State } } - void _animateControllerPosition(Offset position) { - animatePosition(controller.position, position); + Future _animateControllerPosition(Offset position) { + return animatePosition(controller.position, position); } - void _animateControllerScale(double scale) { + Future _animateControllerScale(double scale) { if (controller.scale != null) { - animateScale(controller.scale!, scale); + return animateScale(controller.scale!, scale); } + return Future.value(); } - void _animateControllerRotation(double rotation) { - animateRotation(controller.rotation, rotation); + Future _animateControllerRotation(double rotation) { + return animateRotation(controller.rotation, rotation); } @override