From 38dae1bfc045806f4d2041b2d98a5a98a7140fbf Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 17 Feb 2022 18:15:50 -0600 Subject: [PATCH] Update stretching overscroll clip behavior (#97678) --- .../lib/src/widgets/overscroll_indicator.dart | 9 +-- .../overscroll_stretch_indicator_test.dart | 59 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/packages/flutter/lib/src/widgets/overscroll_indicator.dart b/packages/flutter/lib/src/widgets/overscroll_indicator.dart index 93168bfe61..d9e8c2ea0f 100644 --- a/packages/flutter/lib/src/widgets/overscroll_indicator.dart +++ b/packages/flutter/lib/src/widgets/overscroll_indicator.dart @@ -785,10 +785,11 @@ class _StretchingOverscrollIndicatorState extends State['reduced-test-set']) +import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -392,4 +393,62 @@ void main() { await gesture.up(); await tester.pumpAndSettle(); }); + + testWidgets('Clip behavior is updated as needed', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/97867 + await tester.pumpWidget(Directionality( + textDirection: TextDirection.ltr, + child: MediaQuery( + data: const MediaQueryData(size: Size(800.0, 600.0)), + child: ScrollConfiguration( + behavior: const ScrollBehavior().copyWith(overscroll: false), + child: Column( + children: [ + StretchingOverscrollIndicator( + axisDirection: AxisDirection.down, + child: SizedBox( + height: 300, + child: ListView.builder( + itemCount: 20, + itemBuilder: (BuildContext context, int index){ + return Padding( + padding: const EdgeInsets.all(10.0), + child: Text('Index $index'), + ); + }, + ), + ), + ), + Opacity( + opacity: 0.5, + child: Container( + color: const Color(0xD0FF0000), + height: 100, + ), + ) + ], + ) + ), + ) + )); + + expect(find.text('Index 1'), findsOneWidget); + expect(tester.getCenter(find.text('Index 1')).dy, 51.0); + RenderClipRect renderClip = tester.allRenderObjects.whereType().first; + // Currently not clipping + expect(renderClip.clipBehavior, equals(Clip.none)); + + final TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Index 1'))); + // Overscroll the start. + await gesture.moveBy(const Offset(0.0, 200.0)); + await tester.pumpAndSettle(); + expect(find.text('Index 1'), findsOneWidget); + expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0)); + renderClip = tester.allRenderObjects.whereType().first; + // Now clipping + expect(renderClip.clipBehavior, equals(Clip.hardEdge)); + + await gesture.up(); + await tester.pumpAndSettle(); + }); }