Skip to main content

默认拖动滚动设备

摘要

#

ScrollBehavior 现在允许或禁止来自指定 PointerDeviceKind 的拖动滚动。ScrollBehavior.dragDevices 默认情况下允许所有 PointerDeviceKind(除 PointerDeviceKind.mouse 外)拖动可滚动小部件。

背景

#

在此更改之前,所有 PointerDeviceKind 都可以拖动 Scrollable 小部件。这与使用鼠标输入设备与 Flutter 应用程序交互时的开发者预期不符。这也使得执行其他鼠标手势(例如选择包含在 Scrollable 小部件中的文本)变得困难。

现在,继承的 ScrollBehavior 根据 ScrollBehavior.dragDevices 指定的内容管理哪些设备可以拖动可滚动小部件。这组 PointerDeviceKind 允许拖动。

更改说明

#

此更改修复了意外地能够通过鼠标拖动来滚动的功能。

如果您在应用程序中依赖于之前的行为,则有几种方法可以控制和配置此功能。

  • 扩展 ScrollBehaviorMaterialScrollBehaviorCupertinoScrollBehavior 以修改默认行为,覆盖 ScrollBehavior.dragDevices

    • 使用您自己的 ScrollBehavior,您可以通过设置 MaterialApp.scrollBehaviorCupertinoApp.scrollBehavior 来将其应用于整个应用程序。
    • 或者,如果您只想将其应用于特定小部件,请在相关小部件上方添加一个 ScrollConfiguration,并使用您自定义的 ScrollBehavior

然后,您的可滚动小部件将继承并反映此行为。

  • 除了创建您自己的 ScrollBehavior 之外,更改默认行为的另一种方法是复制现有的 ScrollBehavior,并设置不同的 dragDevices
    • 在您的窗口小部件树中创建一个 ScrollConfiguration,并使用 copyWith 在当前上下文中提供修改后的现有 ScrollBehavior 副本。

为了适应 ScrollBehavior 中拖动设备的新配置,GestureDetector.kind 已被弃用,以及该参数的所有子类实例。Flutter 提供了一个修复程序,可以将所有手势检测器的现有代码从 kind 迁移到 supportedDevices。以前的参数 kind 只允许使用一个 PointerDeviceKind 来过滤手势。supportedDevices 的引入使得多个有效的 PointerDeviceKind 成为可能。

迁移指南

#

为您的应用程序设置自定义 ScrollBehavior

#

迁移前的代码:

dart
MaterialApp(
  // ...
);

迁移后的代码:

dart
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // 覆盖行为方法和 getter,例如 dragDevices
  @override
  Set<PointerDeviceKind> get dragDevices => {
    PointerDeviceKind.touch,
    PointerDeviceKind.mouse,
    // etc.
  };
}

// 为整个应用程序设置 ScrollBehavior。
MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);

为特定小部件设置自定义 ScrollBehavior

#

迁移前的代码:

dart
final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
   return Text('Item $index');
 }
);

迁移后的代码:

dart
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

#

迁移前的代码:

dart
final ScrollController controller = ScrollController();
ListView.builder(
  controller: controller,
  itemBuilder: (BuildContext context, int index) {
   return Text('Item $index');
 }
);

迁移后的代码:

dart
// 可以复制和调整 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');
    }
  ),
);

GestureDetectorkind 迁移到 supportedDevices

#

迁移前的代码:

dart
VerticalDragGestureRecognizer(
  kind: PointerDeviceKind.touch,
);

迁移后的代码:

dart
VerticalDragGestureRecognizer(
  supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);

时间线

#

包含在版本中:2.3.0-12.0.pre
稳定版发布:2.5

参考

#

API 文档:

相关问题:

相关 PR: