在Flutter中,TextFormField和TextField无法使用复制和粘贴功能

4

已解决: TextFormField中的复制和粘贴无法正常工作

我发现我在使用ListeneronPointerDown方法来移除焦点,以便用户在应用程序其他任何地方单击时失去焦点。但这会引起错误。

但现在问题是如何在其他地方单击以删除焦点。

Listener(
    onPointerDown: (_) {
       FocusScopeNode currentFocus = FocusScope.of(context);
       if (!currentFocus.hasPrimaryFocus &&
       currentFocus.focusedChild != null) {
       currentFocus.focusedChild.unfocus();
      }
  },)

我尝试在我的Flutter应用程序中的TextFormField中实现复制粘贴功能。我尝试了很多方法,但仍然无法正常工作。


这是我的代码

Widget textFormWidget(
   String label, TextEditingController controller, bool enabled) {
return Padding(
  padding: const EdgeInsets.all(8.0),
  child: TextFormField(
    enabled: true,
    enableInteractiveSelection: true,
    readOnly: false,
    toolbarOptions:
        ToolbarOptions(paste: true, cut: true, selectAll: true, copy: true),
    textAlign: TextAlign.center,
    cursorColor: Colors.white,
    cursorWidth: 3,
    controller: controller,
    style: bold.copyWith(fontSize: 18),
    decoration: InputDecoration(
        focusColor: Colors.white,
        hoverColor: Colors.white,
        labelText: label,
        alignLabelWithHint: true,
        labelStyle: normal),
   ),
 );
}

将其作为textFormWidget('Name', nameController, true)调用。

如果您需要更多的代码或信息,请留言。


只需删除工具栏选项,可能就可以正常工作了,因为默认情况下,formfield带有剪切、复制、粘贴和所有启用的功能。 - basudev nayak
1
不,它不起作用。@basudevnayak 转到 ToolBarOptions 的内部代码,你可以在那里读到它没有启用。 - DIVYANSHU SAHU
嘿,你找到这个问题的解决方案了吗? - Zain SMJ
2个回答

0

我也遇到了同样的问题,无法复制和粘贴。所以我将其删除了。

FocusScopeNode currentFocus = FocusScope.of(context);
       if (!currentFocus.hasPrimaryFocus &&
       currentFocus.focusedChild != null) {
       currentFocus.focusedChild.unfocus();
      }

除了 onPointerDown 外,如果有人在其他地方点击,我会用 GestureDetector 包装我的 MaterialApp 并添加这个来移除焦点:
 onTap: () => FocusManager.instance.primaryFocus?.unfocus(),

代码:

GestureDetector(
      onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
      child: MaterialApp(
       //your code
      ),
    );

0

找到了两种解决方案。

如果你检查TextField小部件,你会发现它将使用EditableText来显示简单的文本输入。 EditableText有一个selectionControls属性。这个属性用于呈现选择工具栏。同时,我发现Material和Cupertino对它有不同的实现。

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

第二种解决方案:你可以简单地将TextField的所有相关文件复制到一个新文件中,并按照你的意愿进行更新。针对这个解决方案,我在GitHub上创建了存储库。你可以查看源代码,了解如何在粘贴选项中显示对话框。这就是代码应该如何工作的方式。

注意:我只是简单地更新了选择控件材料实现的粘贴功能。如果您想,您也可以更新Cupertino选择控件。


你好,非常感谢您的回答。但是您能否给出一个原因,为什么会发生这种情况,因为我不想使用 TextField。而且您的第二个解决方案也会带来太多麻烦。 - DIVYANSHU SAHU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接