概述

#

ScrollBehavior 現在允許或禁止螢幕上指標數量影響滾動速度。預設情況下,ScrollBehavior.multitouchDragStrategy 會阻止多個指標同時與可滾動元件互動以影響滾動速度。

背景

#

在此更改之前,拖動 Scrollable widget 的每個指標都會增加滾動速度。這不符合平臺在與 Flutter 應用程式互動時的預期。

現在,繼承的 ScrollBehavior 根據 ScrollBehavior.multitouchDragStrategy 指定,管理多個指標如何影響滾動 widget。此列舉 MultitouchDragStrategy 也可以配置為之前的行為。

變更說明

#

此更改修復了透過使用多個手指拖動來增加滾動速度的意外能力。

如果在您的應用程式中依賴於之前的行為,可以通過幾種方式來控制和配置此功能。

  • 擴充套件 ScrollBehaviorMaterialScrollBehaviorCupertinoScrollBehavior 來修改預設行為,重寫 ScrollBehavior.multitouchDragStrategy

    • 有了您自己的 ScrollBehavior,您可以透過設定 MaterialApp.scrollBehaviorCupertinoApp.scrollBehavior 將其應用於整個應用程式。
    • 或者,如果您只想將其應用於特定元件,請在相關元件上方新增一個 ScrollConfiguration,並使用您的自定義 ScrollBehavior

您的可滾動 widget 然後繼承並反映此行為。

  • 另一種更改預設行為的選項是複製現有的 ScrollBehavior,並設定不同的 multitouchDragStrategy,而不是建立自己的 ScrollBehavior
    • 在您的元件樹中建立一個 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(),
  // ...
);

為特定元件設定自定義 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