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