Don't show scrollbar if there isn't enough content (#34175)
This commit is contained in:
parent
3ae6abd9e8
commit
5f39487740
@ -103,6 +103,11 @@ class _CupertinoScrollbarState extends State<CupertinoScrollbar> with TickerProv
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _handleScrollNotification(ScrollNotification notification) {
|
bool _handleScrollNotification(ScrollNotification notification) {
|
||||||
|
final ScrollMetrics metrics = notification.metrics;
|
||||||
|
if (metrics.maxScrollExtent <= metrics.minScrollExtent) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (notification is ScrollUpdateNotification ||
|
if (notification is ScrollUpdateNotification ||
|
||||||
notification is OverscrollNotification) {
|
notification is OverscrollNotification) {
|
||||||
// Any movements always makes the scrollbar start showing up.
|
// Any movements always makes the scrollbar start showing up.
|
||||||
|
@ -109,6 +109,11 @@ class _ScrollbarState extends State<Scrollbar> with TickerProviderStateMixin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool _handleScrollNotification(ScrollNotification notification) {
|
bool _handleScrollNotification(ScrollNotification notification) {
|
||||||
|
final ScrollMetrics metrics = notification.metrics;
|
||||||
|
if (metrics.maxScrollExtent <= metrics.minScrollExtent) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// iOS sub-delegates to the CupertinoScrollbar instead and doesn't handle
|
// iOS sub-delegates to the CupertinoScrollbar instead and doesn't handle
|
||||||
// scroll notifications here.
|
// scroll notifications here.
|
||||||
if (_currentPlatform != TargetPlatform.iOS
|
if (_currentPlatform != TargetPlatform.iOS
|
||||||
|
@ -77,7 +77,7 @@ void main() {
|
|||||||
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
|
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
|
||||||
await gesture.moveBy(_kGestureOffset);
|
await gesture.moveBy(_kGestureOffset);
|
||||||
// Move back to original position.
|
// Move back to original position.
|
||||||
await gesture.moveBy(Offset.zero.translate(-_kGestureOffset.dx, -_kGestureOffset.dy));
|
await gesture.moveBy(Offset(-_kGestureOffset.dx, -_kGestureOffset.dy));
|
||||||
await tester.pump();
|
await tester.pump();
|
||||||
await tester.pump(const Duration(milliseconds: 500));
|
await tester.pump(const Duration(milliseconds: 500));
|
||||||
|
|
||||||
@ -96,4 +96,44 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets("should not paint when there isn't enough space", (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(
|
||||||
|
CupertinoApp(
|
||||||
|
home: MediaQuery(
|
||||||
|
data: const MediaQueryData(
|
||||||
|
padding: EdgeInsets.fromLTRB(0, 20, 0, 34),
|
||||||
|
),
|
||||||
|
child: CupertinoPageScaffold(
|
||||||
|
navigationBar: const CupertinoNavigationBar(
|
||||||
|
middle: Text('Title'),
|
||||||
|
backgroundColor: Color(0x11111111),
|
||||||
|
),
|
||||||
|
child: CupertinoScrollbar(
|
||||||
|
child: ListView(
|
||||||
|
physics: const AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()),
|
||||||
|
children: const <Widget> [SizedBox(width: 10, height: 10)],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
|
||||||
|
await gesture.moveBy(_kGestureOffset);
|
||||||
|
// Move back to original position.
|
||||||
|
await gesture.moveBy(Offset(-_kGestureOffset.dx, -_kGestureOffset.dy));
|
||||||
|
await tester.pump();
|
||||||
|
await tester.pump(const Duration(milliseconds: 500));
|
||||||
|
|
||||||
|
expect(find.byType(CupertinoScrollbar), isNot(paints..rrect()));
|
||||||
|
|
||||||
|
// The scrollbar should not appear even when overscrolled.
|
||||||
|
final TestGesture overscrollGesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
|
||||||
|
await overscrollGesture.moveBy(_kGestureOffset);
|
||||||
|
|
||||||
|
await tester.pump();
|
||||||
|
await tester.pump(const Duration(milliseconds: 500));
|
||||||
|
expect(find.byType(CupertinoScrollbar), isNot(paints..rrect()));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -77,4 +77,32 @@ void main() {
|
|||||||
),
|
),
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testWidgets("should not paint when there isn't enough space", (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(MaterialApp(
|
||||||
|
home: MediaQuery(
|
||||||
|
data: const MediaQueryData(
|
||||||
|
padding: EdgeInsets.fromLTRB(0, 20, 0, 34)
|
||||||
|
),
|
||||||
|
child: Scaffold(
|
||||||
|
appBar: AppBar(title: const Text('Title')),
|
||||||
|
body: Scrollbar(
|
||||||
|
child: ListView(
|
||||||
|
children: const <Widget>[SizedBox(width: 40, height: 40)]
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
|
final TestGesture gesture = await tester.startGesture(tester.getCenter(find.byType(ListView)));
|
||||||
|
// On Android it should not overscroll.
|
||||||
|
await gesture.moveBy(const Offset(0, 100));
|
||||||
|
// Trigger fade in animation.
|
||||||
|
await tester.pump();
|
||||||
|
await tester.pump(const Duration(milliseconds: 500));
|
||||||
|
|
||||||
|
expect(find.byType(Scrollbar), isNot(paints..rect()));
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -115,8 +115,9 @@ void main() {
|
|||||||
final List<Invocation> invocations = <Invocation>[];
|
final List<Invocation> invocations = <Invocation>[];
|
||||||
final TestCanvas canvas = TestCanvas(invocations);
|
final TestCanvas canvas = TestCanvas(invocations);
|
||||||
scrollPainter.paint(canvas, const Size(10.0, 100.0));
|
scrollPainter.paint(canvas, const Size(10.0, 100.0));
|
||||||
final Rect thumbRect = invocations.single.positionalArguments[0];
|
|
||||||
expect(thumbRect.isFinite, isTrue);
|
// Scrollbar is not supposed to draw anything if there isn't enough content.
|
||||||
|
expect(invocations.isEmpty, isTrue);
|
||||||
});
|
});
|
||||||
|
|
||||||
testWidgets('Adaptive scrollbar', (WidgetTester tester) async {
|
testWidgets('Adaptive scrollbar', (WidgetTester tester) async {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user