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,),
)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cyber Weekly #51

赛博新闻 1、英伟达开源新模型,性能直逼DeepSeek-R1 本周,英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型,该模型拥有2530亿参数,在多项基准测试中展现出与6710亿参数的…

【JS】关于原型/原型链

本文会讲解什么是原型,什么是原型链,以及查找原型的方法,最后会实现一个函数:判断某对象是否有某属性。 定义 原型:函数都有prototype属性,称作原型/原型对象 原型可以放一些方法和属性,共享…

deskflow使用教程:一个可以让两台电脑鼠标键盘截图剪贴板共同使用的开源项目

首先去开源网站下载:Release v1.21.2 deskflow/deskflow 两台电脑都要下载这个文件 下载好后直接打开找到你想要的exe desflow.exe 然后你打开他,将两台电脑的TLS都关掉 下面步骤两台电脑都要完成: 电脑点开edit-》preferences 把这个取…

啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!

一、啥是Spring,为啥选择它 我们平常说的Spring指的是Spring全家桶,我们为什么要选择Spring,看看官方的话: 意思就是:用这个东西,又快又好又安全,反正就是好处全占了,所以我们选择它…

正向代理 vs 反向代理:核心区别与应用场景详解

目录 代理服务器是什么? 正向代理(Forward Proxy)详解 工作原理 典型应用场景 优缺点分析 反向代理(Reverse Proxy)详解 工作原理 典型应用场景 优缺点分析 正向代理与反向代理的核心区别 对比表格 架构差异…

Matlab学习笔记五十:循环语句和条件语句的用法

1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…

容器初始化Spring Boot项目原理,即web项目(war)包涉及相关类对比详解

以下是关于 SpringBootServletInitializer、ServletContainerInitializer、SpringServletContainerInitializer、WebApplicationInitializer 和 ServletInitializer 的对比详解及总结表格: 1. 核心对比详解 (1) SpringBootServletInitializer 作用: S…

Linux 系统中打包与压缩

以下是 Linux 系统中 打包与压缩 的核心操作指南,涵盖常用命令、格式对比及典型场景应用: 一、核心概念 打包(Archiving) 将多个文件或目录合并为一个文件(如 .tar),不改变文件体积。常用工具&a…

计算机组成原理(哈工大,会持续更新)

文章目录 一 计算机组成概述1.1计算机系统简介 一 计算机组成概述 1.1计算机系统简介 计算机软硬件的概念 计算机系统包含两个部分一个部分为硬件,另一个部分为软件 硬件:硬件包括我们能直观看到的东西,也就是我们计算机的实体&#xff0…

ngx_conf_handler

定义在 src\core\ngx_conf_file.c static ngx_int_t ngx_conf_handler(ngx_conf_t *cf, ngx_int_t last) {char *rv;void *conf, **confp;ngx_uint_t i, found;ngx_str_t *name;ngx_command_t *cmd;name cf->args->elts;found 0;for (…

Ubuntu系统美化

Ubuntu系统美化 一、Grub设置 1. 安装Grub Customizer【推荐】 Grub Customizer是一个用于自定义 GRUB 引导菜单的实用程序 sudo add-apt-repository ppa:danielrichter2007/grub-customizer && sudo apt update && sudo apt install -y grub-customizer2.…

零基础HTML·笔记(持续更新…)

基础认知 HTML标签的结构 <strong>文字变粗</strong> &#xff1c;开始标签&#xff1e;内容&#xff1c;结束标签&#xff1e; 结构说明&#xff1a; 标签由<、>、1、英文单词或字母组成。并且把标签中<>包括起来的英文单词或字母称为标签名。常…

nmcli创建wpa-psk2 wifi热点

1. 创建新的WiFi连接&#xff1a; sudo nmcli connection add type wifi ifname wlan0 con-name WiFi名称 autoconnect yes ssid WiFi名称 2. 配置接入点模式和IP共享&#xff1a; sudo nmcli connection modify WiFi名称 802-11-wireless.mode ap 802-11-wireless.band …

【消息队列kafka_中间件】一、快速入门分布式消息队列

在当今大数据和分布式系统盛行的时代&#xff0c;消息队列作为一种关键的中间件技术&#xff0c;发挥着举足轻重的作用。其中&#xff0c;Apache Kafka 以其卓越的性能、高可扩展性和强大的功能&#xff0c;成为众多企业构建分布式应用的首选消息队列解决方案。本篇文章将带你深…

在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布

2025年4月11日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.7 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;Oracle数据源支持获取和查询物化视图&#xff1b;图表方面&#xff0c;在线地图支持天地图、腾讯地图&#xff1b;新增子弹图&…

【Linux实践系列】:匿名管道收尾+完善shell外壳程序

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生总会有自己能力所不及的范围&#xff0c;但是如果你在你能力所及的范围尽了全部的努力&#xff0c;那你还有什么遗…

【C++初学】课后作业汇总复习(七) 指针-深浅copy

1、 HugeInt类:构造、、cout Description: 32位整数的计算机可以表示整数的范围近似为&#xff0d;20亿到&#xff0b;20亿。在这个范围内操作一般不会出现问题&#xff0c;但是有的应用程序可能需要使用超出上述范围的整数。C可以满足这个需求&#xff0c;创建功能强大的新的…

【C++】 —— 笔试刷题day_16

刷题_day16&#xff0c;继续加油啊 一、字符串替换 题目解析 这道题是一道简单的字符题目&#xff0c;题目给我们一个字符串A&#xff0c;和n表示A字符串的长度&#xff0c;再给出一个字符数组arg&#xff0c;m表示arg中是数据个数。 然我们在字符串A中找到%s然后替换成arg中的…

n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)

n8n 本地部署及实践应用&#xff0c;实现零成本自动化运营 Telegram 频道&#xff08;保证好使&#xff09; 简介 n8n 介绍 一、高度可定制性 二、丰富的连接器生态 三、自托管部署&#xff08;本地部署&#xff09; 四、社区驱动 n8n 的部署 一、前期准备 二、部署步…

flutter 桌面应用之系统托盘

系统托盘(Tray) 系统托盘就是状态栏里面对应的图标点击菜单 主要有两款框架 框架一句话评价tray_manager轻量、简单、易用&#xff0c;适合常规托盘功能system_tray更底层、更强大、支持图标/菜单/消息弹窗等更多功能&#xff0c;但复杂度更高 &#x1f9f1; 基础能力对比 …