概述

#

SystemContextMenuController.show 已弃用。通过将调用 SystemContextMenu.getDefaultItems 的结果传递给 SystemContextMenuController.showWithItems,可以实现相同的功能。

背景

#

iOS 绘制的 SystemContextMenu 功能最初添加时无法控制菜单中显示哪些项。平台会根据活动的 TextInputConnection 决定显示哪些项。

这种方法的缺点是经常会显示一个“自动填充”按钮,但 Flutter 无法响应此按钮。因此,在许多情况下,用户会看到一个点击后没有任何作用的“自动填充”按钮,并且 Flutter 应用开发者无法隐藏该按钮。

通过引入一个新方法 SystemContextMenuController.showWithItems 解决了此问题,该方法要求传入一个 items 列表。

没有偏好显示哪些项的开发者可以调用新方法 SystemContextMenu.getDefaultItems,以根据给定的 EditableTextState 获取默认项。例如,如果 EditableTextState 指示没有选中任何内容,则不会包含“复制”按钮,因为它需要选中内容才能复制。

迁移指南

#

大多数用户通过 SystemContextMenu 小部件使用系统上下文菜单,在这种情况下不需要任何更改。SystemContextMenu 小部件会在内部自动获取默认项。

无需迁移

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 获取,它是一个 IOSSystemContextMenuItem 列表,可以通过 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