No friction factor on macOS overscroll ease (#122143)
No friction factor on macOS overscroll ease
diff --git a/packages/flutter/lib/src/widgets/scroll_physics.dart b/packages/flutter/lib/src/widgets/scroll_physics.dart
index db831c5..466b0b5 100644
--- a/packages/flutter/lib/src/widgets/scroll_physics.dart
+++ b/packages/flutter/lib/src/widgets/scroll_physics.dart
@@ -707,6 +707,9 @@
: frictionFactor(overscrollPast / position.viewportDimension);
final double direction = offset.sign;
+ if (easing && decelerationRate == ScrollDecelerationRate.fast) {
+ return direction * offset.abs();
+ }
return direction * _applyFriction(overscrollPast, offset.abs(), friction);
}
diff --git a/packages/flutter/test/cupertino/refresh_test.dart b/packages/flutter/test/cupertino/refresh_test.dart
index 7bc6475..e06a0ab 100644
--- a/packages/flutter/test/cupertino/refresh_test.dart
+++ b/packages/flutter/test/cupertino/refresh_test.dart
@@ -211,10 +211,15 @@
final TestGesture gesture = await tester.startGesture(Offset.zero);
await gesture.moveBy(const Offset(0.0, 99.0));
await tester.pump();
- await gesture.moveBy(const Offset(0.0, -30.0));
+ if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
+ await gesture.moveBy(const Offset(0.0, -3.0));
+ }
+ else {
+ await gesture.moveBy(const Offset(0.0, -30.0));
+ }
await tester.pump();
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await gesture.moveBy(const Offset(0.0, 70.0));
+ await gesture.moveBy(const Offset(0.0, 90.0));
}
else {
await gesture.moveBy(const Offset(0.0, 50.0));
@@ -230,7 +235,7 @@
),
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) matchesBuilder(
refreshState: RefreshIndicatorMode.drag,
- pulledExtent: moreOrLessEquals(97.3552275),
+ pulledExtent: moreOrLessEquals(96),
refreshTriggerPullDistance: 100, // default value.
refreshIndicatorExtent: 60, // default value.
)
@@ -242,7 +247,7 @@
),
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) matchesBuilder(
refreshState: RefreshIndicatorMode.armed,
- pulledExtent: moreOrLessEquals(100.79409877743257),
+ pulledExtent: moreOrLessEquals(100.44528),
refreshTriggerPullDistance: 100, // default value.
refreshIndicatorExtent: 60, // default value.
)
@@ -460,7 +465,7 @@
);
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await tester.drag(find.text('0'), const Offset(0.0, -600.0), touchSlopY: 0, warnIfMissed: false); // hits the list
+ await tester.drag(find.text('0'), const Offset(0.0, -130.0), touchSlopY: 0, warnIfMissed: false); // hits the list
}
else {
await tester.drag(find.text('0'), const Offset(0.0, -300.0), touchSlopY: 0, warnIfMissed: false); // hits the list
@@ -479,15 +484,15 @@
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
expect(
tester.getTopLeft(find.widgetWithText(Center, '-1', skipOffstage: false)).dy,
- moreOrLessEquals(-38.625),
+ moreOrLessEquals(-40),
);
expect(
tester.getBottomLeft(find.widgetWithText(Center, '-1', skipOffstage: false)).dy,
- moreOrLessEquals(21.375),
+ moreOrLessEquals(20),
);
expect(
tester.getTopLeft(find.widgetWithText(Center, '0')).dy,
- moreOrLessEquals(21.375),
+ moreOrLessEquals(20),
);
}
else {
@@ -1195,7 +1200,7 @@
);
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await gesture.moveBy(const Offset(0.0, -310.0)); // Overscrolling, need to move more than -40.
+ await gesture.moveBy(const Offset(0.0, -41.0)); // Overscrolling, need to move more than -40.
}
else {
await gesture.moveBy(const Offset(0.0, -80.0)); // Overscrolling, need to move more than -40.
@@ -1204,7 +1209,7 @@
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
expect(
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
- moreOrLessEquals(49.469222222222214), // Below 50 now.
+ moreOrLessEquals(49), // Below 50 now.
);
}
else {
@@ -1303,7 +1308,7 @@
// Now back in overscroll mode.
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await gesture.moveBy(const Offset(0.0, -590.0));
+ await gesture.moveBy(const Offset(0.0, -125.0));
}
else {
await gesture.moveBy(const Offset(0.0, -200.0));
@@ -1312,7 +1317,7 @@
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
expect(
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
- moreOrLessEquals(25.916444444444423),
+ moreOrLessEquals(25),
);
}
else {
@@ -1328,7 +1333,7 @@
);
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await gesture.moveBy(const Offset(0.0, -160.0));
+ await gesture.moveBy(const Offset(0.0, -15.0));
}
else {
await gesture.moveBy(const Offset(0.0, -35.0));
@@ -1337,7 +1342,7 @@
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
expect(
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
- moreOrLessEquals(9.15133037440173),
+ moreOrLessEquals(10),
);
}
else {
@@ -1380,13 +1385,10 @@
);
await tester.pump(); // Sliver scroll offset correction is applied one frame later.
+ await gesture.moveBy(const Offset(0.0, -300.0));
double indicatorDestinationPosition = -145.0332383665717;
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
- await gesture.moveBy(const Offset(0.0, -600.0));
- indicatorDestinationPosition = -164.33475946989466;
- }
- else {
- await gesture.moveBy(const Offset(0.0, -300.0));
+ indicatorDestinationPosition = -150.0;
}
await tester.pump();
// The refresh indicator is offscreen now.
diff --git a/packages/flutter/test/widgets/scroll_physics_test.dart b/packages/flutter/test/widgets/scroll_physics_test.dart
index e24f2e8..fc66c13 100644
--- a/packages/flutter/test/widgets/scroll_physics_test.dart
+++ b/packages/flutter/test/widgets/scroll_physics_test.dart
@@ -221,6 +221,26 @@
expect(easingApplied.abs(), greaterThan(tensioningApplied.abs()));
});
+ test('no easing resistance for ScrollDecelerationRate.fast', () {
+ const BouncingScrollPhysics desktop = BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast);
+ final ScrollMetrics overscrolledPosition = FixedScrollMetrics(
+ minScrollExtent: 0.0,
+ maxScrollExtent: 1000.0,
+ pixels: -20.0,
+ viewportDimension: 100.0,
+ axisDirection: AxisDirection.down,
+ devicePixelRatio: 3.0,
+ );
+
+ final double easingApplied =
+ desktop.applyPhysicsToUserOffset(overscrolledPosition, -10.0);
+ final double tensioningApplied =
+ desktop.applyPhysicsToUserOffset(overscrolledPosition, 10.0);
+
+ expect(tensioningApplied.abs(), lessThan(easingApplied.abs()));
+ expect(easingApplied, -10);
+ });
+
test('overscroll a small list and a big list works the same way', () {
final ScrollMetrics smallListOverscrolledPosition = FixedScrollMetrics(
minScrollExtent: 0.0,