学习内容:
启用桌面端支持(flutter config --enable-windows-desktop)(新版本已经默认支持,无需配置)桌面端特有:窗口大小设置、键盘快捷键
实践任务:
将项目运行到 Windows/macOS 桌面端(
flutter run -d windows)设置窗口默认大小(在
windows/runner/main.cpp中配置)
一、窗口默认大小设置※
如果以Windows/macOS方式启动Flutter时,会有默认的窗口大小(1280*720)和位置(10,10)。该参数可以修改,以Windows为例,有两种方法:
1. 方法一:直接修改原生代码※
打开:项目根目录→windows→runner→main.cpp,在该文件中,可以找到以下代码:
FlutterWindow window(project);
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
if (!window.Create(L"demo20251122", origin, size)) {
return EXIT_FAILURE;
}其中,Point origin(10, 10)是窗口默认打开的位置,Size size是窗口默认大小,修改数值后重新运行即可。
2. 方法二:使用Dart包(跨平台推荐)※
(1)添加依赖※
在pubspec.yaml中,添加如下内容:
dependencies:
window_manager: ^0.5.1 # 请使用 pub.dev 上的最新版本(2)在main.dart中初始化并使用※
import 'package:flutter/material.dart';
import 'package:window_manager/window_manager.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 必须先初始化
await windowManager.ensureInitialized();
// 设置窗口大小
await windowManager.setSize(const Size(800, 600));
// 设置窗口居中
await windowManager.center();
// 禁止窗口调整大小
// await windowManager.setResizable(false);
runApp(const App());
}二、键盘快捷键※
使用Shortcuts和Actions组件是Flutter官方推荐的、处理键盘快捷键的最佳实践,适用于所有平台,包括桌面。
示例代码:实现Ctrl+s保存快捷键。
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); void _handleSave(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('数据已保存!')), ); } @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter 快捷键示例', theme: ThemeData(primarySwatch: Colors.blue), home: Scaffold( appBar: AppBar(title: const Text('快捷键')), // 使用 Builder 来创建一个新的 context body: Builder( builder: (scaffoldContext) { // 这个 scaffoldContext 位于 Scaffold 内部 return Shortcuts( shortcuts: { LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyS): SaveIntent(), LogicalKeySet(LogicalKeyboardKey.meta, LogicalKeyboardKey.keyS): SaveIntent(), }, child: Actions( actions: { SaveIntent: CallbackAction<SaveIntent>( onInvoke: (intent) { // 在这里使用 scaffoldContext,而不是 MyApp 的 context _handleSave(scaffoldContext); return null; }, ) }, child: Focus( autofocus: true, child: const Center( child: Text('按下 Ctrl+S 保存'), ), ), ), ); }, ), ), ); } } class SaveIntent extends Intent {}运行效果
