跳至主要内容

默认多点触控滚动

摘要

#

ScrollBehavior 现在允许或不允许滚动速度受屏幕上指针数量的影响。ScrollBehavior.multitouchDragStrategy 默认情况下,会阻止多个指针同时与可滚动内容交互影响滚动速度。

上下文

#

在此更改之前,对于每个拖动 Scrollable Widget 的指针,滚动速度都会增加。这与在与 Flutter 应用程序交互时平台的预期不符。

现在,继承的 ScrollBehavior 根据 ScrollBehavior.multitouchDragStrategy 指定的内容管理多个指针如何影响滚动 Widget。此枚举 MultitouchDragStrategy 也可以配置为之前的行为。

更改说明

#

此更改修复了通过用多个手指拖动意外增加滚动速度的功能。

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

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

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

然后,您的可滚动 Widget 继承并反映此行为。

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

为了适应新的配置,DragGestureRecognizer 也更新为在其他拖动上下文中支持 MultitouchDragStrategy

迁移指南

#

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

#

迁移前代码

dart
MaterialApp(
  // ...
);

迁移后代码

dart
class MyCustomScrollBehavior extends MaterialScrollBehavior {
  // Override behavior methods and getters like multitouchDragStrategy
  @override
  MultitouchDragStrategy getMultitouchDragStrategy(BuildContext context) => MultitouchDragStrategy.sumAllPointers;
}

// Set ScrollBehavior for an entire application.
MaterialApp(
  scrollBehavior: MyCustomScrollBehavior(),
  // ...
);

为特定 Widget 设置自定义 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 multitouchDragStrategy
  @override
  MultitouchDragStrategy getMultitouchDragStrategy(BuildContext context) => MultitouchDragStrategy.sumAllPointers;
}

// 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(
    multitouchDragStrategy: MultitouchDragStrategy.sumAllPointers,
  ),
  child: ListView.builder(
    controller: controller,
    itemBuilder: (BuildContext context, int index) {
      return Text('Item $index');
    },
  ),
);

时间线

#

包含在版本中:3.18.0-4.0.pre
稳定版本:3.19.0

参考

#

API 文档

相关问题

相关 PR