如何在 Flutter MacOS 中为 ListView 禁用拖动滚动但保持鼠标滚轮滚动?

wid*_*ank 9 flutter

所以当我设置physics: const NeverScrollableScrollPhysics()on 时ListView.builder,它也会禁用鼠标滚轮滚动。有没有办法保持鼠标滚轮但禁用拖动?

谢谢

小智 8

感谢您的回答(@HasilT),它有帮助!我发现它PointerScrollEvent.scrollDelta已经“动画”了,您可以将它与ScrollController.jumpTo. 在我的代码中,我防止过度滚动minmax功能。

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);
    },
  ),
);
Run Code Online (Sandbox Code Playgroud)


Has*_*ilT 6

您可以使用Listener小部件来监视发生在您身上的拖动事件,ListViewListView使用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);
              }))
Run Code Online (Sandbox Code Playgroud)

这是一个工作演示的链接(您可能需要使用侦听器事件来使滚动完美,这只是一个示例)