Flutter Web - TextFormField 禁用复制和粘贴

Posted

技术标签:

【中文标题】Flutter Web - TextFormField 禁用复制和粘贴【英文标题】:Flutter Web - TextFormField disable copy and paste 【发布时间】:2021-10-11 18:21:42 【问题描述】:

我想在我的文本字段上禁用复制和粘贴功能,但不幸的是,它在 网络 上没有按预期工作。我尝试了以下enableInteractiveSelectiontoolbarOptions,但我仍然可以在网络上的文本字段上复制和粘贴。这有什么解决办法。谢谢

  TextFormField(
    enableInteractiveSelection: false,
    toolbarOptions: ToolbarOptions(
      copy: false,
      paste: false,
      cut: false,
      selectAll: false,
    ),
  )

【问题讨论】:

如果你改用TextFieldenableInteractiveSelection 会起作用吗? toolbarOptions 是您在文本字段上长按/长按时会看到的选项。所以设置toolbarOptions 属性并没有真正禁用复制粘贴功能,它只是从工具栏中删除了复制、粘贴等选项。 @ikerfah 是的,结果还是一样,它在网络上不起作用 @Wahyu 我知道文本字段上的交互。我希望它可以在网络上运行。有解决办法吗?也许用 LogicalKeyboardKey 包装它并从那里禁用? 是否要禁用整个页面的复制、粘贴等功能?然后我认为可以通过创建一个javascript代码来禁用这些功能,并使用<script>标签将其放入您的index.html文件中。 【参考方案1】:

如果您正在考虑使用快捷键,我们需要听LogicalKeySet

结果

我是这样做的:

对于复制粘贴键

///* for mac replace  LogicalKeyboardKey.control, with LogicalKeyboardKey.meta
final selectableKeySetwindows = LogicalKeySet(
  LogicalKeyboardKey.control,
  LogicalKeyboardKey.keyA,
);
final pasteKeySetwindows = LogicalKeySet(
  LogicalKeyboardKey.control,
  LogicalKeyboardKey.keyV,
);

/// i dont have any ios device ?,let me know what it produce.
final selectableKeySetMac = LogicalKeySet(
  LogicalKeyboardKey.meta,
  LogicalKeyboardKey.keyA,
);
class SelectionIntent extends Intent 

class PasteIntent extends Intent 

将处理事件的小部件


class DisableShortcut extends StatelessWidget 
  final Widget child;

  const DisableShortcut(
    Key? key,
    required this.child,
  ) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return FocusableActionDetector(
      shortcuts: 
        selectableKeySetwindows: SelectionIntent(),
        pasteKeySetwindows: PasteIntent(),
      ,
      actions: 
        SelectionIntent: CallbackAction(
          onInvoke: (intent) 
            ScaffoldMessenger.of(context)
                .showSnackBar(SnackBar(content: Text("Copy is forbidden")));
            return FocusScope.of(context).requestFocus(FocusNode());
          ,
        ),
        PasteIntent: CallbackAction(
          onInvoke: (intent) async 
            // ClipboardData? data = await Clipboard.getData('text/plain');
            // print(" paste callBack $data!.text");
            return ScaffoldMessenger.of(context)
                .showSnackBar(SnackBar(content: Text("Paste is forbidden")));
          ,
        )
      ,
      autofocus: true,
      child: child,
    );
  

我的 testWidget

 @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(),
            TextField(),
            DisableShortcut(
              child: TextField(
                enableInteractiveSelection: false,
                toolbarOptions: ToolbarOptions(
                  copy: false,
                  cut: false,
                  paste: false,
                  selectAll: false,
                ),
              ),
            ),
          ],
        ),
      ),
    );

【讨论】:

不错。这将在此期间完成。谢谢

以上是关于Flutter Web - TextFormField 禁用复制和粘贴的主要内容,如果未能解决你的问题,请参考以下文章

flutter web(3) 快速创建web工程并运行

flutter项目中添加web支持

如何将 Flutter 移动应用迁移到 Flutter Web

flutter Web端支持内嵌加载网页

Flutter web 最新进展: 发掘更多可能!

Flutter 调味移动应用和 Flutter web