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

Flutter Windows平台能否自定义Scaffold主窗口形状?

Windows平台Flutter自定义窗口形状实现方案

Flutter的Scaffold、CustomPaint等组件仅能控制应用内部UI的形状,无法直接修改Windows系统窗口的轮廓。要实现个性化窗口形状,需要结合系统级窗口配置与Flutter内部UI裁剪,以下是可行方案:

核心思路

通过插件开启Windows窗口透明,再在Flutter内部用裁剪组件画出自定义形状的UI,让透明的系统窗口只显示裁剪后的区域,从而实现视觉上的自定义窗口。

具体实现步骤

1. 配置窗口透明(基于bitsdojo_window)

先利用bitsdojo_window隐藏默认标题栏并开启窗口透明:

void main() {
  runApp(const MyApp());
  doWhenWindowReady(() {
    final win = appWindow;
    win.hideTitle();
    win.setTransparent(true); // 开启系统窗口透明
    win.size = const Size(800, 600);
    win.alignment = Alignment.center;
    win.show();
  });
}

2. 自定义窗口形状UI

在Scaffold中设置背景透明,通过ClipPath或CustomPaint绘制目标形状,同时添加拖拽逻辑(替代默认标题栏的拖拽功能):

@override
Widget build(BuildContext context) {
  return Scaffold(
    backgroundColor: Colors.transparent, // 让Scaffold透明,透出系统窗口的透明区域
    body: GestureDetector(
      onPanStart: (_) => appWindow.startDragging(), // 允许在窗口区域内拖拽
      child: ClipPath(
        clipper: _CustomWindowClipper(), // 自定义裁剪器
        child: Container(
          color: Colors.white, // 窗口主体背景色
          child: Column(
            children: [
              // 自定义的最小化、最大化、关闭按钮区域
              // ...
              Expanded(child: Center(child: Text("自定义窗口内容")))
            ],
          ),
        ),
      ),
    ),
  );
}

3. 实现自定义裁剪器

根据你的需求绘制窗口轮廓路径,示例为顶部切角+圆角的形状:

class _CustomWindowClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    // 顶部中间切角路径
    path.moveTo(30, 0);
    path.lineTo(size.width - 30, 0);
    path.lineTo(size.width, 30);
    // 右下角圆角
    path.lineTo(size.width, size.height - 30);
    path.arcToPoint(Offset(size.width - 30, size.height), radius: const Radius.circular(30));
    // 左下角圆角
    path.lineTo(30, size.height);
    path.arcToPoint(Offset(0, size.height - 30), radius: const Radius.circular(30));
    path.lineTo(0, 30);
    path.close();
    return path;
  }

  @override
  bool shouldReclip(covariant CustomClipper<Path> oldClipper) => false;
}

注意事项

  • 确保bitsdojo_window使用最新版本,旧版本可能不支持窗口透明功能
  • 透明区域无法接收鼠标事件,所以拖拽、按钮交互都要放在裁剪后的UI区域内
  • 若需要窗口阴影,可通过BoxShadow结合Stack实现,系统默认阴影会因窗口透明失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:15:08