Skip to content

Commit ba38a4d

Browse files
committed
Fixed an issue where scrollable positioned list was incompatible with Flutter 3.3.4
1 parent eb38a4d commit ba38a4d

File tree

1 file changed

+26
-58
lines changed

1 file changed

+26
-58
lines changed

packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart

Lines changed: 26 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -279,12 +279,8 @@ class ItemScrollController {
279279
/// This is an experimental API and is subject to change.
280280
/// Behavior may be ill-defined in some cases. Please file bugs.
281281
class ScrollOffsetController {
282-
Future<void> animateScroll(
283-
{required double offset,
284-
required Duration duration,
285-
Curve curve = Curves.linear}) async {
286-
final currentPosition =
287-
_scrollableListState!.primary.scrollController.offset;
282+
Future<void> animateScroll({required double offset, required Duration duration, Curve curve = Curves.linear}) async {
283+
final currentPosition = _scrollableListState!.primary.scrollController.offset;
288284
final newPosition = currentPosition + offset;
289285
await _scrollableListState!.primary.scrollController.animateTo(
290286
newPosition,
@@ -305,8 +301,7 @@ class ScrollOffsetController {
305301
}
306302
}
307303

308-
class _ScrollablePositionedListState extends State<ScrollablePositionedList>
309-
with TickerProviderStateMixin {
304+
class _ScrollablePositionedListState extends State<ScrollablePositionedList> with TickerProviderStateMixin {
310305
/// Details for the primary (active) [ListView].
311306
var primary = _ListDisplayDetails(const ValueKey('Ping'));
312307

@@ -327,10 +322,9 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
327322
@override
328323
void initState() {
329324
super.initState();
330-
ItemPosition? initialPosition = PageStorage.of(context).readState(context);
325+
ItemPosition? initialPosition = PageStorage.of(context)?.readState(context);
331326
primary.target = initialPosition?.index ?? widget.initialScrollIndex;
332-
primary.alignment =
333-
initialPosition?.itemLeadingEdge ?? widget.initialAlignment;
327+
primary.alignment = initialPosition?.itemLeadingEdge ?? widget.initialAlignment;
334328
if (widget.itemCount > 0 && primary.target > widget.itemCount - 1) {
335329
primary.target = widget.itemCount - 1;
336330
}
@@ -342,8 +336,7 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
342336
final currentOffset = primary.scrollController.offset;
343337
final offsetChange = currentOffset - previousOffset;
344338
previousOffset = currentOffset;
345-
if (!_isTransitioning |
346-
(widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) {
339+
if (!_isTransitioning | (widget.scrollOffsetNotifier?.recordProgrammaticScrolls ?? false)) {
347340
widget.scrollOffsetNotifier?.changeController.add(offsetChange);
348341
}
349342
});
@@ -365,10 +358,8 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
365358

366359
@override
367360
void dispose() {
368-
primary.itemPositionsNotifier.itemPositions
369-
.removeListener(_updatePositions);
370-
secondary.itemPositionsNotifier.itemPositions
371-
.removeListener(_updatePositions);
361+
primary.itemPositionsNotifier.itemPositions.removeListener(_updatePositions);
362+
secondary.itemPositionsNotifier.itemPositions.removeListener(_updatePositions);
372363
_animationController?.dispose();
373364
super.dispose();
374365
}
@@ -479,10 +470,7 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
479470
}
480471

481472
double _cacheExtent(BoxConstraints constraints) => max(
482-
(widget.scrollDirection == Axis.vertical
483-
? constraints.maxHeight
484-
: constraints.maxWidth) *
485-
_screenScrollCount,
473+
(widget.scrollDirection == Axis.vertical ? constraints.maxHeight : constraints.maxWidth) * _screenScrollCount,
486474
widget.minCacheExtent ?? 0,
487475
);
488476

@@ -542,43 +530,33 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
542530
}) async {
543531
final direction = index > primary.target ? 1 : -1;
544532
final itemPosition = primary.itemPositionsNotifier.itemPositions.value
545-
.firstWhereOrNull(
546-
(ItemPosition itemPosition) => itemPosition.index == index);
533+
.firstWhereOrNull((ItemPosition itemPosition) => itemPosition.index == index);
547534
if (itemPosition != null) {
548535
// Scroll directly.
549-
final localScrollAmount = itemPosition.itemLeadingEdge *
550-
primary.scrollController.position.viewportDimension;
536+
final localScrollAmount = itemPosition.itemLeadingEdge * primary.scrollController.position.viewportDimension;
551537
await primary.scrollController.animateTo(
552538
primary.scrollController.offset +
553539
localScrollAmount -
554540
alignment * primary.scrollController.position.viewportDimension,
555541
duration: duration,
556542
curve: curve);
557543
} else {
558-
final scrollAmount = _screenScrollCount *
559-
primary.scrollController.position.viewportDimension;
544+
final scrollAmount = _screenScrollCount * primary.scrollController.position.viewportDimension;
560545
final startCompleter = Completer<void>();
561546
final endCompleter = Completer<void>();
562547
startAnimationCallback = () {
563548
SchedulerBinding.instance.addPostFrameCallback((_) {
564549
startAnimationCallback = () {};
565550
_animationController?.dispose();
566-
_animationController =
567-
AnimationController(vsync: this, duration: duration)..forward();
568-
opacity.parent = _opacityAnimation(opacityAnimationWeights)
569-
.animate(_animationController);
551+
_animationController = AnimationController(vsync: this, duration: duration)..forward();
552+
opacity.parent = _opacityAnimation(opacityAnimationWeights).animate(_animationController);
570553
secondary.scrollController.jumpTo(-direction *
571-
(_screenScrollCount *
572-
primary.scrollController.position.viewportDimension -
573-
alignment *
574-
secondary.scrollController.position.viewportDimension));
575-
576-
startCompleter.complete(primary.scrollController.animateTo(
577-
primary.scrollController.offset + direction * scrollAmount,
578-
duration: duration,
579-
curve: curve));
580-
endCompleter.complete(secondary.scrollController
581-
.animateTo(0, duration: duration, curve: curve));
554+
(_screenScrollCount * primary.scrollController.position.viewportDimension -
555+
alignment * secondary.scrollController.position.viewportDimension));
556+
557+
startCompleter.complete(primary.scrollController
558+
.animateTo(primary.scrollController.offset + direction * scrollAmount, duration: duration, curve: curve));
559+
endCompleter.complete(secondary.scrollController.animateTo(0, duration: duration, curve: curve));
582560
});
583561
};
584562
setState(() {
@@ -626,29 +604,19 @@ class _ScrollablePositionedListState extends State<ScrollablePositionedList>
626604
final startOpacity = 0.0;
627605
final endOpacity = 1.0;
628606
return TweenSequence<double>(<TweenSequenceItem<double>>[
607+
TweenSequenceItem<double>(tween: ConstantTween<double>(startOpacity), weight: opacityAnimationWeights[0]),
629608
TweenSequenceItem<double>(
630-
tween: ConstantTween<double>(startOpacity),
631-
weight: opacityAnimationWeights[0]),
632-
TweenSequenceItem<double>(
633-
tween: Tween<double>(begin: startOpacity, end: endOpacity),
634-
weight: opacityAnimationWeights[1]),
635-
TweenSequenceItem<double>(
636-
tween: ConstantTween<double>(endOpacity),
637-
weight: opacityAnimationWeights[2]),
609+
tween: Tween<double>(begin: startOpacity, end: endOpacity), weight: opacityAnimationWeights[1]),
610+
TweenSequenceItem<double>(tween: ConstantTween<double>(endOpacity), weight: opacityAnimationWeights[2]),
638611
]);
639612
}
640613

641614
void _updatePositions() {
642615
final itemPositions = primary.itemPositionsNotifier.itemPositions.value
643-
.where((ItemPosition position) =>
644-
position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0);
616+
.where((ItemPosition position) => position.itemLeadingEdge < 1 && position.itemTrailingEdge > 0);
645617
if (itemPositions.isNotEmpty) {
646-
PageStorage.of(context).writeState(
647-
context,
648-
itemPositions.reduce((value, element) =>
649-
value.itemLeadingEdge < element.itemLeadingEdge
650-
? value
651-
: element));
618+
PageStorage.of(context)?.writeState(context,
619+
itemPositions.reduce((value, element) => value.itemLeadingEdge < element.itemLeadingEdge ? value : element));
652620
}
653621
widget.itemPositionsNotifier?.itemPositions.value = itemPositions;
654622
}

0 commit comments

Comments
 (0)