Update stretching overscroll clip behavior (#97678)
This commit is contained in:
parent
0eedf420f4
commit
38dae1bfc0
@ -785,10 +785,11 @@ class _StretchingOverscrollIndicatorState extends State<StretchingOverscrollIndi
|
||||
// Only clip if the viewport dimension is smaller than that of the
|
||||
// screen size in the main axis. If the viewport takes up the whole
|
||||
// screen, overflow from transforming the viewport is irrelevant.
|
||||
if (stretch != 0.0 && viewportDimension != mainAxisSize) {
|
||||
return ClipRect(child: transform);
|
||||
}
|
||||
return transform;
|
||||
return ClipRect(
|
||||
clipBehavior: stretch != 0.0 && viewportDimension != mainAxisSize
|
||||
? Clip.hardEdge : Clip.none,
|
||||
child: transform,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
|
@ -6,6 +6,7 @@
|
||||
// machines.
|
||||
@Tags(<String>['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: <Widget>[
|
||||
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<RenderClipRect>().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<RenderClipRect>().first;
|
||||
// Now clipping
|
||||
expect(renderClip.clipBehavior, equals(Clip.hardEdge));
|
||||
|
||||
await gesture.up();
|
||||
await tester.pumpAndSettle();
|
||||
});
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user