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
相关产品推荐
相关产品推荐

