diff --git a/packages/scrollable_positioned_list/CHANGELOG.md b/packages/scrollable_positioned_list/CHANGELOG.md index bf97fa5d..8c5fb689 100644 --- a/packages/scrollable_positioned_list/CHANGELOG.md +++ b/packages/scrollable_positioned_list/CHANGELOG.md @@ -1,3 +1,6 @@ +# 0.3.4 +* Disposed the animation controller when disposing the scrollable list. + # 0.3.3 * Fix potential crash when reading from RenderBox.size. 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 cbcac7ad..3b41baac 100644 --- a/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart +++ b/packages/scrollable_positioned_list/lib/src/scrollable_positioned_list.dart @@ -270,6 +270,8 @@ class _ScrollablePositionedListState extends State bool _isTransitioning = false; + var _animationController; + @override void initState() { super.initState(); @@ -297,6 +299,7 @@ class _ScrollablePositionedListState extends State .removeListener(_updatePositions); secondary.itemPositionsNotifier.itemPositions .removeListener(_updatePositions); + _animationController?.dispose(); super.dispose(); } @@ -484,7 +487,11 @@ class _ScrollablePositionedListState extends State startAnimationCallback = () { SchedulerBinding.instance.addPostFrameCallback((_) { startAnimationCallback = () {}; - + _animationController?.dispose(); + _animationController = + AnimationController(vsync: this, duration: duration)..forward(); + opacity.parent = _opacityAnimation(opacityAnimationWeights) + .animate(_animationController); opacity.parent = _opacityAnimation(opacityAnimationWeights).animate( AnimationController(vsync: this, duration: duration)..forward()); secondary.scrollController.jumpTo(-direction * @@ -527,17 +534,19 @@ class _ScrollablePositionedListState extends State } } - setState(() { - if (opacity.value >= 0.5) { - // Secondary [ListView] is more visible than the primary; make it the - // new primary. - var temp = primary; - primary = secondary; - secondary = temp; - } - _isTransitioning = false; - opacity.parent = const AlwaysStoppedAnimation(0); - }); + if (mounted) { + setState(() { + if (opacity.value >= 0.5) { + // Secondary [ListView] is more visible than the primary; make it the + // new primary. + var temp = primary; + primary = secondary; + secondary = temp; + } + _isTransitioning = false; + opacity.parent = const AlwaysStoppedAnimation(0); + }); + } } Animatable _opacityAnimation(List opacityAnimationWeights) { diff --git a/packages/scrollable_positioned_list/pubspec.yaml b/packages/scrollable_positioned_list/pubspec.yaml index cc6dc117..9d39f720 100644 --- a/packages/scrollable_positioned_list/pubspec.yaml +++ b/packages/scrollable_positioned_list/pubspec.yaml @@ -1,5 +1,5 @@ name: scrollable_positioned_list -version: 0.3.3 +version: 0.3.4 description: > A list with helper methods to programmatically scroll to an item. homepage: https://github.com/google/flutter.widgets/tree/master/packages/scrollable_positioned_list