这段代码使用了 GestureDetector 来监听水平方向的滑动事件,因此在上下滑动时也会触发。要避免上下滑动时切换,可以使用 GestureDetector 的 onVerticalDragStart、onVerticalDragUpdate、onVerticalDragEnd 等事件来监听垂直方向的滑动事件,并在这些事件中进行相应的处理。具体来说,在 onVerticalDragStart 事件中记录当前的位置,然后在 onVerticalDragUpdate 事件中计算滑动距离,如果超过一定阈值,则禁止切换。在 onVerticalDragEnd 事件中清除记录的位置信息即可。

改进后的代码如下:

bool _isVerticalDrag = false;
Offset _dragStartPos;

body: GestureDetector(
  onHorizontalDragEnd: (details) {
    if (!_isVerticalDrag) {
      if (details.velocity.pixelsPerSecond.dx < 0) {
        hItems(Global.calendar_current_day.add(Duration(days: 1)));
        _calendarAgendaControllerAppBar.goToDay(Global.calendar_current_day);
      } else if (details.velocity.pixelsPerSecond.dx > 0) {
        hItems(Global.calendar_current_day.subtract(Duration(days: 1)));
        _calendarAgendaControllerAppBar.goToDay(Global.calendar_current_day);
      }
    }
  },
  onVerticalDragStart: (details) {
    _isVerticalDrag = true;
    _dragStartPos = details.globalPosition;
  },
  onVerticalDragUpdate: (details) {
    if (_isVerticalDrag) {
      double dy = details.globalPosition.dy - _dragStartPos.dy;
      if (dy.abs() > 50) { // 阈值设为50
        _isVerticalDrag = false;
      }
    }
  },
  onVerticalDragEnd: (details) {
    _isVerticalDrag = false;
    _dragStartPos = null;
  },
  child: SideMenu(
    // ...
  ),
);
Flutter GestureDetector 上下滑动切换问题解决方法

原文地址: https://www.cveoy.top/t/topic/obTe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录