diff --git a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart index 6e270f6d..ad62ca2c 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -275,7 +275,7 @@ class _ScrollablePositionedListState extends State @override void initState() { super.initState(); - ItemPosition? initialPosition = PageStorage.of(context)!.readState(context); + ItemPosition? initialPosition = PageStorage.of(context).readState(context); primary.target = initialPosition?.index ?? widget.initialScrollIndex; primary.alignment = initialPosition?.itemLeadingEdge ?? widget.initialAlignment; @@ -410,7 +410,10 @@ class _ScrollablePositionedListState extends State } double _cacheExtent(BoxConstraints constraints) => max( - constraints.maxHeight * _screenScrollCount, + (widget.scrollDirection == Axis.vertical + ? constraints.maxHeight + : constraints.maxWidth) * + _screenScrollCount, widget.minCacheExtent ?? 0, ); @@ -568,7 +571,7 @@ class _ScrollablePositionedListState extends State .where((ItemPosition position) => position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0); if (itemPositions.isNotEmpty) { - PageStorage.of(context)!.writeState( + PageStorage.of(context).writeState( context, itemPositions.reduce((value, element) => value.itemLeadingEdge < element.itemLeadingEdge diff --git a/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart b/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart index fb9f5c89..a5d7df1b 100644 --- a/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart +++ b/packages/scrollable_positioned_list/test/horizontal_scrollable_positioned_list_test.dart @@ -7,7 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:pedantic/pedantic.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; -const screenHeight = 400.0; +const screenHeight = 100.0; const screenWidth = 400.0; const itemWidth = screenWidth / 10.0; const itemCount = 500; @@ -45,6 +45,11 @@ void main() { ); } + final Finder fadeTransitionFinder = find.descendant( + of: find.byType(ScrollablePositionedList), + matching: find.byType(FadeTransition), + ); + testWidgets('List positioned with 0 at left', (WidgetTester tester) async { final itemPositionsListener = ItemPositionsListener.create(); await setUpWidgetTest(tester, itemPositionsListener: itemPositionsListener); @@ -171,7 +176,7 @@ void main() { await tester.pumpAndSettle(); expect(tester.getTopLeft(find.text('Item 100')).dx, 0); - expect(tester.getBottomRight(find.text('Item 109')).dy, screenWidth); + expect(tester.getBottomRight(find.text('Item 109')).dy, screenHeight); expect( itemPositionsListener.itemPositions.value @@ -195,6 +200,31 @@ void main() { 1); }); + testWidgets('Scroll to 20 without fading', (WidgetTester tester) async { + final itemScrollController = ItemScrollController(); + final itemPositionsListener = ItemPositionsListener.create(); + await setUpWidgetTest(tester, + itemScrollController: itemScrollController, + itemPositionsListener: itemPositionsListener); + + var fadeTransition = tester.widget(fadeTransitionFinder); + final initialOpacity = fadeTransition.opacity; + + unawaited( + itemScrollController.scrollTo(index: 20, duration: scrollDuration)); + await tester.pump(); + await tester.pump(); + await tester.pump(scrollDuration ~/ 2); + + fadeTransition = tester.widget(fadeTransitionFinder); + expect(fadeTransition.opacity, initialOpacity); + + await tester.pumpAndSettle(); + + expect(find.text('Item 14'), findsNothing); + expect(find.text('Item 20'), findsOneWidget); + }); + testWidgets('padding test - centered sliver at left', (WidgetTester tester) async { final itemScrollController = ItemScrollController();