概述

#

SystemContextMenuController.show 已棄用。透過將呼叫 SystemContextMenu.getDefaultItems 的結果傳遞給 SystemContextMenuController.showWithItems,可以實現相同的功能。

背景

#

最初新增 iOS 繪製的 SystemContextMenu 功能時,無法控制選單中顯示的項。平臺會根據活動的 TextInputConnection 來決定顯示哪些項。

這種方法的缺點是,通常會顯示一個“自動填充”按鈕,但 Flutter 無法響應此按鈕。因此,在許多情況下,使用者會看到一個點選後無任何作用的“自動填充”按鈕,而 Flutter 應用開發者也無法隱藏該按鈕。

透過引入新方法 SystemContextMenuController.showWithItems 解決了此問題,該方法要求傳遞一個 items 列表。

對於不關心顯示哪些項的開發者,可以呼叫新方法 SystemContextMenu.getDefaultItems,根據給定的 EditableTextState 獲取預設項。例如,如果 EditableTextState 表明未選擇任何內容,則不會包含“**複製**”按鈕,因為它需要有選中的內容才能複製。

遷移指南

#

大多數使用者透過 SystemContextMenu widget 使用系統上下文選單,在這種情況下無需任何更改。SystemContextMenu widget 會在後臺自動獲取預設項。

無需遷移

dart
class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    TextField(
      contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
        return SystemContextMenu.editableText(
          editableTextState: editableTextState,
        );
      }
    );
  }
}

對於直接使用 SystemContextMenuController 的高階使用者,請遷移到新方法 SystemContextMenuController.showWithItems。可以透過 SystemContextMenu.getDefaultItems 獲取預設項列表,該列表為 IOSSystemContextMenuItems,可以透過 IOSSystemContextMenuItem.getData 轉換為 showWithItems 所需的格式。

遷移前的程式碼

dart
_controller.show(selectionRect);

遷移後的程式碼

dart
final List<IOSSystemContextMenuItem> defaultItems =
    SystemContextMenu.getDefaultItems(editableTextState);
final WidgetsLocalizations localizations =
    WidgetsLocalizations.of(context);
final List<IOSSystemContextMenuItemData> defaultItemDatas =
    defaultItems
        .map((IOSSystemContextMenuItem item) =>
            item.getData(localizations))
        .toList();
_controller.showWithItems(selectionRect, defaultItemDatas);

時間線

#

已在版本中落地:3.29.0-0.3.pre
穩定版本:3.32

參考資料

#

API 文件

相關問題

相關 PR