1

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

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

4

1 回答 1

0

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

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

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

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

于 2021-01-31T08:45:52.040 回答