跳至主要內容

預設拖曳滾動裝置

摘要

#

現在,ScrollBehavior 允許或禁止從指定的 PointerDeviceKind 進行拖曳滾動。預設情況下,ScrollBehavior.dragDevices 允許除 PointerDeviceKind.mouse 之外的所有 PointerDeviceKind 拖曳滾動小部件。

背景

#

在此變更之前,所有 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 {
  // 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