Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 38dae1b

Browse files
authored
Update stretching overscroll clip behavior (#97678)
1 parent 0eedf42 commit 38dae1b

File tree

2 files changed

+64
-4
lines changed

2 files changed

+64
-4
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -785,10 +785,11 @@ class _StretchingOverscrollIndicatorState extends State<StretchingOverscrollIndi
785785
// Only clip if the viewport dimension is smaller than that of the
786786
// screen size in the main axis. If the viewport takes up the whole
787787
// screen, overflow from transforming the viewport is irrelevant.
788-
if (stretch != 0.0 && viewportDimension != mainAxisSize) {
789-
return ClipRect(child: transform);
790-
}
791-
return transform;
788+
return ClipRect(
789+
clipBehavior: stretch != 0.0 && viewportDimension != mainAxisSize
790+
? Clip.hardEdge : Clip.none,
791+
child: transform,
792+
);
792793
},
793794
),
794795
);

packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// machines.
77
@Tags(<String>['reduced-test-set'])
88

9+
import 'package:flutter/rendering.dart';
910
import 'package:flutter/widgets.dart';
1011
import 'package:flutter_test/flutter_test.dart';
1112

@@ -392,4 +393,62 @@ void main() {
392393
await gesture.up();
393394
await tester.pumpAndSettle();
394395
});
396+
397+
testWidgets('Clip behavior is updated as needed', (WidgetTester tester) async {
398+
// Regression test for https://github.com/flutter/flutter/issues/97867
399+
await tester.pumpWidget(Directionality(
400+
textDirection: TextDirection.ltr,
401+
child: MediaQuery(
402+
data: const MediaQueryData(size: Size(800.0, 600.0)),
403+
child: ScrollConfiguration(
404+
behavior: const ScrollBehavior().copyWith(overscroll: false),
405+
child: Column(
406+
children: <Widget>[
407+
StretchingOverscrollIndicator(
408+
axisDirection: AxisDirection.down,
409+
child: SizedBox(
410+
height: 300,
411+
child: ListView.builder(
412+
itemCount: 20,
413+
itemBuilder: (BuildContext context, int index){
414+
return Padding(
415+
padding: const EdgeInsets.all(10.0),
416+
child: Text('Index $index'),
417+
);
418+
},
419+
),
420+
),
421+
),
422+
Opacity(
423+
opacity: 0.5,
424+
child: Container(
425+
color: const Color(0xD0FF0000),
426+
height: 100,
427+
),
428+
)
429+
],
430+
)
431+
),
432+
)
433+
));
434+
435+
expect(find.text('Index 1'), findsOneWidget);
436+
expect(tester.getCenter(find.text('Index 1')).dy, 51.0);
437+
RenderClipRect renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
438+
// Currently not clipping
439+
expect(renderClip.clipBehavior, equals(Clip.none));
440+
441+
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Index 1')));
442+
// Overscroll the start.
443+
await gesture.moveBy(const Offset(0.0, 200.0));
444+
await tester.pumpAndSettle();
445+
expect(find.text('Index 1'), findsOneWidget);
446+
expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0));
447+
renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
448+
// Now clipping
449+
expect(renderClip.clipBehavior, equals(Clip.hardEdge));
450+
451+
await gesture.up();
452+
await tester.pumpAndSettle();
453+
});
395454
}

0 commit comments

Comments
 (0)