diff --git a/lib/sliding_up_panel_widget.dart b/lib/sliding_up_panel_widget.dart index 8a9f40c..204f33d 100644 --- a/lib/sliding_up_panel_widget.dart +++ b/lib/sliding_up_panel_widget.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; /// On panel status changed -typedef OnSlidingUpPanelStatusChanged = void Function( - SlidingUpPanelStatus status); +typedef OnSlidingUpPanelStatusChanged = void Function(SlidingUpPanelStatus status); /// On drag down when user drag down this panel typedef OnSlidingUpPanelDragDown = void Function(DragDownDetails details); @@ -140,16 +139,13 @@ class SlidingUpPanelWidget extends StatefulWidget { } } -class _SlidingUpPanelWidgetState extends State - with SingleTickerProviderStateMixin { +class _SlidingUpPanelWidgetState extends State with SingleTickerProviderStateMixin { late Animation animation; - final GlobalKey _childKey = - GlobalKey(debugLabel: 'SlidingUpPanelWidget child'); + final GlobalKey _childKey = GlobalKey(debugLabel: 'SlidingUpPanelWidget child'); double? get _childHeight { - RenderBox renderBox = - _childKey.currentContext!.findRenderObject()! as RenderBox; + RenderBox renderBox = _childKey.currentContext!.findRenderObject()! as RenderBox; return renderBox.size.height; } @@ -163,16 +159,12 @@ class _SlidingUpPanelWidgetState extends State void initState() { widget.panelController.addListener(handlePanelStatusChanged); if (widget.animationController == null) { - _animationController = - SlidingUpPanelWidget.createAnimationController(this); + _animationController = SlidingUpPanelWidget.createAnimationController(this); } else { _animationController = widget.animationController!; } animation = _animationController.drive( - Tween( - begin: Offset(0.0, widget.upperBound), - end: Offset(0.0, widget.minimumBound)) - .chain( + Tween(begin: Offset(0.0, widget.upperBound), end: Offset(0.0, widget.minimumBound)).chain( CurveTween( curve: Curves.linear, ), @@ -188,12 +180,19 @@ class _SlidingUpPanelWidgetState extends State WidgetsBinding.instance.addPostFrameCallback((_) => _initData(context)); } + @override + void didUpdateWidget(SlidingUpPanelWidget oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.panelController != widget.panelController) { + oldWidget.panelController.removeListener(handlePanelStatusChanged); + widget.panelController.addListener(handlePanelStatusChanged); + } + } + /// ReCalculate collapse fraction void reCalculateCollapseFraction() { - if (widget.controlHeight / MediaQuery.of(context).size.height > - widget.minimumBound) { - collapseFraction = - widget.controlHeight / MediaQuery.of(context).size.height; + if (widget.controlHeight / MediaQuery.of(context).size.height > widget.minimumBound) { + collapseFraction = widget.controlHeight / MediaQuery.of(context).size.height; } else { collapseFraction = widget.minimumBound; } @@ -273,14 +272,11 @@ class _SlidingUpPanelWidgetState extends State onTap: widget.enableOnTap ? (widget.onTap ?? () { - if (SlidingUpPanelStatus.anchored == - widget.panelController.status) { + if (SlidingUpPanelStatus.anchored == widget.panelController.status) { collapse(); - } else if (SlidingUpPanelStatus.collapsed == - widget.panelController.status) { + } else if (SlidingUpPanelStatus.collapsed == widget.panelController.status) { anchor(); - } else if (SlidingUpPanelStatus.expanded == - widget.panelController.status) { + } else if (SlidingUpPanelStatus.expanded == widget.panelController.status) { collapse(); } else { collapse(); @@ -307,8 +303,7 @@ class _SlidingUpPanelWidgetState extends State ///Handle method when user drag the panel void _handleDragUpdate(DragUpdateDetails details) { - _animationController.value -= - details.primaryDelta! / (_childHeight ?? details.primaryDelta!); + _animationController.value -= details.primaryDelta! / (_childHeight ?? details.primaryDelta!); widget.panelController.value = SlidingUpPanelStatus.dragging; widget.onStatusChanged?.call(widget.panelController.status); widget.dragUpdate?.call(details); @@ -319,8 +314,7 @@ class _SlidingUpPanelWidgetState extends State if (details.velocity.pixelsPerSecond.dy < -_kMinFlingVelocity) { if (SlidingUpPanelStatus.collapsed == widget.panelController.status) { anchor(); - } else if ((SlidingUpPanelStatus.anchored == - widget.panelController.status)) { + } else if ((SlidingUpPanelStatus.anchored == widget.panelController.status)) { expand(); } else { expand(); @@ -328,19 +322,16 @@ class _SlidingUpPanelWidgetState extends State } else if (details.velocity.pixelsPerSecond.dy > _kMinFlingVelocity) { if (SlidingUpPanelStatus.expanded == widget.panelController.status) { anchor(); - } else if ((SlidingUpPanelStatus.anchored == - widget.panelController.status)) { + } else if ((SlidingUpPanelStatus.anchored == widget.panelController.status)) { collapse(); } else { collapse(); } } else if (_animationController.value < _kCloseProgressThreshold) { collapse(); - } else if ((_animationController.value >= - (anchorFraction + widget.upperBound) / 2)) { + } else if ((_animationController.value >= (anchorFraction + widget.upperBound) / 2)) { expand(); - } else if (_animationController.value >= _kCloseProgressThreshold && - _animationController.value < (anchorFraction + widget.upperBound) / 2) { + } else if (_animationController.value >= _kCloseProgressThreshold && _animationController.value < (anchorFraction + widget.upperBound) / 2) { anchor(); } else { collapse(); @@ -351,32 +342,28 @@ class _SlidingUpPanelWidgetState extends State ///Collapse the panel void collapse() { reCalculateCollapseFraction(); - _animationController.animateTo(collapseFraction, - curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); + _animationController.animateTo(collapseFraction, curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); widget.panelController.value = SlidingUpPanelStatus.collapsed; widget.onStatusChanged?.call(widget.panelController.status); } ///Expand the panel void expand() { - _animationController.animateTo(widget.upperBound, - curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); + _animationController.animateTo(widget.upperBound, curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); widget.panelController.value = SlidingUpPanelStatus.expanded; widget.onStatusChanged?.call(widget.panelController.status); } ///Anchor the panel void anchor() { - _animationController.animateTo(anchorFraction, - curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); + _animationController.animateTo(anchorFraction, curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); widget.panelController.value = SlidingUpPanelStatus.anchored; widget.onStatusChanged?.call(widget.panelController.status); } ///Hide the panel void hide() { - _animationController.animateTo(0, - curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); + _animationController.animateTo(0, curve: Curves.linearToEaseOut, duration: _kSlidingUpPanelDuration); widget.panelController.value = SlidingUpPanelStatus.hidden; widget.onStatusChanged?.call(widget.panelController.status); } @@ -414,8 +401,7 @@ class _SlidingUpPanelWidgetState extends State ///The controller of SlidingUpPanelWidget class SlidingUpPanelController extends ValueNotifier { - SlidingUpPanelController({SlidingUpPanelStatus? value}) - : super(value != null ? value : SlidingUpPanelStatus.collapsed); + SlidingUpPanelController({SlidingUpPanelStatus? value}) : super(value != null ? value : SlidingUpPanelStatus.collapsed); SlidingUpPanelStatus get status => value;