默认拖动滚动设备
摘要
#ScrollBehavior
现在允许或禁止来自指定 PointerDeviceKind
的拖动滚动。ScrollBehavior.dragDevices
默认情况下允许所有 PointerDeviceKind
(除 PointerDeviceKind.mouse
外)拖动可滚动小部件。
背景
#在此更改之前,所有 PointerDeviceKind
都可以拖动 Scrollable
小部件。这与使用鼠标输入设备与 Flutter 应用程序交互时的开发者预期不符。这也使得执行其他鼠标手势(例如选择包含在 Scrollable
小部件中的文本)变得困难。
现在,继承的 ScrollBehavior
根据 ScrollBehavior.dragDevices
指定的内容管理哪些设备可以拖动可滚动小部件。这组 PointerDeviceKind
允许拖动。
更改说明
#此更改修复了意外地能够通过鼠标拖动来滚动的功能。
如果您在应用程序中依赖于之前的行为,则有几种方法可以控制和配置此功能。
扩展
ScrollBehavior
、MaterialScrollBehavior
或CupertinoScrollBehavior
以修改默认行为,覆盖ScrollBehavior.dragDevices
。- 使用您自己的
ScrollBehavior
,您可以通过设置MaterialApp.scrollBehavior
或CupertinoApp.scrollBehavior
来将其应用于整个应用程序。 - 或者,如果您只想将其应用于特定小部件,请在相关小部件上方添加一个
ScrollConfiguration
,并使用您自定义的ScrollBehavior
。
- 使用您自己的
然后,您的可滚动小部件将继承并反映此行为。
- 除了创建您自己的
ScrollBehavior
之外,更改默认行为的另一种方法是复制现有的ScrollBehavior
,并设置不同的dragDevices
。- 在您的窗口小部件树中创建一个
ScrollConfiguration
,并使用copyWith
在当前上下文中提供修改后的现有ScrollBehavior
副本。
- 在您的窗口小部件树中创建一个
为了适应 ScrollBehavior
中拖动设备的新配置,GestureDetector.kind
已被弃用,以及该参数的所有子类实例。Flutter 提供了一个修复程序,可以将所有手势检测器的现有代码从 kind
迁移到 supportedDevices
。以前的参数 kind
只允许使用一个 PointerDeviceKind
来过滤手势。supportedDevices
的引入使得多个有效的 PointerDeviceKind
成为可能。
迁移指南
#为您的应用程序设置自定义 ScrollBehavior
#迁移前的代码:
MaterialApp(
// ...
);
迁移后的代码:
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// 覆盖行为方法和 getter,例如 dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// 为整个应用程序设置 ScrollBehavior。
MaterialApp(
scrollBehavior: MyCustomScrollBehavior(),
// ...
);
为特定小部件设置自定义 ScrollBehavior
#迁移前的代码:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
迁移后的代码:
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// 覆盖行为方法和 getter,例如 dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// 可以为特定小部件设置 ScrollBehavior。
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: MyCustomScrollBehavior(),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
复制和修改现有 ScrollBehavior
#迁移前的代码:
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
迁移后的代码:
// 可以复制和调整 ScrollBehavior。
final ScrollController controller = ScrollController();
ScrollConfiguration(
behavior: ScrollConfiguration.of(context).copyWith(dragDevices: {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
}),
child: ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
),
);
将 GestureDetector
从 kind
迁移到 supportedDevices
#迁移前的代码:
VerticalDragGestureRecognizer(
kind: PointerDeviceKind.touch,
);
迁移后的代码:
VerticalDragGestureRecognizer(
supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);
时间线
#包含在版本中:2.3.0-12.0.pre
稳定版发布:2.5
参考
#API 文档:
ScrollConfiguration
ScrollBehavior
MaterialScrollBehavior
CupertinoScrollBehavior
PointerDeviceKind
GestureDetector
相关问题:
相关 PR:
- Reject mouse drags by default in scrollables
- Deprecate GestureDetector.kind in favor of new supportedDevices
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。