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
获取默认项列表,该列表为 IOSSystemContextMenuItem
s,可以通过 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