Как заблокировать прокрутку страницы при перемещении слайдера - PullRequest
0 голосов
/ 09 октября 2019

Во Flutter у меня есть приложение с пользовательским ползунком внутри пользовательского виджета ListView. Единственная проблема заключается в том, что когда вы перемещаете ручку ползунка (слева направо), страница все равно будет прокручиваться (вверх и вниз) из-за ListView, тогда как мне нужно, чтобы страница заблокировалась на месте, пока пользователь не перестанет перемещать ползунок.

Я начал с просмотра кода слайдера приложения материала, но не смог найти ничего, что могло бы помочь. Я также поэкспериментировал со слайдером, и он пытается добиться эффекта, который говорит мне, что проблема заключается в моем собственном слайдере. *

Я использую Слушатель в виджете слайдера для обнаружения жестов, поэтому я предполагаю, что где-то там пропущено несколько строк? Любая помощь будет приветствоваться, ура.

Обновление: * Я также пытался изменить поведение слушателя, но это, похоже, не решило проблему.

Вот слайдер внутриListView - Примечание: у слайдера может быть несколько дескрипторов (следовательно, поэтому он является пользовательским), но в этом случае просто показывает один дескриптор, чтобы избежать путаницы.

@override
  Widget build(BuildContext context) {
    return ListView(children: <Widget>[
    Center(
     child: StagedSlider.single(
      value: point,
      //A function which changes the handle value
      onChanged: setHandleInfo,
     ),
    ),
...

Вот слушатель внутри слайдера:

return Listener(
      behavior: HitTestBehavior.translucent,
      //The following return functions to calculate handle
      //position/progress...
      onPointerDown: someFunction(),
      onPointerMove: someFunction(),
      onPointerUp: someFunction(),
      //Child is a stack of handles/thumbs calculated higher up
      child: handles,
      ),
    );

В качестве примера: если вы перемещаете ручку ползунка в вертикальном движении вверх, ручка будет двигаться по горизонтальной оси, а вся страница будет двигаться вниз по вертикали. С другой стороны, Material App Slider не делает этого, и в этом случае он будет только перемещать ручку.

Update2: Таким образом, быстрое решение этой проблемы - просто использовать детектор жестов вместо слушателя. Я попробовал это, и все проблемы, казалось, были решены. Тем не менее, из-за другой не связанной с этим проблемы, которая возникла у меня ранее, если бы у кого-то было решение с использованием Слушателя, это было бы замечательно.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Итак, после нескольких дней работы я взломал двух зайцев одним выстрелом и нашел решение, которое решает и этот, и мой предыдущий пост здесь

Просто хотел оставить ответ, если кто-нибудьеще сталкивается с этим и имеет аналогичные проблемы.

Я в основном использовал RawGestureDetector ниже:

class _MyGestureDetector extends OneSequenceGestureRecognizer {
  final Function onHorizontalDragDown;
  final Function onHorizontalDragUpdate;
  final Function onHorizontalDragUp;

  _SingleDeviceGestureDetector({
    @required this.onHorizontalDragDown,
    @required this.onHorizontalDragUpdate,
    @required this.onHorizontalDragUp,
  });

  @override
  void addPointer(PointerEvent event) {
    //Returns true or false depending on whether there
    //is a pointer on screen already
    if (onHorizontalDragDown(event)) {
      startTrackingPointer(event.pointer);
      resolve(GestureDisposition.accepted);
    } else {
      stopTrackingPointer(event.pointer);
    }
  }

  @override
  void handleEvent(PointerEvent event) {
    //If the pointer is being dragged
    if (event is PointerMoveEvent) {
      //Sends the position of the drag
      onHorizontalDragUpdate(event.position);
    }
    //If the pointer is being lifted
    else if (event is PointerUpEvent) {
      onHorizontalDragUp(event);
      stopTrackingPointer(event.pointer);
    }
  }

  @override
  String get debugDescription => 'singlePointerDrag';

  @override
  void didStopTrackingLastPointer(int pointer) {}
}
0 голосов
/ 09 октября 2019

Если я правильно понял, вы можете использовать метод onChangeEnd ползунка, чтобы обновить позицию ListView, и метод onChange ползунка, чтобы обновить позицию ползунка

Тот же подход можно сделатьиспользуя Listener, используя метод onPointerUp для обновления позиции ListView и метод onPointerMove для обновления позиции Slider

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...