30天计划第17天-桌面端适配(Windows/macOS)

-
-
2025-11-23 00:02
  • 学习内容

    1. 启用桌面端支持(flutter config --enable-windows-desktop(新版本已经默认支持,无需配置)

    2. 桌面端特有:窗口大小设置、键盘快捷键

  • 实践任务

    1. 将项目运行到 Windows/macOS 桌面端(flutter run -d windows

    2. 设置窗口默认大小(在 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());
}

二、键盘快捷键

使用ShortcutsActions组件是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 {}
  • 运行效果


目录