Как отключить прокрутку перетаскиванием, но продолжать прокрутку колеса мыши для ListView во Flutter MacOS? - PullRequest
0 голосов
/ 21 июня 2020

Итак, когда я устанавливаю physics: const NeverScrollableScrollPhysics() на ListView.builder, он также отключает прокрутку колеса мыши. Есть ли способ оставить колесо мыши, но отключить перетаскивание?

Спасибо

Ответы [ 2 ]

1 голос
/ 27 августа 2020

Спасибо за ответ (@HasilT), помогло! Я обнаружил, что PointerScrollEvent.scrollDelta уже "анимирован", и вы можете использовать его с ScrollController.jumpTo. В моем коде я предотвращаю чрезмерную прокрутку с помощью функций min и max.

import 'dart:math' as math;

Listener(
  onPointerSignal: (ps) {
    if (ps is PointerScrollEvent) {
      final newOffset = _controller.offset + ps.scrollDelta.dy;
      if (ps.scrollDelta.dy.isNegative) {
        _controller.jumpTo(math.max(0, newOffset));
      } else {
        _controller
            .jumpTo(math.min(_controller.position.maxScrollExtent, newOffset));
      }
    }
  },
  child: ListView.builder(
    itemCount: 100,
    controller: _controller,
    physics: NeverScrollableScrollPhysics(),
    itemBuilder: (BuildContext context, int index) {
      return Container(
          height: 100,
          margin: EdgeInsets.all(10),
          color: index.isEven ? Colors.blue : Colors.green);
    },
  ),
);
1 голос
/ 21 июня 2020

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

Здесь это пример кода:

Listener(
          onPointerSignal: (ps) {
            if (ps is PointerScrollEvent) {
              _controller.animateTo(ps.position.dy,
                  duration: Duration(milliseconds: 500),
                  curve: Curves.linear);
            }
          },
          child: ListView.builder(
              itemCount: 100,
              controller: _controller,
              physics: NeverScrollableScrollPhysics(),
              itemBuilder: (BuildContext context, int index) {
                return Container(
                    height: 100,
                    margin: EdgeInsets.all(10),
                    color: index.isEven ? Colors.blue : Colors.green);
              }))

А вот ссылка на рабочую демонстрацию (вам, возможно, придется поиграть с событиями слушателя, чтобы прокрутка была идеальной, это всего лишь пример )

...