Skip to content

Commit 573dd42

Browse files
authored
[scrollable_positioned_list] Fix default cache extents for horizontal (#463)
* [scrollable_positioned_list] Fix default cache extents for horizontal lists. Closes #439 #453 * Remove unneeded import * Remove unneeded unwrap
1 parent 086b5ea commit 573dd42

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
275275
@override
276276
void initState() {
277277
super.initState();
278-
ItemPosition? initialPosition = PageStorage.of(context)!.readState(context);
278+
ItemPosition? initialPosition = PageStorage.of(context).readState(context);
279279
primary.target = initialPosition?.index ?? widget.initialScrollIndex;
280280
primary.alignment =
281281
initialPosition?.itemLeadingEdge ?? widget.initialAlignment;
@@ -410,7 +410,10 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
410410
}
411411

412412
double _cacheExtent(BoxConstraints constraints) => max(
413-
constraints.maxHeight * _screenScrollCount,
413+
(widget.scrollDirection == Axis.vertical
414+
? constraints.maxHeight
415+
: constraints.maxWidth) *
416+
_screenScrollCount,
414417
widget.minCacheExtent ?? 0,
415418
);
416419

@@ -568,7 +571,7 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
568571
.where((ItemPosition position) =>
569572
position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0);
570573
if (itemPositions.isNotEmpty) {
571-
PageStorage.of(context)!.writeState(
574+
PageStorage.of(context).writeState(
572575
context,
573576
itemPositions.reduce((value, element) =>
574577
value.itemLeadingEdge < element.itemLeadingEdge

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)