有没有一种方法可以在Flutter Web上的浏览器中仅为特定小部件禁用右键单击上下文菜单?
当然,我可以通过进入index.html并在body标签中禁用它来禁用整个站点。
<body oncontextmenu="return false;">
我不太确定如何针对屏幕上特定的小部件进行操作,如果有方法,请告诉我?
有没有一种方法可以在Flutter Web上的浏览器中仅为特定小部件禁用右键单击上下文菜单?
当然,我可以通过进入index.html并在body标签中禁用它来禁用整个站点。
<body oncontextmenu="return false;">
哇,我终于想出了一种可行的方法来禁用特定小部件上的上下文菜单。思路很简单,只需使用布尔值,在右键单击后切换该值,并在上下文菜单检查完成后。这是一个示例小部件,它创建了一个可右键单击的文本小部件,仅在此小部件上禁用右键单击上下文菜单:
// 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包的信息。