繁体   English   中英

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

[英]How to disable drag scrolling but keep mouse wheel scrolling for ListView in Flutter MacOS?

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

谢谢

感谢您的回答(@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);
    },
  ),
);

您可以使用Listener小部件来监视ListView上发生的拖动事件,并使用附加到该ListViewScrollController手动将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);
              }))

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

已为此案例创建功能请求: https://github.com/flutter/flutter/issues/71322

只需包装一个小部件@truthmast 的解决方案

import 'dart:math' as math;

import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:responsive_builder/responsive_builder.dart';

class DragPreventingSingleChildScrollView extends StatelessWidget {
  final _controller = ScrollController();
  final Widget child;

  DragPreventingSingleChildScrollView({Key key, this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) => ResponsiveBuilder(
        builder: (c, si) => !si.isDesktop
            ? SingleChildScrollView(child: child)
            : 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: SingleChildScrollView(
                  controller: _controller,
                  physics: NeverScrollableScrollPhysics(),
                  child: child,
                ),
              ),
      );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM