Как добавить новый обратный вызов для виджета Slider Material Flidter для доступа к активному / неактивному статусу касания? - PullRequest
1 голос
/ 15 мая 2019

Я использую материал Flutter slider.dart, и официальный виджет поддерживает обратные вызовы для onChanged, onChangeEnd и onChangeStart.Эти начальные и конечные обратные вызовы немного странны, хотя они запускаются при быстром нажатии ползунка, а также касании и скольжении ползунка, который все еще удерживается, и затем они запускаются снова, когда отпущен большой палец ползунка.Что мне действительно нужно знать, так это когда ПОЛНОСТЬЮ отпущен ползунок (от быстрого нажатия ИЛИ от прикосновения и скольжения).

Итак, я нашел способ отредактировать .../flutter/packages/flutter/lib/src/Material/slider.dart таким образом, чтобы выводить на консоль нужный мне статус.Я смотрю на все вызовы handleEvent и добавляю следующее, чтобы узнать, когда касание было вверх или вниз ( см. Изменение с помощью event.runtimeType ):

  @override
  void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
    if (event.runtimeType == PointerDownEvent) {
      _touchActive = true;
      print("---------Down!---------");
    } else if (event.runtimeType == PointerUpEvent) {
      _touchActive = false;
      print("---------Up!---------");
    }
    assert(debugHandleEvent(event, entry));
    if (event is PointerDownEvent && isInteractive) {
      // We need to add the drag first so that it has priority.
      _drag.addPointer(event);
      _tap.addPointer(event);
    }
  }

Но теперь мне нужно как-то получитьэти данные возвращаются из виджета с помощью обратного вызова.Обратный вызов может быть похож на любой из трех упомянутых ранее, таких как onChangeStart или onChangeEnd, но я не уверен, где все, что мне нужно обновить, чтобы создать это.Может кто-нибудь помочь указать мне, как это добавить?

1 Ответ

1 голос
/ 15 мая 2019

Вам необходимо добавить дополнительные члены класса Slider, аналогичные final ValueChanged<double> onChangeStart;, и добавить их в конструктор.

Когда вы хотите запустить новое событие, вы должны вызывать их, как: widget?.onChangeStart(_lerp(value)); (я добавил ? на случай, если ваш обратный вызов нулевой. Точно так же вы можете утверждать, что это не так: assert(widget.onChangeStart != null);)

В сторону - вместо event.runtimeType == PointerDownEvent вы можете использовать event is PointerDownEvent

...