flutter设置windows是否显示标题栏和状态栏和全屏显示

想要让桌面软件实现全屏和不显示状态栏或者自定义状态栏,就可以使用window_manager这个依赖库,使用起来还是非常方便的,可以自定义显示窗口大小和位置,还有设置标题栏是否展示等内容,也可以设置可拖动区域。官方仓库地址:window_manager | Flutter Package

github仓库地址:https://github.com/leanflutter/window_manager 

安装依赖

在pubspec.yaml文件中添加依赖:window_manager: ^0.3.7 ,并更新依赖库:pub get

初始化window

在main.dart中配置初始化:

void main() async {await windowManager.ensureInitialized();WindowOptions windowOptions = const WindowOptions(minimumSize: Size(400, 300),//设置窗口的最小尺寸maximumSize: Size(800, 600),//设置窗口的最大尺寸//window 设置窗口的初始尺寸size: Size(800, 500),//窗口是否居中center: true,//设置窗口的边缘背景色:是否透明backgroundColor: Colors.transparent,//true 表示在状态栏不显示程序:就是windows最底部的状态skipTaskbar: false,//true 表示设置Window一直位于最顶层:置顶alwaysOnTop: false,//hidden 表示隐藏标题栏 normal 窗体标题栏titleBarStyle: TitleBarStyle.normal,//设置窗口的标题:title: "WindowSettingTest",
);
windowManager.waitUntilReadyToShow(windowOptions, () async {//显示窗口await windowManager.show();//聚焦窗口await windowManager.focus();//ture设置窗口不可缩放 false 设置窗口可以缩放windowManager.setResizable(true); //设置窗口缩放宽高比windowManager.setAspectRatio(1.3); //设置窗口是否支持阴影windowManager.setHasShadow(true);//设置窗口模式:亮色模式和暗色模式windowManager.setBrightness(Brightness.dark);
});runApp(MyApp());}

配置标题栏不显示和背景色为绿色的样子: 

可拖拽设置

没有标题栏的话, 可能就没办法让窗口全屏或者退出全屏,或者没办法拖拽软件窗口位置,所以需要配置可拖拽,其实也很简单,只需要使用 DragToMoveArea 包裹一下可拖拽的内容即可:

监听窗口的退出键

混入WindowListener->监听Window事件->配置Window关闭按钮可拦截->重写Window的close事件

class _MyHomePageState extends State<MyHomePage> with WindowListener {@overridevoid initState() {super.initState();//监听Window事件windowManager.addListener(this);//配置Window关闭按钮可拦截windowManager.setPreventClose(true);}@overridevoid dispose() {windowManager.removeListener(this);super.dispose();}@overridevoid onWindowEvent(String eventName) {print("event:$eventName");super.onWindowEvent(eventName);}@overridevoid onWindowBlur() {print("onWindowBlur");super.onWindowBlur();}//重写Window的close事件@overridevoid onWindowClose() async {var isPreventClose = await windowManager.isPreventClose();if (!context.mounted) return;if (isPreventClose) {print("custom close  action");showDialog(context: context,builder: (_) {return AlertDialog(title: const Text("提示"),actions: [TextButton.icon(onPressed: () {Navigator.of(context).pop();windowManager.destroy();},icon: const Icon(Icons.close),label: const Text("确认")),TextButton.icon(onPressed: () {print("取消");Navigator.of(context).pop();var height = MediaQuery.of(context).size.height;var width = MediaQuery.of(context).size.width;print("size:${MediaQuery.of(context).size}");print("size:${window.physicalSize}");print("size:${MediaQuery.of(context).devicePixelRatio}");print("size:height${MediaQuery.of(context).devicePixelRatio * height},width:${MediaQuery.of(context).devicePixelRatio * width}");},icon: const Icon(Icons.remove),label: const Text("取消")),],);});} else {print("use system close action");}print("onWindowClose");super.onWindowClose();}@overridevoid onWindowDocked() {print("onWindowDocked");super.onWindowDocked();}@overridevoid onWindowEnterFullScreen() {print("onWindowEnterFullScreen");super.onWindowEnterFullScreen();}@overridevoid onWindowFocus() {// TODO: implement onWindowFocussuper.onWindowFocus();print("onWindowEnterFullScreen");setState(() {});}@overridevoid onWindowLeaveFullScreen() {// TODO: implement onWindowLeaveFullScreensuper.onWindowLeaveFullScreen();print("onWindowLeaveFullScreen");}@overridevoid onWindowMaximize() {// TODO: implement onWindowMaximizesuper.onWindowMaximize();print("onWindowMaximize");}@overridevoid onWindowMinimize() {// TODO: implement onWindowMinimizesuper.onWindowMinimize();print("onWindowMinimize");}@overridevoid onWindowMove() {// TODO: implement onWindowMovesuper.onWindowMove();print("onWindowMove");}@overridevoid onWindowMoved() {// TODO: implement onWindowMovedsuper.onWindowMoved();print("onWindowMove");}@overridevoid onWindowResize() {// TODO: implement onWindowResizesuper.onWindowResize();print("onWindowResize");}@overridevoid onWindowResized() {// TODO: implement onWindowResizedsuper.onWindowResized();print("onWindowResized");}@overridevoid onWindowRestore() {// TODO: implement onWindowRestoresuper.onWindowRestore();print("onWindowRestore");}@overridevoid onWindowUndocked() {// TODO: implement onWindowUndockedsuper.onWindowUndocked();print("onWindowUndocked");}@overridevoid onWindowUnmaximize() {// TODO: implement onWindowUnmaximizesuper.onWindowUnmaximize();print("onWindowUnmaximize");}

自定义标题栏 

标题栏新增功能按钮及自定义标题栏,实现窗口的最大化、最小化、恢复为上一次的状态、关闭;

隐藏原有标题栏->自定义标题栏->调用Window API实现相关API

class _TitleBarWidgetState extends State<TitleBarWidget> {@overrideWidget build(BuildContext context) {var iconSize = const Size(14, 14);var backgroundSize = const Size(30, 30);var maxButtonIcons = WindowButtonIcons(SvgPicture.asset('assets/images/max.svg'),SvgPicture.asset('assets/images/max.svg'),SvgPicture.asset('assets/images/max.svg'));var minButtonIcons = WindowButtonIcons(SvgPicture.asset('assets/images/min.svg'),SvgPicture.asset('assets/images/min.svg'),SvgPicture.asset('assets/images/min.svg'));var closeButtonIcons = WindowButtonIcons(SvgPicture.asset('assets/images/close.svg'),SvgPicture.asset('assets/images/close_down.svg'),SvgPicture.asset('assets/images/close_mouse_over.svg'));return Container(padding: EdgeInsets.all(titleBarTopAndBottomMargin),child: Row(mainAxisAlignment: MainAxisAlignment.end,children: [//可拖动区域Expanded(child: DragToMoveArea(child: Container(),)),// 可任意添加其他功能按钮     ...//自定义最小化按钮MinimizeWindowButton(backgroundSize:backgroundSize,iconSize:iconSize,icons: minButtonIcons,),//自定义最大化按钮MaximizeWindowButton(backgroundSize:backgroundSize,iconSize: iconSize,icons: maxButtonIcons,// onPressed: (){//   updateRegistryTest(true);// },),//自定义关闭窗口按钮CloseWindowButton(backgroundSize: backgroundSize,iconSize: iconSize,icons: closeButtonIcons,),],),);}
}

窗口最大化最小化:

windowManager.maximize()   窗口最大化
windowManager.minimize()  窗口最小化
windowManager.restore() 窗口恢复到之前状态
windowManager.setAlwaysOnTop()  设置窗口置顶
windowManager.setAlwaysOnBottom()  设置窗口置底
windowManager.close() 关闭窗口windowManager.destroy() 强制销毁窗口

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

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

相关文章

OpenHarmony当前进展和未来趋势

操作系统自20世纪50年代诞生&#xff0c;经历了从专用操作系统到通用操作系统的转变。整体可以将操作系统的发展历史分为3个阶段&#xff1a;PC时代、移动互联网时代、万物互联时代。 PC时代主要以计算机为主&#xff0c;用户规模从1970年的10亿增长到1990年的30亿。这一时代诞…

鸿蒙原生应用/元服务实战-DevEco Studio 模拟器资源经常不足

DevEco Studio 模拟器资源经常不足&#xff0c;模拟器是最方便和最广泛的开发者可以快速体验应用元服务效果的途径&#xff0c;还是要加强。 除了Wearable,其他都用不了。 只能用预览器看效果&#xff0c;或者使用远程真机或者本地真机了。 在API9&#xff0c;比如分享等&…

leetcode第 381 场周赛最后一题 差分,对称的处理

第 381 场周赛 - 力扣&#xff08;LeetCode&#xff09;最后一题3017. 按距离统计房屋对数目 II - 力扣&#xff08;LeetCode&#xff09; dijkstra超时了&#xff0c;看了灵神的解题方法力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff0c;其…

二.用户与权限管理(二)

用户与权限管理 5.角色管理5.1角色的理解5.2创建角色5.3给角色赋予权限5.4查看角色的权限5.5回收角色的权限5.6删除角色5.7给用户赋予角色5.8激活角色5.9撤销用户角色5.10设置强制角色(mandatory role) 6.配置文件的使用6.1配置文件格式6.2 启动命令与选项组6.3 特定MySQL版本的…

java数组ArrayList(存对象)

1、dade文件 package model;public class dade {private int id;private String name;public dade() {}public dade(int id, String name) {this.id id;this.name name;}public int getId() {return id;}public void setId(int id) {this.id id;}public String getName() {…

推荐IDEA一个小插件,实用性很高!!

插件&#xff1a; Convert YAML and Properties File 由于每个人的开发习惯不同&#xff0c;在开发过程中会遇到各种小细节的问题。今天给大家介绍一个小插件&#xff0c;作用不大&#xff0c;细节很足。 就是properties类型文件和yml文件互相自由转换 解决&#xff1a;…

【webrtc】neteq测试工程

设置git代理 $ git config --global http.https://github.com.proxy socks5://127.0.0.1:7890 git config --global https.https://github.com.proxy socks5://127.0.0.1:7890导入cmake直接构建 win32 debug v143 编译opus Build started...

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

【linux】 查看 Linux 重启历史记录(reboot)

了解 Linux 重启日志 /var/log 目录隐藏着 Linux 日志机制的核心信息&#xff0c;它是记录系统活动的宝贵仓库。然而&#xff0c;仅仅有日志还不够&#xff0c;真正的难题在于&#xff0c;如何从大量数据中提炼出与系统重启相关的关键信息。 在 /var/log 目录中&#xff0c;可…

简单但全面了解一下webSocket

文章目录 webSocket是一种协议&#xff0c;设计用于提供低延迟、双全工和长期运行的连接什么是实时通信&#xff1f; webSocket之前的世界webSocket的优势为什么需要心跳机制&#xff1f;webSocket的限制 webSocket是一种协议&#xff0c;设计用于提供低延迟、双全工和长期运行…

CRM系统的痛点,如何解决?

在当今竞争激烈的商业世界中&#xff0c;客户关系管理&#xff08;CRM&#xff09;数字化转型已经成为大企业成功的重要秘诀。大型跨国公司如亚马逊、苹果和微软等已经在CRM数字化方面走在了前列&#xff0c;实现了高度个性化的客户体验&#xff0c;加强了客户忠诚度。 然而&a…

Conda python管理环境environments 四 从入门到精通

Conda系列&#xff1a; 翻译: Anaconda 与 miniconda的区别Miniconda介绍以及安装Conda python运行的包和环境管理 入门Conda python管理环境environments 一 从入门到精通Conda python管理环境environments 二 从入门到精通Conda python管理环境environments 三 从入门到精通…

【Linux】解决能访问github但克隆不了的问题

文章目录 1.查看你的代理的地址&#xff1a;2.git设置3.尝试clone 1.查看你的代理的地址&#xff1a; 2.git设置 先看看当前的git设置 $ git config --list然后git中要设置好对应的地址 git config --global http.proxy 127.0.0.1:78903.尝试clone $ git clone https://git…

服务器感染了.wis[[Rast@airmail.cc]].wis勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; 在当今数字化的时代&#xff0c;恶意软件攻击已经变得越来越复杂和狡猾&#xff0c;[[MyFilewaifu.club]].wis [[backupwaifu.club]].wis[[Rastairmail.cc]].wis勒索病毒是其中的一种新威胁。本文91数据恢复将深入介绍[[MyFilewaifu.club]].wis [[backupwaif…

机器学习实验报告-集成学习

目录 一、集成学习介绍 1.1集成学习的引入 1.2集成学习发展史 1.3集成学习的学习组织方式 1.3.1并联组织关系 1.3.2串联组织关系 1.4集成学习及其实现方法概述 二、集成学习实现方法 2.1Boosting 2.1.1基本过程 2.1.2注意点 2.2bagging 2.2.1基本过程 2.2.2注意点…

QT实现USB通讯

一.概述 QT实现USB通讯这里主要介绍两种方法&#xff0c;一种是通过libusb库来实现usb通讯&#xff0c;一种是通过hidapi库实现通信。 1.介绍libusb库 libusb 是一个 C 库&#xff0c;提供对 USB 设备的通用访问。 可移植的&#xff1a;使用单个跨平台API&#xff0c;它可以…

一、防御保护---信息安全概述

一、网络安全防御---信息安全概述 1.信息安全现状及挑战1.1 网络空间安全市场在中国&#xff0c;潜力无穷1.2 数字化时代威胁升级1.3 传统安全防护逐步失效1.4 安全风险能见度不足1.5 缺乏自动化防御手段1.6 网络安全监管标准愈发严苛 2.信息安全概述2.1 简介2.2 常见的网络安全…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式&#xff08;Proxy Pattern&#xff09; 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁&#xff0c;但不推荐) 2.基于CGLIB实现 spring中应用 …

uniapp使用自定义组件

tt.vue中使用video-player组件 用到的目录如下&#xff1a; pages.json {"path": "pages/Tabbar/tt/tt","style": {"navigationBarTitleText": "","enablePullDownRefresh": false,// 使用自定义组件"using…

C++ 类定义

C 类定义 定义一个类需要使用关键字 class&#xff0c;然后指定类的名称&#xff0c;并类的主体是包含在一对花括号中&#xff0c;主体包含类的成员变量和成员函数。 定义一个类&#xff0c;本质上是定义一个数据类型的蓝图&#xff0c;它定义了类的对象包括了什么&#xff0…