Skip to content

Commit e7ca932

Browse files
committed
[scrollable_positioned_list] Fix default cache extents for horizontal lists.
Closes google#439 google#453
1 parent 086b5ea commit e7ca932

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:async';
66
import 'dart:math';
77

88
import 'package:collection/collection.dart' show IterableExtension;
9+
import 'package:flutter/rendering.dart';
910
import 'package:flutter/scheduler.dart';
1011
import 'package:flutter/widgets.dart';
1112

@@ -410,7 +411,10 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
410411
}
411412

412413
double _cacheExtent(BoxConstraints constraints) => max(
413-
constraints.maxHeight * _screenScrollCount,
414+
(widget.scrollDirection == Axis.vertical
415+
? constraints.maxHeight
416+
: constraints.maxWidth) *
417+
_screenScrollCount,
414418
widget.minCacheExtent ?? 0,
415419
);
416420

packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:flutter_test/flutter_test.dart';
77
import 'package:pedantic/pedantic.dart';
88
import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
99

10-
const screenHeight = 400.0;
10+
const screenHeight = 100.0;
1111
const screenWidth = 400.0;
1212
const itemWidth = screenWidth / 10.0;
1313
const itemCount = 500;
@@ -45,6 +45,11 @@ void main() {
4545
);
4646
}
4747

48+
final Finder fadeTransitionFinder = find.descendant(
49+
of: find.byType(ScrollablePositionedList),
50+
matching: find.byType(FadeTransition),
51+
);
52+
4853
testWidgets('List positioned with 0 at left', (WidgetTester tester) async {
4954
final itemPositionsListener = ItemPositionsListener.create();
5055
await setUpWidgetTest(tester, itemPositionsListener: itemPositionsListener);
@@ -171,7 +176,7 @@ void main() {
171176
await tester.pumpAndSettle();
172177

173178
expect(tester.getTopLeft(find.text('Item 100')).dx, 0);
174-
expect(tester.getBottomRight(find.text('Item 109')).dy, screenWidth);
179+
expect(tester.getBottomRight(find.text('Item 109')).dy, screenHeight);
175180

176181
expect(
177182
itemPositionsListener.itemPositions.value
@@ -195,6 +200,31 @@ void main() {
195200
1);
196201
});
197202

203+
testWidgets('Scroll to 20 without fading', (WidgetTester tester) async {
204+
final itemScrollController = ItemScrollController();
205+
final itemPositionsListener = ItemPositionsListener.create();
206+
await setUpWidgetTest(tester,
207+
itemScrollController: itemScrollController,
208+
itemPositionsListener: itemPositionsListener);
209+
210+
var fadeTransition = tester.widget<FadeTransition>(fadeTransitionFinder);
211+
final initialOpacity = fadeTransition.opacity;
212+
213+
unawaited(
214+
itemScrollController.scrollTo(index: 20, duration: scrollDuration));
215+
await tester.pump();
216+
await tester.pump();
217+
await tester.pump(scrollDuration ~/ 2);
218+
219+
fadeTransition = tester.widget<FadeTransition>(fadeTransitionFinder);
220+
expect(fadeTransition.opacity, initialOpacity);
221+
222+
await tester.pumpAndSettle();
223+
224+
expect(find.text('Item 14'), findsNothing);
225+
expect(find.text('Item 20'), findsOneWidget);
226+
});
227+
198228
testWidgets('padding test - centered sliver at left',
199229
(WidgetTester tester) async {
200230
final itemScrollController = ItemScrollController();

0 commit comments

Comments
 (0)