SystemContextMenuController.show 已弃用
概述
#SystemContextMenuController.show
已弃用。通过将调用 SystemContextMenu.getDefaultItems
的结果传递给 SystemContextMenuController.showWithItems
,可以实现相同的功能。
背景
#iOS 绘制的 SystemContextMenu
功能最初添加时无法控制菜单中显示哪些项。平台会根据活动的 TextInputConnection
决定显示哪些项。
这种方法的缺点是经常会显示一个“自动填充”按钮,但 Flutter 无法响应此按钮。因此,在许多情况下,用户会看到一个点击后没有任何作用的“自动填充”按钮,并且 Flutter 应用开发者无法隐藏该按钮。
通过引入一个新方法 SystemContextMenuController.showWithItems
解决了此问题,该方法要求传入一个 items
列表。
没有偏好显示哪些项的开发者可以调用新方法 SystemContextMenu.getDefaultItems
,以根据给定的 EditableTextState
获取默认项。例如,如果 EditableTextState
指示没有选中任何内容,则不会包含“复制”按钮,因为它需要选中内容才能复制。
迁移指南
#大多数用户通过 SystemContextMenu
小部件使用系统上下文菜单,在这种情况下不需要任何更改。SystemContextMenu
小部件会在内部自动获取默认项。
无需迁移
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
所需的格式。
迁移前的代码
_controller.show(selectionRect);
迁移后的代码
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 文档
TextInputConnection
SystemContextMenuController.show
SystemContextMenuController.showWithItems
SystemContextMenu
相关问题
相关 PR