-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
1,001 additions
and
48 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
part of panels; | ||
|
||
class PanelController extends ChangeNotifier { | ||
SlidingUpPanelState? _panelState; | ||
|
||
void _addState(SlidingUpPanelState panelState) { | ||
_panelState = panelState; | ||
notifyListeners(); | ||
} | ||
|
||
bool _forceScrollChange = false; | ||
|
||
/// use this function when scroll change in func | ||
/// Example: | ||
/// panelController.forseScrollChange(scrollController.animateTo(100, duration: Duration(milliseconds: 400), curve: Curves.ease)) | ||
Future<void> forceScrollChange(Future func) async { | ||
_forceScrollChange = true; | ||
_panelState!._scrollingEnabled = true; | ||
await func; | ||
// if (_panelState!._sc.offset == 0) { | ||
// _panelState!._scrollingEnabled = true; | ||
// } | ||
if (panelPosition < 1) { | ||
_panelState!._scMinOffset = _panelState!._scrollController.offset; | ||
} | ||
_forceScrollChange = false; | ||
} | ||
|
||
bool __nowTargetForceDraggable = false; | ||
|
||
bool get _nowTargetForceDraggable => __nowTargetForceDraggable; | ||
|
||
set _nowTargetForceDraggable(bool value) { | ||
__nowTargetForceDraggable = value; | ||
notifyListeners(); | ||
} | ||
|
||
/// Determine if the panelController is attached to an instance | ||
/// of the SlidingUpPanel (this property must return true before any other | ||
/// functions can be used) | ||
bool get isAttached => _panelState != null; | ||
|
||
/// Closes the sliding panel to its collapsed state (i.e. to the minHeight) | ||
Future<void> close() { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._close(); | ||
} | ||
|
||
/// Opens the sliding panel fully | ||
/// (i.e. to the maxHeight) | ||
Future<void> open() { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._open(); | ||
} | ||
|
||
/// Hides the sliding panel (i.e. is invisible) | ||
Future<void> hide() { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._hide(); | ||
} | ||
|
||
/// Shows the sliding panel in its collapsed state | ||
/// (i.e. "un-hide" the sliding panel) | ||
Future<void> show() { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._show(); | ||
} | ||
|
||
/// Animates the panel position to the value. | ||
/// The value must between 0.0 and 1.0 | ||
/// where 0.0 is fully collapsed and 1.0 is completely open. | ||
/// (optional) duration specifies the time for the animation to complete | ||
/// (optional) curve specifies the easing behavior of the animation. | ||
Future<void> animatePanelToPosition(double value, | ||
{Duration? duration, Curve curve = Curves.linear}) { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
assert(0.0 <= value && value <= 1.0); | ||
return _panelState! | ||
._animatePanelToPosition(value, duration: duration, curve: curve); | ||
} | ||
|
||
/// Animates the panel position to the snap point | ||
/// Requires that the SlidingUpPanel snapPoint property is not null | ||
/// (optional) duration specifies the time for the animation to complete | ||
/// (optional) curve specifies the easing behavior of the animation. | ||
Future<void> animatePanelToSnapPoint( | ||
{Duration? duration, Curve curve = Curves.linear}) { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
assert(_panelState!.widget.snapPoint != null, | ||
"SlidingUpPanel snapPoint property must not be null"); | ||
return _panelState! | ||
._animatePanelToSnapPoint(duration: duration, curve: curve); | ||
} | ||
|
||
/// Sets the panel position (without animation). | ||
/// The value must between 0.0 and 1.0 | ||
/// where 0.0 is fully collapsed and 1.0 is completely open. | ||
set panelPosition(double value) { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
assert(0.0 <= value && value <= 1.0); | ||
_panelState!._panelPosition = value; | ||
} | ||
|
||
/// Gets the current panel position. | ||
/// Returns the % offset from collapsed state | ||
/// to the open state | ||
/// as a decimal between 0.0 and 1.0 | ||
/// where 0.0 is fully collapsed and | ||
/// 1.0 is full open. | ||
double get panelPosition { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._panelPosition; | ||
} | ||
|
||
/// Returns whether or not the panel is | ||
/// currently animating. | ||
bool get isPanelAnimating { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._isPanelAnimating; | ||
} | ||
|
||
/// Returns whether or not the | ||
/// panel is open. | ||
bool get isPanelOpen { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._isPanelOpen; | ||
} | ||
|
||
/// Returns whether or not the | ||
/// panel is closed. | ||
bool get isPanelClosed { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._isPanelClosed; | ||
} | ||
|
||
/// Returns whether or not the | ||
/// panel is shown/hidden. | ||
bool get isPanelShown { | ||
assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); | ||
return _panelState!._isPanelShown; | ||
} | ||
} |
Oops, something went wrong.