Skip to content

Commit 2e7b458

Browse files
authored
No friction factor on macOS overscroll ease (#122143)
No friction factor on macOS overscroll ease
1 parent ac76dab commit 2e7b458

File tree

3 files changed

+44
-19
lines changed

3 files changed

+44
-19
lines changed

packages/flutter/lib/src/widgets/scroll_physics.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,9 @@ class BouncingScrollPhysics extends ScrollPhysics {
707707
: frictionFactor(overscrollPast / position.viewportDimension);
708708
final double direction = offset.sign;
709709

710+
if (easing && decelerationRate == ScrollDecelerationRate.fast) {
711+
return direction * offset.abs();
712+
}
710713
return direction * _applyFriction(overscrollPast, offset.abs(), friction);
711714
}
712715

packages/flutter/test/cupertino/refresh_test.dart

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,15 @@ void main() {
211211
final TestGesture gesture = await tester.startGesture(Offset.zero);
212212
await gesture.moveBy(const Offset(0.0, 99.0));
213213
await tester.pump();
214-
await gesture.moveBy(const Offset(0.0, -30.0));
214+
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
215+
await gesture.moveBy(const Offset(0.0, -3.0));
216+
}
217+
else {
218+
await gesture.moveBy(const Offset(0.0, -30.0));
219+
}
215220
await tester.pump();
216221
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
217-
await gesture.moveBy(const Offset(0.0, 70.0));
222+
await gesture.moveBy(const Offset(0.0, 90.0));
218223
}
219224
else {
220225
await gesture.moveBy(const Offset(0.0, 50.0));
@@ -230,7 +235,7 @@ void main() {
230235
),
231236
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) matchesBuilder(
232237
refreshState: RefreshIndicatorMode.drag,
233-
pulledExtent: moreOrLessEquals(97.3552275),
238+
pulledExtent: moreOrLessEquals(96),
234239
refreshTriggerPullDistance: 100, // default value.
235240
refreshIndicatorExtent: 60, // default value.
236241
)
@@ -242,7 +247,7 @@ void main() {
242247
),
243248
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) matchesBuilder(
244249
refreshState: RefreshIndicatorMode.armed,
245-
pulledExtent: moreOrLessEquals(100.79409877743257),
250+
pulledExtent: moreOrLessEquals(100.44528),
246251
refreshTriggerPullDistance: 100, // default value.
247252
refreshIndicatorExtent: 60, // default value.
248253
)
@@ -460,7 +465,7 @@ void main() {
460465
);
461466

462467
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
463-
await tester.drag(find.text('0'), const Offset(0.0, -600.0), touchSlopY: 0, warnIfMissed: false); // hits the list
468+
await tester.drag(find.text('0'), const Offset(0.0, -130.0), touchSlopY: 0, warnIfMissed: false); // hits the list
464469
}
465470
else {
466471
await tester.drag(find.text('0'), const Offset(0.0, -300.0), touchSlopY: 0, warnIfMissed: false); // hits the list
@@ -479,15 +484,15 @@ void main() {
479484
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
480485
expect(
481486
tester.getTopLeft(find.widgetWithText(Center, '-1', skipOffstage: false)).dy,
482-
moreOrLessEquals(-38.625),
487+
moreOrLessEquals(-40),
483488
);
484489
expect(
485490
tester.getBottomLeft(find.widgetWithText(Center, '-1', skipOffstage: false)).dy,
486-
moreOrLessEquals(21.375),
491+
moreOrLessEquals(20),
487492
);
488493
expect(
489494
tester.getTopLeft(find.widgetWithText(Center, '0')).dy,
490-
moreOrLessEquals(21.375),
495+
moreOrLessEquals(20),
491496
);
492497
}
493498
else {
@@ -1195,7 +1200,7 @@ void main() {
11951200
);
11961201

11971202
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
1198-
await gesture.moveBy(const Offset(0.0, -310.0)); // Overscrolling, need to move more than -40.
1203+
await gesture.moveBy(const Offset(0.0, -41.0)); // Overscrolling, need to move more than -40.
11991204
}
12001205
else {
12011206
await gesture.moveBy(const Offset(0.0, -80.0)); // Overscrolling, need to move more than -40.
@@ -1204,7 +1209,7 @@ void main() {
12041209
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
12051210
expect(
12061211
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
1207-
moreOrLessEquals(49.469222222222214), // Below 50 now.
1212+
moreOrLessEquals(49), // Below 50 now.
12081213
);
12091214
}
12101215
else {
@@ -1303,7 +1308,7 @@ void main() {
13031308

13041309
// Now back in overscroll mode.
13051310
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
1306-
await gesture.moveBy(const Offset(0.0, -590.0));
1311+
await gesture.moveBy(const Offset(0.0, -125.0));
13071312
}
13081313
else {
13091314
await gesture.moveBy(const Offset(0.0, -200.0));
@@ -1312,7 +1317,7 @@ void main() {
13121317
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
13131318
expect(
13141319
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
1315-
moreOrLessEquals(25.916444444444423),
1320+
moreOrLessEquals(25),
13161321
);
13171322
}
13181323
else {
@@ -1328,7 +1333,7 @@ void main() {
13281333
);
13291334

13301335
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
1331-
await gesture.moveBy(const Offset(0.0, -160.0));
1336+
await gesture.moveBy(const Offset(0.0, -15.0));
13321337
}
13331338
else {
13341339
await gesture.moveBy(const Offset(0.0, -35.0));
@@ -1337,7 +1342,7 @@ void main() {
13371342
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
13381343
expect(
13391344
tester.getTopLeft(find.widgetWithText(SizedBox, '0')).dy,
1340-
moreOrLessEquals(9.15133037440173),
1345+
moreOrLessEquals(10),
13411346
);
13421347
}
13431348
else {
@@ -1380,13 +1385,10 @@ void main() {
13801385
);
13811386
await tester.pump(); // Sliver scroll offset correction is applied one frame later.
13821387

1388+
await gesture.moveBy(const Offset(0.0, -300.0));
13831389
double indicatorDestinationPosition = -145.0332383665717;
13841390
if (debugDefaultTargetPlatformOverride == TargetPlatform.macOS) {
1385-
await gesture.moveBy(const Offset(0.0, -600.0));
1386-
indicatorDestinationPosition = -164.33475946989466;
1387-
}
1388-
else {
1389-
await gesture.moveBy(const Offset(0.0, -300.0));
1391+
indicatorDestinationPosition = -150.0;
13901392
}
13911393
await tester.pump();
13921394
// The refresh indicator is offscreen now.

packages/flutter/test/widgets/scroll_physics_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,26 @@ void main() {
221221
expect(easingApplied.abs(), greaterThan(tensioningApplied.abs()));
222222
});
223223

224+
test('no easing resistance for ScrollDecelerationRate.fast', () {
225+
const BouncingScrollPhysics desktop = BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast);
226+
final ScrollMetrics overscrolledPosition = FixedScrollMetrics(
227+
minScrollExtent: 0.0,
228+
maxScrollExtent: 1000.0,
229+
pixels: -20.0,
230+
viewportDimension: 100.0,
231+
axisDirection: AxisDirection.down,
232+
devicePixelRatio: 3.0,
233+
);
234+
235+
final double easingApplied =
236+
desktop.applyPhysicsToUserOffset(overscrolledPosition, -10.0);
237+
final double tensioningApplied =
238+
desktop.applyPhysicsToUserOffset(overscrolledPosition, 10.0);
239+
240+
expect(tensioningApplied.abs(), lessThan(easingApplied.abs()));
241+
expect(easingApplied, -10);
242+
});
243+
224244
test('overscroll a small list and a big list works the same way', () {
225245
final ScrollMetrics smallListOverscrolledPosition = FixedScrollMetrics(
226246
minScrollExtent: 0.0,

0 commit comments

Comments
 (0)