diff --git a/lib/common/widgets/page/scrollable.dart b/lib/common/widgets/page/scrollable.dart index 95254c18..23ea2404 100644 --- a/lib/common/widgets/page/scrollable.dart +++ b/lib/common/widgets/page/scrollable.dart @@ -18,7 +18,6 @@ library; import 'dart:async'; import 'dart:math' as math; -import 'dart:math' show max; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; @@ -782,6 +781,7 @@ class CustomScrollableState extends State bool? _lastCanDrag; Axis? _lastAxisDirection; + late bool _isRTL = false; Offset? _downPos; bool? _isSliding; @@ -893,7 +893,12 @@ class CustomScrollableState extends State ScrollHoldController? _hold; void _handleDragDown(DragDownDetails details) { - if (details.localPosition.dx <= 30) { + final dx = details.localPosition.dx; + const offset = 30; + final isLTR = dx <= offset; + final isRTL = dx >= _maxWidth - offset; + if (isLTR || isRTL) { + _isRTL = isRTL; _downPos = details.localPosition; return; } @@ -915,19 +920,22 @@ class CustomScrollableState extends State _downPos = null; _isSliding = false; } + } else { + _downPos = null; + _isSliding = false; } } else if (_isSliding == true) { - if (localPosition.dx < 0) { - return; - } _animController.value = - max(0, (localPosition.dx - _downPos!.dx)) / _maxWidth; + (localPosition.dx - _downPos!.dx).abs() / _maxWidth; } } void _onDismiss() { if (_isSliding == true) { - if (_animController.value * _maxWidth + _downPos!.dx >= 100) { + final dx = _downPos!.dx; + if (_animController.value * _maxWidth + + (_isRTL ? (_maxWidth - dx) : dx) >= + 100) { Get.back(); } else { _animController.reverse(); @@ -1172,24 +1180,24 @@ class CustomScrollableState extends State ); } - return SlideTransition( - position: _anim, - child: Material( - color: widget.bgColor, - child: LayoutBuilder( - builder: (_, constrains) { - _maxWidth = constrains.maxWidth; - return widget.header != null + return LayoutBuilder( + builder: (context, constraints) { + _maxWidth = constraints.maxWidth; + return SlideTransition( + position: _anim, + child: Material( + color: widget.bgColor, + child: widget.header != null ? Column( children: [ widget.header!, Expanded(child: result), ], ) - : result; - }, - ), - ), + : result, + ), + ); + }, ); } diff --git a/lib/pages/common/slide/common_slide_page.dart b/lib/pages/common/slide/common_slide_page.dart index d379dcd9..77357d95 100644 --- a/lib/pages/common/slide/common_slide_page.dart +++ b/lib/pages/common/slide/common_slide_page.dart @@ -13,7 +13,7 @@ abstract class CommonSlidePageState extends State with TickerProviderStateMixin { Offset? downPos; bool? isSliding; - + late double maxWidth; late bool _isRTL = false; late final bool enableSlide; AnimationController? _animController; @@ -47,9 +47,14 @@ abstract class CommonSlidePageState extends State Widget build(BuildContext context) { final theme = Theme.of(context); return enableSlide - ? SlideTransition( - position: _anim!, - child: buildPage(theme), + ? LayoutBuilder( + builder: (context, constraints) { + maxWidth = constraints.maxWidth; + return SlideTransition( + position: _anim!, + child: buildPage(theme), + ); + }, ) : buildPage(theme); } @@ -58,66 +63,61 @@ abstract class CommonSlidePageState extends State Widget buildList(ThemeData theme) => throw UnimplementedError(); - Widget slideList(ThemeData theme) => LayoutBuilder( - builder: (_, constrains) { - final maxWidth = constrains.maxWidth; - - void onDismiss([_]) { - if (isSliding == true) { - final dx = downPos!.dx; - if (_animController!.value * maxWidth + - (_isRTL ? (maxWidth - dx) : dx) >= - 100) { - Get.back(); - } else { - _animController!.reverse(); - } - } - downPos = null; - isSliding = null; + void onDismiss([_]) { + if (isSliding == true) { + final dx = downPos!.dx; + if (_animController!.value * maxWidth + (_isRTL ? (maxWidth - dx) : dx) >= + 100) { + Get.back(); + } else { + _animController!.reverse(); } + } + downPos = null; + isSliding = null; + } - void onPan(PositionedGestureDetails details) { - final localPosition = details.localPosition; - if (isSliding == false) { - return; - } else if (isSliding == null) { - if (downPos != null) { - Offset cumulativeDelta = localPosition - downPos!; - if (cumulativeDelta.dx.abs() >= cumulativeDelta.dy.abs()) { - downPos = localPosition; - isSliding = true; - } else { - isSliding = false; - } - } else { - isSliding = false; - } - } else if (isSliding == true) { - _animController!.value = - (details.localPosition.dx - downPos!.dx).abs() / maxWidth; + void onPan(PositionedGestureDetails details) { + final localPosition = details.localPosition; + if (isSliding == false) { + return; + } else if (isSliding == null) { + if (downPos != null) { + Offset cumulativeDelta = localPosition - downPos!; + if (cumulativeDelta.dx.abs() >= cumulativeDelta.dy.abs()) { + downPos = localPosition; + isSliding = true; + } else { + isSliding = false; } + } else { + isSliding = false; } + } else if (isSliding == true) { + _animController!.value = + (details.localPosition.dx - downPos!.dx).abs() / maxWidth; + } + } - return GestureDetector( - onPanDown: (details) { - final dx = details.localPosition.dx; - const offset = 30; - final isLTR = dx <= offset; - final isRTL = dx >= maxWidth - offset; - if (isLTR || isRTL) { - _isRTL = isRTL; - downPos = details.localPosition; - } else { - isSliding = false; - } - }, - onPanStart: onPan, - onPanUpdate: onPan, - onPanCancel: onDismiss, - onPanEnd: onDismiss, - child: buildList(theme), - ); - }, + void onPanDown(DragDownDetails details) { + final dx = details.localPosition.dx; + const offset = 30; + final isLTR = dx <= offset; + final isRTL = dx >= maxWidth - offset; + if (isLTR || isRTL) { + _isRTL = isRTL; + downPos = details.localPosition; + } else { + isSliding = false; + } + } + + Widget slideList(ThemeData theme) => GestureDetector( + onPanDown: onPanDown, + onPanStart: onPan, + onPanUpdate: onPan, + onPanCancel: onDismiss, + onPanEnd: onDismiss, + child: buildList(theme), ); }