import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; // `PageView` contains a `Scrollable` which sets up a `HorizontalDragGestureRecognizer` // this recognizer will win in the gesture arena when the drag distance reaches `kTouchSlop` // we cannot change that, but we can prevent the scrollable from panning until this threshold is reached // and let other recognizers accept the gesture instead class MagnifierScrollerPhysics extends ScrollPhysics { const MagnifierScrollerPhysics({ this.touchSlopFactor = 1, ScrollPhysics? parent, }) : super(parent: parent); // in [0, 1] // 0: most reactive but will not let Magnifier recognizers accept gestures // 1: less reactive but gives the most leeway to Magnifier recognizers final double touchSlopFactor; @override MagnifierScrollerPhysics applyTo(ScrollPhysics? ancestor) { return MagnifierScrollerPhysics( touchSlopFactor: touchSlopFactor, parent: buildParent(ancestor), ); } @override double get dragStartDistanceMotionThreshold => kTouchSlop * touchSlopFactor; }