[英]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
一起使用。 在我的代碼中,我使用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);
},
),
);
您可以使用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);
}))
這是一個工作演示的鏈接(您可能必須使用偵聽器事件才能使滾動完美,這只是一個示例)
已為此案例創建功能請求: 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.