在 Flutter 中的 TextFormField 和 TextField 中复制和粘贴不起作用

问题描述

解决:复制和粘贴在 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),

如果您需要更多代码或信息,请评论

解决方法

找到了两个解决方案。
如果您检查 TextField 小部件,您会发现它将使用 EditableText 来显示其简单的文本输入。 EditableText 有一个 selectionControls 属性。此属性用于呈现选择工具栏。另外,我发现 material 和 Cupertino 对它的实现不同。

第一个解决方案:您可以创建自己的自定义 TextField,它将使用 EditableText 并将您的自定义 selectionControl 传递给您的小部件。我认为这将是一项非常艰巨的工作。创建您自己的小部件实现、处理动画和...

第二种解决方案:您可以简单地将 TextField 的所有相关文件复制到一个新文件中,并根据需要进行更新。对于此解决方案,我创建了一个 repo in GitHub。您可以查看源代码以了解如何在粘贴选项中显示对话框。这就是代码应该如何工作。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...