Flutter 3.19 桌面应用开发:适配 Windows/macOS 端窗口大小与菜单栏自定义

Flutter 3.19 桌面应用开发:窗口大小适配与菜单栏自定义

一、窗口大小适配方案

在 Windows/macOS 桌面应用中,需通过 dart:ioplatform_dispatcher 控制窗口属性:

  1. 设置初始窗口尺寸
dart 复制代码
import 'dart:io';
import 'package:flutter/material.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  if (Platform.isWindows || Platform.isMacOS) {
    // 设置初始尺寸(宽度, 高度)
    PlatformDispatcher.instance.platformViewsController
      ..setWindowSize(const Size(1200, 800))
      ..setMinimumWindowSize(const Size(800, 600)); // 最小尺寸限制
  }
  runApp(MyApp());
}
  1. 动态响应窗口变化
dart 复制代码
class ResponsiveLayout extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(
      builder: (context, constraints) {
        // 根据窗口宽度调整布局
        if (constraints.maxWidth > 1000) {
          return _buildWideLayout();
        } else {
          return _buildCompactLayout();
        }
      },
    );
  }
}
  1. 全屏/退出全屏控制
dart 复制代码
// 进入全屏
PlatformDispatcher.instance.platformViewsController.enterFullscreen();

// 退出全屏
PlatformDispatcher.instance.platformViewsController.exitFullscreen();
二、菜单栏自定义实现

使用 PlatformMenuBarPlatformMenuItem 创建原生风格菜单:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

PlatformMenuBar buildAppMenu() {
  return PlatformMenuBar(
    menus: [
      // 文件菜单
      PlatformMenu(
        label: '文件',
        menus: [
          PlatformMenuItem(
            label: '新建',
            shortcut: const SingleActivator(LogicalKeyboardKey.keyN, meta: true),
            onSelected: () => _handleNewFile(),
          ),
          PlatformMenuDivider(),
          PlatformMenuItem(
            label: '退出',
            shortcut: const SingleActivator(LogicalKeyboardKey.keyQ, meta: true),
            onSelected: () => SystemNavigator.pop(),
          ),
        ],
      ),
      
      // 编辑菜单 (macOS需特殊处理)
      if (!Platform.isMacOS) PlatformMenu(
        label: '编辑',
        menus: [
          PlatformMenuItem(
            label: '撤销',
            shortcut: const SingleActivator(LogicalKeyboardKey.keyZ, meta: true),
            onSelected: () => _handleUndo(),
          ),
        ],
      ),
      
      // 帮助菜单
      PlatformMenu(
        label: '帮助',
        menus: [
          PlatformMenuItem(
            label: '关于',
            onSelected: () => _showAboutDialog(),
          ),
        ],
      ),
    ],
  );
}

// 在应用顶层集成
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PlatformMenuBar(
        menus: buildAppMenu().menus,
        child: Scaffold(...),
      ),
    );
  }
}
三、跨平台适配要点
特性 Windows 处理 macOS 处理
菜单位置 显示在窗口顶部 自动集成到系统菜单栏
快捷键 Ctrl+Key Cmd+Key
全屏行为 窗口最大化 进入沉浸式全屏
菜单分隔 使用PlatformMenuDivider 需添加key: const ValueKey('div')
四、最佳实践建议
  1. 响应式设计原则

    • 使用 \\text{MediaQuery.of(context).size} 获取实时尺寸
    • 通过 \\text{constraints.maxWidth} 实现断点布局
  2. 菜单状态管理

    dart 复制代码
    ValueNotifier<bool> isSaveEnabled = ValueNotifier(false);
    
    PlatformMenuItem(
      label: '保存',
      enabled: isSaveEnabled,
      onSelected: _saveFile,
    )
  3. 平台特性检测

    dart 复制代码
    void _handleFullscreen() {
      if (Platform.isMacOS) {
        // macOS特殊处理
      } else {
        // Windows/Linux处理
      }
    }

注意事项

  • 使用 flutter pub add platform_menu_bar 安装最新菜单插件
  • pubspec.yaml 中设置最小版本:
yaml 复制代码
environment:
  sdk: ">=3.0.0 <4.0.0"
  flutter: ">=3.19.0"
相关推荐
sukalot3 小时前
windows 驱动实例分析系列: HidHide驱动分析-HidHideClient 篇(中)
windows·驱动开发
我是Superman丶14 小时前
Arduino IDE 安装教程:Windows/macOS/Linux 开发环境搭建
ide·windows·macos
辻弋20115 小时前
自动检测硬件生成驱动清单、实时监控FPS、120秒性能记录——30+项优化模块化开关,所有改动可精确复原
服务器·windows·游戏引擎·电脑·开源软件
k4m7v2pz15 小时前
Mac 上用 brew 安装 UTM 与 QEMU(代理配置全记录)
macos
江湖人称菠萝包15 小时前
【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter8-子窗口控件
windows·笔记
其实防守也摸鱼17 小时前
OpenClaw Windows 踩坑实战指南
运维·服务器·数据库·windows·github·copilot
安好说AI18 小时前
Flutter 三方库 adaptive_image_picker 的鸿蒙化适配指南:零权限选图、纯 Dart 裁剪与目标大小压缩
flutter·harmonyos
千码君201619 小时前
提词器项目V1.0功能分析
ide·macos·xcode
恋猫de小郭20 小时前
Dart Skills CLI 1.0 :AI 时代的 Dart 交付支持
android·前端·flutter
承渊政道21 小时前
星空组网真实体验:Mac远程访问Ubuntu,SSH与HTTP全流程验证
ubuntu·http·macos·ssh·服务器管理·星空组网