預設拖曳滾動裝置
摘要
#現在,ScrollBehavior
允許或禁止從指定的 PointerDeviceKind
進行拖曳滾動。預設情況下,ScrollBehavior.dragDevices
允許除 PointerDeviceKind.mouse
之外的所有 PointerDeviceKind
拖曳滾動小部件。
背景
#在此變更之前,所有 PointerDeviceKind
都可以拖曳 Scrollable
小部件。當使用滑鼠輸入裝置與 Flutter 應用程式互動時,這與開發人員的期望不符。這也使得執行其他滑鼠手勢(例如選取包含在 Scrollable
小部件中的文字)變得困難。
現在,繼承的 ScrollBehavior
管理哪些裝置可以拖曳滾動小部件,如 ScrollBehavior.dragDevices
所指定。此組 PointerDeviceKind
被允許拖曳。
變更說明
#此變更修正了意外地使用滑鼠拖曳滾動的能力。
如果您在應用程式中依賴先前的行為,則有多種方法可以控制和設定此功能。
擴展
ScrollBehavior
、MaterialScrollBehavior
或CupertinoScrollBehavior
以修改預設行為,並覆寫ScrollBehavior.dragDevices
。- 使用您自己的
ScrollBehavior
,您可以透過設定MaterialApp.scrollBehavior
或CupertinoApp.scrollBehavior
來在整個應用程式中套用它。 - 或者,如果您希望僅將其套用於特定的小部件,請在相關小部件上方新增一個
ScrollConfiguration
,其中包含您的自訂ScrollBehavior
。
- 使用您自己的
您的可滾動小部件然後會繼承並反映此行為。
- 除了建立自己的
ScrollBehavior
之外,變更預設行為的另一種選擇是複製現有的ScrollBehavior
,並設定不同的dragDevices
。- 在您的小部件樹狀結構中建立一個
ScrollConfiguration
,並使用copyWith
在目前內容中提供現有ScrollBehavior
的修改副本。
- 在您的小部件樹狀結構中建立一個
為了適應 ScrollBehavior
中拖曳裝置的新配置,GestureDetector.kind
已被棄用,連同該參數的所有子類別實例。有一個 flutter 修復程式可用於將所有手勢偵測器的現有程式碼從 kind
遷移到 supportedDevices
。先前的參數 kind
僅允許使用一個 PointerDeviceKind
來篩選手勢。supportedDevices
的引入使得可以使用多個有效的 PointerDeviceKind
。
遷移指南
#為您的應用程式設定自訂的 ScrollBehavior
#遷移前的程式碼
MaterialApp(
// ...
);
遷移後的程式碼
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
#遷移前的程式碼
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
遷移後的程式碼
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
#遷移前的程式碼
final ScrollController controller = ScrollController();
ListView.builder(
controller: controller,
itemBuilder: (BuildContext context, int index) {
return Text('Item $index');
}
);
遷移後的程式碼
// 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');
}
),
);
將 GestureDetector
從 kind
遷移到 supportedDevices
#遷移前的程式碼
VerticalDragGestureRecognizer(
kind: PointerDeviceKind.touch,
);
遷移後的程式碼
VerticalDragGestureRecognizer(
supportedDevices: <PointerDeviceKind>{ PointerDeviceKind.touch },
);
時程
#發佈於版本:2.3.0-12.0.pre
穩定版本:2.5
參考文獻
#API 文件
ScrollConfiguration
ScrollBehavior
MaterialScrollBehavior
CupertinoScrollBehavior
PointerDeviceKind
GestureDetector
相關問題
相關的 PR
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面最後更新於 2024-04-04。 檢視原始碼 或 回報問題。