flutter - 我可以更改颤振 Web 应用程序中的右键单击操作吗?
问题描述
像 Google Drive 一样,我可以在Flutter Web应用程序中创建自定义菜单吗?
解决方案
下面是如何在Flutter Web 应用程序中实现通过鼠标右键调用的工作上下文菜单的说明:
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:universal_html/html.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
// Prevent default event handler
document.onContextMenu.listen((event) => event.preventDefault());
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Center(
child: Listener(
child: Icon(
Icons.ac_unit,
size: 48.0,
),
onPointerDown: _onPointerDown,
),
),
);
}
/// Callback when mouse clicked on `Listener` wrapped widget.
Future<void> _onPointerDown(PointerDownEvent event) async {
// Check if right mouse button clicked
if (event.kind == PointerDeviceKind.mouse &&
event.buttons == kSecondaryMouseButton) {
final overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
final menuItem = await showMenu<int>(
context: context,
items: [
PopupMenuItem(child: Text('Copy'), value: 1),
PopupMenuItem(child: Text('Cut'), value: 2),
],
position: RelativeRect.fromSize(
event.position & Size(48.0, 48.0), overlay.size));
// Check if menu item clicked
switch (menuItem) {
case 1:
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Copy clicket'),
behavior: SnackBarBehavior.floating,
));
break;
case 2:
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Cut clicked'),
behavior: SnackBarBehavior.floating));
break;
default:
}
}
}
}
唯一要做的就是正确定位上下文菜单的左上角。
推荐阅读
- apache - mysql 在 MAMP 上工作时 Apache 服务器未启动。说开发者无法验证
- flutter - 如何更新列表项的单个值而不是整个列表项
- mongodb - 获取嵌套数组的 $size(长度)并计算与父对象上存储值的差异 - 使用聚合
- c# - AutoMapper ValueFactory 在部署到服务器时尝试访问 Value 属性错误并且在执行了几天后正常
- python - 解码错误:标签中的电线类型错误。| 在 Atom+Hydrogen 中导入 tensorflow
- c# - 反应式将多个可观察对象合并为一个带有布尔值的可观察对象
- node.js - 错误:MERN 中的“User.findOne 不是函数”
- java - JavaFX:从另一个类中启动
- android - EditText TextWatcher 替换为 LiveData
- oracle - VARCHAR2(32767) 无法处理存储过程中的字符串