簡體   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