默认拖动滚动设备
摘要
#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
。- 在您的Widget树中创建一个
ScrollConfiguration
,并使用copyWith
在当前上下文中提供修改后的现有ScrollBehavior
副本。
- 在您的Widget树中创建一个
为了适应ScrollBehavior
中拖动设备的新配置,GestureDetector.kind
已弃用,以及该参数的所有子类实例。Flutter 提供了一个修复程序,用于将所有手势检测器的现有代码从kind
迁移到supportedDevices
。之前的参数kind
仅允许使用一个PointerDeviceKind
来过滤手势。supportedDevices
的引入使得可以使用多个有效的PointerDeviceKind
。
迁移指南
#为您的应用程序设置自定义ScrollBehavior
#迁移前的代码
MaterialApp(
// ...
);
迁移后的代码
class MyCustomScrollBehavior extends MaterialScrollBehavior {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// Set ScrollBehavior for an entire application.
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 {
// Override behavior methods and getters like dragDevices
@override
Set<PointerDeviceKind> get dragDevices => {
PointerDeviceKind.touch,
PointerDeviceKind.mouse,
// etc.
};
}
// ScrollBehavior can be set for a specific widget.
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 can be copied and adjusted.
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
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面最后更新于 2024-04-04。 查看源代码 或 报告问题.