Skip to content

Commit 02558d6

Browse files
authored
Revert "Fix StretchingOverscrollIndicator clipping and add clipBehavior parameter" (#106207)
1 parent 12f2a35 commit 02558d6

File tree

6 files changed

+3
-173
lines changed

6 files changed

+3
-173
lines changed

packages/flutter/lib/src/material/app.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,6 @@ class MaterialScrollBehavior extends ScrollBehavior {
819819
case AndroidOverscrollIndicator.stretch:
820820
return StretchingOverscrollIndicator(
821821
axisDirection: details.direction,
822-
clipBehavior: details.clipBehavior,
823822
child: child,
824823
);
825824
case AndroidOverscrollIndicator.glow:

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -653,11 +653,9 @@ class StretchingOverscrollIndicator extends StatefulWidget {
653653
super.key,
654654
required this.axisDirection,
655655
this.notificationPredicate = defaultScrollNotificationPredicate,
656-
this.clipBehavior = Clip.hardEdge,
657656
this.child,
658657
}) : assert(axisDirection != null),
659-
assert(notificationPredicate != null),
660-
assert(clipBehavior != null);
658+
assert(notificationPredicate != null);
661659

662660
/// {@macro flutter.overscroll.axisDirection}
663661
final AxisDirection axisDirection;
@@ -668,11 +666,6 @@ class StretchingOverscrollIndicator extends StatefulWidget {
668666
/// {@macro flutter.overscroll.notificationPredicate}
669667
final ScrollNotificationPredicate notificationPredicate;
670668

671-
/// {@macro flutter.material.Material.clipBehavior}
672-
///
673-
/// Defaults to [Clip.hardEdge].
674-
final Clip clipBehavior;
675-
676669
/// The widget below this widget in the tree.
677670
///
678671
/// The overscroll indicator will apply a stretch effect to this child. This
@@ -813,8 +806,7 @@ class _StretchingOverscrollIndicatorState extends State<StretchingOverscrollIndi
813806
// screen, overflow from transforming the viewport is irrelevant.
814807
return ClipRect(
815808
clipBehavior: stretch != 0.0 && viewportDimension != mainAxisSize
816-
? widget.clipBehavior
817-
: Clip.none,
809+
? Clip.hardEdge : Clip.none,
818810
child: transform,
819811
);
820812
},

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,6 @@ abstract class ScrollView extends StatelessWidget {
425425
viewportBuilder: (BuildContext context, ViewportOffset offset) {
426426
return buildViewport(context, offset, axisDirection, slivers);
427427
},
428-
clipBehavior: clipBehavior,
429428
);
430429

431430
final Widget scrollableResult = effectivePrimary && scrollController != null

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

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ class Scrollable extends StatefulWidget {
9797
this.dragStartBehavior = DragStartBehavior.start,
9898
this.restorationId,
9999
this.scrollBehavior,
100-
this.clipBehavior = Clip.hardEdge,
101100
}) : assert(axisDirection != null),
102101
assert(dragStartBehavior != null),
103102
assert(viewportBuilder != null),
@@ -262,14 +261,6 @@ class Scrollable extends StatefulWidget {
262261
/// [ScrollBehavior].
263262
final ScrollBehavior? scrollBehavior;
264263

265-
/// {@macro flutter.material.Material.clipBehavior}
266-
///
267-
/// Defaults to [Clip.hardEdge].
268-
///
269-
/// Rather than clipping [Scrollable], this is passed to decorators in
270-
/// [ScrollableDetails].
271-
final Clip clipBehavior;
272-
273264
/// The axis along which the scroll view scrolls.
274265
///
275266
/// Determined by the [axisDirection].
@@ -806,7 +797,6 @@ class ScrollableState extends State<Scrollable> with TickerProviderStateMixin, R
806797
final ScrollableDetails details = ScrollableDetails(
807798
direction: widget.axisDirection,
808799
controller: _effectiveScrollController,
809-
clipBehavior: widget.clipBehavior,
810800
);
811801

812802
result = _configuration.buildScrollbar(
@@ -822,7 +812,7 @@ class ScrollableState extends State<Scrollable> with TickerProviderStateMixin, R
822812
state: this,
823813
position: position,
824814
registrar: registrar,
825-
child: result,
815+
child: result
826816
);
827817
}
828818

@@ -1323,7 +1313,6 @@ class ScrollableDetails {
13231313
const ScrollableDetails({
13241314
required this.direction,
13251315
required this.controller,
1326-
required this.clipBehavior,
13271316
});
13281317

13291318
/// The direction in which this widget scrolls.
@@ -1337,13 +1326,6 @@ class ScrollableDetails {
13371326
/// This can be used by [ScrollBehavior] to apply a [Scrollbar] to the associated
13381327
/// [Scrollable].
13391328
final ScrollController controller;
1340-
1341-
/// {@macro flutter.material.Material.clipBehavior}
1342-
///
1343-
/// This can be used by [MaterialScrollBehavior] to clip [StretchingOverscrollIndicator].
1344-
///
1345-
/// Cannot be null.
1346-
final Clip clipBehavior;
13471329
}
13481330

13491331
/// With [_ScrollSemantics] certain child [SemanticsNode]s can be

packages/flutter/test/material/app_test.dart

Lines changed: 0 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import 'package:flutter/cupertino.dart';
1212
import 'package:flutter/foundation.dart';
1313
import 'package:flutter/material.dart';
14-
import 'package:flutter/rendering.dart';
1514
import 'package:flutter/services.dart';
1615
import 'package:flutter_test/flutter_test.dart';
1716

@@ -1266,83 +1265,6 @@ void main() {
12661265
expect(find.byType(GlowingOverscrollIndicator), findsNothing);
12671266
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
12681267

1269-
testWidgets(
1270-
'ListView clip behavior updates overscroll indicator clip behavior', (WidgetTester tester) async {
1271-
Widget buildFrame(Clip clipBehavior) {
1272-
return MaterialApp(
1273-
theme: ThemeData(useMaterial3: true),
1274-
home: Column(
1275-
children: <Widget>[
1276-
SizedBox(
1277-
height: 300,
1278-
child: ListView.builder(
1279-
itemCount: 20,
1280-
clipBehavior: clipBehavior,
1281-
itemBuilder: (BuildContext context, int index){
1282-
return Padding(
1283-
padding: const EdgeInsets.all(10.0),
1284-
child: Text('Index $index'),
1285-
);
1286-
},
1287-
),
1288-
),
1289-
Opacity(
1290-
opacity: 0.5,
1291-
child: Container(
1292-
color: const Color(0xD0FF0000),
1293-
height: 100,
1294-
),
1295-
),
1296-
],
1297-
),
1298-
);
1299-
}
1300-
1301-
// Test default clip behavior.
1302-
await tester.pumpWidget(buildFrame(Clip.hardEdge));
1303-
1304-
expect(find.byType(StretchingOverscrollIndicator), findsOneWidget);
1305-
expect(find.byType(GlowingOverscrollIndicator), findsNothing);
1306-
expect(find.text('Index 1'), findsOneWidget);
1307-
1308-
RenderClipRect renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
1309-
// Currently not clipping
1310-
expect(renderClip.clipBehavior, equals(Clip.none));
1311-
1312-
TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Index 1')));
1313-
// Overscroll the start.
1314-
await gesture.moveBy(const Offset(0.0, 200.0));
1315-
await tester.pumpAndSettle();
1316-
expect(find.text('Index 1'), findsOneWidget);
1317-
expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0));
1318-
renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
1319-
// Now clipping
1320-
expect(renderClip.clipBehavior, equals(Clip.hardEdge));
1321-
1322-
await gesture.up();
1323-
await tester.pumpAndSettle();
1324-
1325-
// Test custom clip behavior.
1326-
await tester.pumpWidget(buildFrame(Clip.none));
1327-
1328-
renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
1329-
// Currently not clipping
1330-
expect(renderClip.clipBehavior, equals(Clip.none));
1331-
1332-
gesture = await tester.startGesture(tester.getCenter(find.text('Index 1')));
1333-
// Overscroll the start.
1334-
await gesture.moveBy(const Offset(0.0, 200.0));
1335-
await tester.pumpAndSettle();
1336-
expect(find.text('Index 1'), findsOneWidget);
1337-
expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0));
1338-
renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
1339-
// Now clipping
1340-
expect(renderClip.clipBehavior, equals(Clip.none));
1341-
1342-
await gesture.up();
1343-
await tester.pumpAndSettle();
1344-
}, variant: TargetPlatformVariant.only(TargetPlatform.android));
1345-
13461268
testWidgets('When `useInheritedMediaQuery` is true an existing MediaQuery is used if one is available', (WidgetTester tester) async {
13471269
late BuildContext capturedContext;
13481270
final UniqueKey uniqueKey = UniqueKey();

packages/flutter/test/widgets/overscroll_stretch_indicator_test.dart

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -454,70 +454,6 @@ void main() {
454454
await tester.pumpAndSettle();
455455
});
456456

457-
testWidgets('clipBehavior parameter updates overscroll clipping behavior', (WidgetTester tester) async {
458-
// Regression test for https://github.com/flutter/flutter/issues/103491
459-
460-
Widget buildFrame(Clip clipBehavior) {
461-
return Directionality(
462-
textDirection: TextDirection.ltr,
463-
child: MediaQuery(
464-
data: const MediaQueryData(size: Size(800.0, 600.0)),
465-
child: ScrollConfiguration(
466-
behavior: const ScrollBehavior().copyWith(overscroll: false),
467-
child: Column(
468-
children: <Widget>[
469-
StretchingOverscrollIndicator(
470-
axisDirection: AxisDirection.down,
471-
clipBehavior: clipBehavior,
472-
child: SizedBox(
473-
height: 300,
474-
child: ListView.builder(
475-
itemCount: 20,
476-
itemBuilder: (BuildContext context, int index){
477-
return Padding(
478-
padding: const EdgeInsets.all(10.0),
479-
child: Text('Index $index'),
480-
);
481-
},
482-
),
483-
),
484-
),
485-
Opacity(
486-
opacity: 0.5,
487-
child: Container(
488-
color: const Color(0xD0FF0000),
489-
height: 100,
490-
),
491-
),
492-
],
493-
),
494-
),
495-
),
496-
);
497-
}
498-
499-
await tester.pumpWidget(buildFrame(Clip.none));
500-
501-
expect(find.text('Index 1'), findsOneWidget);
502-
expect(tester.getCenter(find.text('Index 1')).dy, 51.0);
503-
RenderClipRect renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
504-
// Currently not clipping
505-
expect(renderClip.clipBehavior, equals(Clip.none));
506-
507-
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.text('Index 1')));
508-
// Overscroll the start.
509-
await gesture.moveBy(const Offset(0.0, 200.0));
510-
await tester.pumpAndSettle();
511-
expect(find.text('Index 1'), findsOneWidget);
512-
expect(tester.getCenter(find.text('Index 1')).dy, greaterThan(0));
513-
renderClip = tester.allRenderObjects.whereType<RenderClipRect>().first;
514-
// Now clipping
515-
expect(renderClip.clipBehavior, equals(Clip.none));
516-
517-
await gesture.up();
518-
await tester.pumpAndSettle();
519-
});
520-
521457
testWidgets('Stretch limit', (WidgetTester tester) async {
522458
// Regression test for https://github.com/flutter/flutter/issues/99264
523459
await tester.pumpWidget(

0 commit comments

Comments
 (0)