我没有看到 macOS 上的默认应用程序模板中实现了这一点。当我按下 Command+W 时,它什么也没做。我们如何在 flutter 中做到这一点?
注意:在Mac上退出窗口需要按command+Q,这种方法是如果你想专门检测command+W。
要退出 Flutter 应用(不适用于 IOS),您可以调用:
SystemNavigator.pop();
如果你在内部查看它的代码,会调用:
SystemChannels.platform.invokeMethod<void>('SystemNavigator.pop'
因此,要检测 Command+W,您可以设置键盘侦听器:
RawKeyboard.instance.addListener((key) {
if (key.isMetaPressed && key.isKeyPressed(LogicalKeyboardKey.keyW)) {
SystemNavigator.pop();
}
});
完整代码:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MaterialApp(home: const MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
RawKeyboard.instance.addListener((key) {
if (key.isMetaPressed && key.isKeyPressed(LogicalKeyboardKey.keyW)) {
SystemNavigator.pop();
}
});
return Scaffold(
body: Text("Press on the command+w key to close the app"),
);
}
}
RawKeyboard 已被弃用,现在您需要使用 HardwareKeyboard,第二个 if 检查按键是否一直按下:
关闭
HardwareKeyboard.instance.addHandler(
(KeyEvent event) {
if (event is KeyDownEvent) {
if (HardwareKeyboard.instance.isMetaPressed &&
HardwareKeyboard.instance
.isLogicalKeyPressed(LogicalKeyboardKey.keyW)) {
SystemNavigator.pop();
return true;
}
}
return false;
},
);
但这会关闭应用程序,Flutter 没有原生的最小化方法。所以你需要使用像window_manager这样的依赖项。 首先,您需要将此行添加到 main 中:
await windowManager.ensureInitialized();
一种最小化的方法,但会放在停靠栏
HardwareKeyboard.instance.addHandler(
(event) {
if (event is KeyDownEvent) {
if (HardwareKeyboard.instance.isMetaPressed &&
HardwareKeyboard.instance
.isLogicalKeyPressed(LogicalKeyboardKey.keyW)) {
windowManager.hide();
return true;
}
}
return false;
},
);
不一样,但是你可以使用cmd+H,像其他应用程序一样隐藏