跳到主要内容

默认拖动滚动设备

摘要

#

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
    • 在您的Widget树中创建一个ScrollConfiguration,并使用copyWith在当前上下文中提供修改后的现有ScrollBehavior副本。

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

迁移指南

#

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

#

迁移前的代码

dart
MaterialApp(
  // ...
);

迁移后的代码

dart
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

#

迁移前的代码

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

迁移后的代码

dart
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

#

迁移前的代码

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

迁移后的代码

dart
// 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');
    }
  ),
);

GestureDetectorkind迁移到supportedDevices

#

迁移前的代码

dart
VerticalDragGestureRecognizer(
  kind: PointerDeviceKind.touch,
);

迁移后的代码

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

时间线

#

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

参考文献

#

API 文档

相关问题

相关 PR