当前位置: 首页 > news >正文

flutter 桌面应用之窗口自定义

在开发桌面软件的时候我们经常需要配置软件的窗口的大小以及位置
我们有两个框架选择:window_manager和bitsdojo_window


对比bitsdojo_window

特性bitsdojo_windowwindow_manager
自定义标题栏✅ 支持❌ 不支持
控制窗口行为(大小/位置)✅(基本)✅(更全面)
拖动窗口自定义区域
是否保留原生边框❌(默认隐藏)✅(保留系统默认)
最小化/最大化/关闭功能
监听窗口事件
跨平台支持Windows, macOS, LinuxWindows, macOS, Linux

组合使用建议

实际上,很多 Flutter 桌面项目会 同时使用这两个库

  • bitsdojo_window 自定义 UI 和拖动区域;

  • window_manager 控制窗口行为(比如窗口置顶、限制大小、获取当前窗口状态)。

bitsdojo_window支持的特性 

- 自定义窗口框架 - 移除 Windows/macOS/Linux 的标准标题栏和按钮
- 启动时隐藏窗口
- 显示/隐藏窗口
- 使用 Flutter 小部件移动窗口
- 最小化/最大化/恢复/关闭窗口
- 设置窗口大小、最小尺寸和最大尺寸
- 设置窗口位置
- 设置窗口在屏幕上的对齐方式(居中/左上/右上/左下/右下)
- 设置窗口标题


hello word

在flutter启动时设置窗口样式

void main() async {
  runApp(const MyApp());

  doWhenWindowReady(() async {
    final win = appWindow;
    const initialSize = Size(300, 450);
    win.minSize = initialSize;
    win.size = initialSize;
    win.alignment = Alignment.center;
    win.title = "Custom window with Flutter";
    win.show();
  });
}

在MainFlutterWindow 中增加

在您的应用程序文件夹中,转到macos\runner\MainFlutterWindow.swift并在以下行后添加此行import FlutterMacOS

import FlutterMacOS
import bitsdojo_window_macos // Add this line

然后将此行从:

class MainFlutterWindow: NSWindow {

对此:

class MainFlutterWindow: BitsdojoWindow {

更改后NSWindow,在BitsdojoWindow更改的行下方添加以下行:

override func bitsdojo_window_configure() -> UInt {
  return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
}

您的代码现在应如下所示:

class MainFlutterWindow: BitsdojoWindow {
    
  override func bitsdojo_window_configure() -> UInt {
    return BDW_CUSTOM_FRAME | BDW_HIDE_ON_STARTUP
  }
    
  override func awakeFromNib() {
    ... //rest of your code

如果您不想使用自定义框架而更喜欢标准窗口标题栏和按钮,则可以BDW_CUSTOM_FRAME从上面的代码中删除标志。

如果您不想在启动时隐藏窗口,您可以BDW_HIDE_ON_STARTUP从上面的代码中删除标志。

运行效果

 

自定义topbar

mac平台不能自定义 关闭/缩小/放大,windows可以

dojo_window windowbutton 用于这三者的基础封装,有三个实现

组件名说明
MinimizeWindowButton()最小化按钮
MaximizeWindowButton()最大化按钮
CloseWindowButton()关闭按钮
WindowButtons(自定义)通常你会组合多个按钮形成自己的窗口按钮区域

WindowButton 参数详解

这是核心组件,其他三个按钮都基于它封装:

WindowButton({
  required VoidCallback onPressed,
  required WindowButtonColors colors,
  required Widget icon,
  bool animate = true,
  double? iconSize,
})

参数说明:

参数名类型说明
onPressedVoidCallback点击按钮的事件处理函数(比如最小化窗口)
colorsWindowButtonColors定义按钮在不同状态下的颜色(常用)
iconWidget按钮显示的图标,一般是 Icon(Icons.XXX)
animatebool是否启用 hover 动画(默认开启)
iconSizedouble?图标大小(可选,默认 10~16)

WindowButtonColors

用于自定义按钮颜色

WindowButtonColors({
  required Color iconNormal,
  required Color mouseOver,
  required Color mouseDown,
  required Color iconMouseOver,
  required Color iconMouseDown,
})

示例说明:

属性名说明
iconNormal默认状态下图标颜色
mouseOver鼠标悬停时的按钮背景颜色
mouseDown鼠标点击时的按钮背景颜色
iconMouseOver悬停时的图标颜色
iconMouseDown点击时的图标颜色

✅ 示例用法

CloseWindowButton(
  colors: WindowButtonColors(
    iconNormal: Colors.white,
    mouseOver: Colors.red,
    mouseDown: Colors.redAccent,
    iconMouseOver: Colors.white,
    iconMouseDown: Colors.white,
  ),
)

或者使用 WindowButton 自定义:

WindowButton(
  onPressed: () => print("Clicked!"),
  icon: Icon(Icons.settings, size: 14, color: Colors.white),
  colors: WindowButtonColors(
    iconNormal: Colors.white,
    mouseOver: Colors.blueGrey,
    mouseDown: Colors.blue,
    iconMouseOver: Colors.white,
    iconMouseDown: Colors.white,
  ),
)

相关文章:

  • 【Ubuntu】【树莓派】Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问和文件传输操作
  • PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全
  • 程序化广告行业(83/89):行业术语与4A广告代理公司解析
  • idea 2024 build菜单不见了
  • AUTOSAR图解==>AUTOSAR_SWS_TimeSyncOverFlexRay
  • Week 1: Time Complexity, Rectangle Geometry
  • 基于Termux的Android平台C++控制台程序开发指南
  • 速盾:高防CDN的原理和高防IP一样吗?
  • yum的基本操作和vim指令
  • 深翻页问题剖析与解决方案:原理与 Java 实践
  • 链表-算法小结
  • Pytorch深度学习框架60天进阶学习计划 - 第41天:生成对抗网络进阶(一)
  • 《LNMP架构+Nextcloud私有云超维部署:量子级安全与跨域穿透实战》
  • 手动部署内网穿透
  • 有序数组的平方
  • 【云安全】云原生-centos7搭建/安装/部署k8s1.23.6单节点
  • 【开源项目】Excel手撕AI算法深入理解(二):Transformer
  • 头歌educoder——数据库 第10-11章
  • 对自己的优缺点评价
  • 导入 Excel 批量替换文件夹名称
  • 工程院院士、天气预报和动力气象学专家沈学顺加盟母校兰大
  • A股三大股指高位震荡收涨:黄金股大涨,两市成交11735亿元
  • 深一度|有望冲击首轮秀?杨瀚森走出舒适圈站上大舞台
  • 苏州1-4月进出口总值增长6.8%,工业机器人出口额倍增
  • 益阳通报“河水颜色异常有死鱼”:未发现排污,原因待鉴定
  • 国家统计局:4月全国城镇调查失业率为5.1%,比上月下降0.1个百分点