Ползунок флаттера должен прокручиваться только при перетаскивании с помощью ползунка - PullRequest
0 голосов
/ 18 февраля 2020

В моих пользовательских виджетах есть несколько компонентов наряду с прокруткой страницы. Всякий раз, когда я случайно касаюсь рядом с ползунком, он распознает прикосновение и меняет положение на соответствующее положение. Мне нужно пользовательское поведение, чтобы ползунок изменялся только тогда, когда он перетаскивался с помощью панели большого пальца.

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

 GestureDetector(
        onHorizontalDragUpdate: (updateDetails) {
          print("On onHorizontalDragUpdate called");
          setState(() {
            _diffLevel = updateDetails.globalPosition.distance;
          });
        },
        onTap: (() {
          setState(() {
            _diffLevel = _diffLevel;
          });
          print("On Tap called");
        }),
        child: Slider.adaptive(
              value: _diffLevel.toDouble(),
              activeColor: MyColors.appMediumBlueColor(),
              //inactiveColor: Colors.purple,
              onChanged: (double newValue) {
                setState(() {
                  _diffLevel = newValue;
                });
              },
              min: widget.minLevel,
              max: widget.maxLevel,
              divisions: widget.divisions,
              label: _diffLevel.toString(),
            ),
      )

Ожидаемый результат:

Only Drag gesture should work

Фактический результат:

Tap gesture anywhere on slider bar reacts

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Если я правильно понимаю, вы ищете реализацию слайдера, которая позволяет только перетаскивание без прыжков. Это означает, что ползунок должен перемещаться только к близким значениям и не должен переходить к значениям, которые находятся дальше.

Это может быть легко обработано в неизмененном. Из своего кода вы сохраняете значение ползунка в глобальной переменной _diffLevel. Допустим, каждое ваше деление равно 50.

Итак, ваш onChanged может быть таким:

onChanged: (double newValue) {
                  setState(() {
                    double diff = (newValue - _diffLevel).abs();
                    if(diff<=50) {
                      _diffLevel = newValue;
                    }
                  });
                },

Это заставляет ползунок изменять свое значение только тогда, когда разница между его текущим значением и новым значение находится в диапазоне 50 ie. в диапазоне 50 вокруг текущего значения. Поэтому, когда вы нажимаете дальше, это не изменится. Он изменится только тогда, когда вы переместите его к следующему или предыдущему подразделению.

0 голосов
/ 18 февраля 2020

Я еще не проанализировал ваш код, но есть ли причина не использовать https://pub.dev/packages/flutter_range_slider?

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