覆盖TextFormField的粘贴事件。

问题描述 投票:0回答:1

我有一个 TextFormField. 通常你可以使用选择工具栏来复制粘贴选择全部等,使用长点双点。

我想覆盖粘贴事件。它不应该是简单的插入当前剪贴板数据,而是打开一个弹出式窗口,有几个选项可以插入。

有没有可能以任何方式捕捉和覆盖Paste事件?我看到了这样的内容 handlePaste() 对于 SelectionControls但我不知道如何将其添加到我的。TextFormField.

先谢谢你

flutter paste
1个回答
2
投票

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(____
    }
)

这将产生下面的结果,示例实现代码是 此处

enter image description here


1
投票

我搜索这个问题。我认为没有合适的方法来解决这个问题。我看了一下Textfield类,发现有两种解决方法,如果你检查一下 TextField 小工具,你可以发现它将使用 可编辑文本 以显示其简单的Text输入。EditableText有一个 选择控制 这个属性是用来渲染选择工具栏的。另外,我发现 material 和 Cupertino 有不同的实现。

第一种解决方案:你可以创建你自己的自定义TextField,它将使用EditableText,并将你的自定义选择控件传递给你的widget。我认为这将是一个非常困难的工作。创建你自己的小部件的实现,处理动画,和...

第二种解决方案。你可以简单地将TextField的所有相关文件复制到一个新的文件中,然后根据你的需要进行更新。GitHub中的repo.你可以查看源码来了解如何在粘贴选项中显示对话框,这就是代码的工作原理。

注:我只是简单地更新了Material实现的selectControls的粘贴功能,如果你愿意,你也可以更新Cupertino的selectControls。

注:我还在修改代码的地方添加了文档。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.