You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter多窗口应用如何移除新窗口的标题栏?

解决Flutter多窗口移除标题栏的问题

一、当前方案的修复方法(基于desktop_multi_window + window_manager)

主窗口能隐藏标题栏是因为你初始化了window_manager并配置了TitleBarStyle.hidden,但新窗口的启动流程没有执行相同的配置逻辑。只需在子窗口的初始化分支中添加对应的window_manager配置即可:

修改main函数中处理multi_window的代码块:

if (args.firstOrNull == 'multi_window') {
  WidgetsFlutterBinding.ensureInitialized();
  final windowId = int.parse(args[1]);
  final argument = args[2].isEmpty
      ? const {}
      : jsonDecode(args[2]) as Map<String, dynamic>;
  
  // 新增:初始化window_manager并配置子窗口无标题栏
  await windowManager.ensureInitialized();
  WindowOptions subWindowOptions = const WindowOptions(
    size: Size(400, 600),
    center: true,
    titleBarStyle: TitleBarStyle.hidden,
  );
  await windowManager.waitUntilReadyToShow(subWindowOptions, () async {
    await windowManager.show();
    await windowManager.focus();
  });

  runApp(SubWindow(
    windowController: WindowController.fromWindowId(windowId),
    args: argument,
  ));
}

修改后,每个新启动的子窗口都会执行标题栏隐藏的配置,和主窗口逻辑保持一致。

二、Flutter原生是否有默认设置?

Flutter本身没有跨平台的默认无标题栏设置,桌面窗口的标题栏属于平台原生组件,需要依赖第三方窗口管理包或通过Platform Channel编写原生代码来控制。

三、其他无标题栏多窗口方案

1. 使用bitsdojo_window包

bitsdojo_window是另一个流行的桌面窗口管理库,支持多窗口的标题栏自定义和隐藏,配置更灵活:

  • 在pubspec.yaml添加依赖:bitsdojo_window: ^0.1.5
  • 子窗口初始化时配置窗口:
// 子窗口入口代码
doWhenWindowReady(() {
  final win = appWindow;
  win.hideTitle(); // 隐藏标题栏
  win.size = Size(400, 600);
  win.center();
  win.show();
});

2. 平台原生代码实现(适合高度定制场景)

如果不想依赖第三方包,可以通过Platform Channel分别处理不同平台:

  • Windows:调用Win32 API修改窗口样式,移除WS_CAPTION和WS_THICKFRAME属性
  • macOS:通过AppKit设置NSWindow的titlebarAppearsTransparent为true,并隐藏标题栏
  • Linux:使用GTK API修改窗口装饰

这种方式需要编写各平台原生代码,复杂度较高,推荐优先使用第三方包。

内容的提问来源于stack exchange,提问作者Shin euichul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 00:20:28