我有一个 TextFormField
. 通常你可以使用选择工具栏来复制粘贴选择全部等,使用长点双点。
我想覆盖粘贴事件。它不应该是简单的插入当前剪贴板数据,而是打开一个弹出式窗口,有几个选项可以插入。
有没有可能以任何方式捕捉和覆盖Paste事件?我看到了这样的内容 handlePaste()
对于 SelectionControls
但我不知道如何将其添加到我的。TextFormField
.
先谢谢你
AFAIK,你不能完全 "拦截 "标准工具栏。然而,你可以做的是防止标准工具栏,并制作你自己的工具栏。
你可以在IgnorePointer下使用wrap the textfieldtextformfield。它将隐藏文本字段上的任何点击手势。下面是代码片段。
IgnorePointer(
child: TextField(
focusNode: _textfieldFocusNode,
controller: _controller,
),
)
现在,你可以把这个IgnorePointer包在GestureDetector下面,然后显示你自己的菜单。像这样。
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
FocusScope.of(context).requestFocus(_textfieldFocusNode);
},
onLongPress: () {
showMenu(____
}
)
这将产生下面的结果,示例实现代码是 此处
我搜索这个问题。我认为没有合适的方法来解决这个问题。我看了一下Textfield类,发现有两种解决方法,如果你检查一下 TextField 小工具,你可以发现它将使用 可编辑文本 以显示其简单的Text输入。EditableText有一个 选择控制 这个属性是用来渲染选择工具栏的。另外,我发现 material 和 Cupertino 有不同的实现。
第一种解决方案:你可以创建你自己的自定义TextField,它将使用EditableText,并将你的自定义选择控件传递给你的widget。我认为这将是一个非常困难的工作。创建你自己的小部件的实现,处理动画,和...
第二种解决方案。你可以简单地将TextField的所有相关文件复制到一个新的文件中,然后根据你的需要进行更新。GitHub中的repo.你可以查看源码来了解如何在粘贴选项中显示对话框,这就是代码的工作原理。
注:我只是简单地更新了Material实现的selectControls的粘贴功能,如果你愿意,你也可以更新Cupertino的selectControls。
注:我还在修改代码的地方添加了文档。