Flutter Web 禁用鼠标右键菜单小部件

4

有没有一种方法可以在Flutter Web上的浏览器中仅为特定小部件禁用右键单击上下文菜单?

当然,我可以通过进入index.html并在body标签中禁用它来禁用整个站点。

<body oncontextmenu="return false;">

我不太确定如何针对屏幕上特定的小部件进行操作,如果有方法,请告诉我?

谢谢。现在我能够禁用整个页面的右键单击。 - Faslur Rajah
我简直不敢相信,即使过了两年,仍然无法做到这一点...目前,我需要在自定义上下文菜单项上禁用它,并在复制和粘贴文本时启用它,因为在使用移动设备时,在TextFormField上尝试制作自定义复制粘贴系统似乎在很多方面都存在问题。 - Crossoni
1个回答

0

哇,我终于想出了一种可行的方法来禁用特定小部件上的上下文菜单。思路很简单,只需使用布尔值,在右键单击后切换该值,并在上下文菜单检查完成后。这是一个示例小部件,它创建了一个可右键单击的文本小部件,仅在此小部件上禁用右键单击上下文菜单:

// Remember to add dependency to 'universal_html: ^2.0.8'
import 'package:universal_html/html.dart' as html;

class PreventLinkContext extends StatefulWidget {
  const PreventLinkContext({Key? key}) : super(key: key);

  @override
  State<PreventLinkContext> createState() => _PreventLinkContextState();
}

class _PreventLinkContextState extends State<PreventLinkContext> {
  bool linkClicked = false;

  var _preventContextMenu;

  @override
  void initState() {
    super.initState();

    _preventContextMenu = (html.Event event) => {
          if (linkClicked)
            {
              event.preventDefault(),
              linkClicked = false,
            }
        };

    html.document.addEventListener('contextmenu', _preventContextMenu);
  }

  @override
  void dispose() {
    html.document.removeEventListener('contextmenu', _preventContextMenu);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onSecondaryTap: () {
        linkClicked = true;
      },
      child: const Text(
        'Link',
        style: TextStyle(
          color: Colors.cyan,
          decoration: TextDecoration.underline,
        ),
      ),
    );
  }
}

编辑:在处理函数中添加了removeEventListener,并提供了有关universal_html包的信息。


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