Bug fix where MouseScrollWheel zoom in flutter-web does not execute onInteraction functions (#65313)
diff --git a/AUTHORS b/AUTHORS
index e821328..a8b0e85 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -65,3 +65,4 @@
Alex Li <google@alexv525.com>
Ram Navan <hiramprasad@gmail.com>
meritozh <ah841814092@gmail.com>
+Terrence Addison Tandijono(flotilla) <terrenceaddison32@gmail.com>
diff --git a/packages/flutter/lib/src/widgets/interactive_viewer.dart b/packages/flutter/lib/src/widgets/interactive_viewer.dart
index e3c47c5..9306a2e 100644
--- a/packages/flutter/lib/src/widgets/interactive_viewer.dart
+++ b/packages/flutter/lib/src/widgets/interactive_viewer.dart
@@ -746,6 +746,7 @@
rotation: details.rotation,
));
}
+
final Offset focalPointScene = _transformationController.toScene(
details.localFocalPoint,
);
@@ -918,6 +919,22 @@
_transformationController.value,
focalPointSceneScaled - focalPointScene,
);
+ if (widget.onInteractionStart != null) {
+ widget.onInteractionStart(
+ ScaleStartDetails(focalPoint: focalPointSceneScaled)
+ );
+ }
+ if (widget.onInteractionUpdate != null) {
+ widget.onInteractionUpdate(ScaleUpdateDetails(
+ rotation: 0.0,
+ scale: scaleChange,
+ horizontalScale: 1.0,
+ verticalScale: 1.0,
+ ));
+ }
+ if (widget.onInteractionEnd != null) {
+ widget.onInteractionEnd(ScaleEndDetails());
+ }
}
}
diff --git a/packages/flutter/test/widgets/interactive_viewer_test.dart b/packages/flutter/test/widgets/interactive_viewer_test.dart
index de3336a..76cbb95 100644
--- a/packages/flutter/test/widgets/interactive_viewer_test.dart
+++ b/packages/flutter/test/widgets/interactive_viewer_test.dart
@@ -623,6 +623,46 @@
expect(transformationController.value.getMaxScaleOnAxis(), equals(1.0));
});
+ testWidgets('Scale with mouse returns onInteraction properties', (WidgetTester tester) async{
+ final TransformationController transformationController = TransformationController();
+ double scaleChange;
+ Velocity currentVelocity;
+ bool calledStart;
+ await tester.pumpWidget(
+ MaterialApp(
+ home: Scaffold(
+ body: Center(
+ child: InteractiveViewer(
+ transformationController: transformationController,
+ onInteractionStart: (ScaleStartDetails details){
+ calledStart = true;
+ },
+ onInteractionUpdate: (ScaleUpdateDetails details){
+ scaleChange = details.scale;
+ },
+ onInteractionEnd: (ScaleEndDetails details){
+ currentVelocity = details.velocity;
+ },
+ child: Container(width: 200.0, height: 200.0),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ final Offset center = tester.getCenter(find.byType(InteractiveViewer));
+ await scrollAt(center, tester, const Offset(0.0, -20.0));
+ await tester.pumpAndSettle();
+ const Velocity noMovement = Velocity(pixelsPerSecond: Offset(0,0));
+ final double afterScaling = transformationController.value.getMaxScaleOnAxis();
+
+ expect(scaleChange,greaterThan(1.0));
+ expect(afterScaling, isNot(equals(null)));
+ expect(afterScaling, isNot(equals(1.0)));
+ expect(currentVelocity, equals(noMovement));
+ expect(calledStart, equals(true));
+ });
+
testWidgets('viewport changes size', (WidgetTester tester) async {
final TransformationController transformationController = TransformationController();
await tester.pumpWidget(