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.rhkb.cn/news/246020.html

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

相关文章

万界星空科技可视化数据大屏的作用

随着科技的不断发展和进步&#xff0c;当前各种数据化的设备也是如同雨后春笋般冒了出来&#xff0c;并且其可以说是给我们带来了极大的便利的。在这其中&#xff0c;数据大屏就是非常具有代表性的一个例子。 数据大屏的主要作用包括&#xff1a; 数据分析&#xff1a;数据大屏…

【mongoDB】文档 CRUD

目录 1.插入文档 批量插入&#xff1a; 2.查询文档 3.更新文档 4.删除文档 deleteOne() deleteMany() findOneAndDelete() 1.插入文档 可以使用 insert () 方法或者 save() 方法向集合中插入文档 语法如下&#xff1a; db.collection_name.insert(document) collectio…

软考培训机构哪家比较好?各软考培训机构排名如何?

先放上机构测评图 一、机构情况 &#xff08;1&#xff09;主营业务 大多数软考培训机构主要致力于IT培训或者软件行业。这些机构的课程更加专业&#xff0c;因为他们起源于该行业。我相信报考软考的同学大部分也是从事这个行业的。个人认为选择这类机构进行培训会有更多好处…

[C#]winform部署yolov5实例分割模型onnx

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 YOLOv5实例分割是目标检测算法的一个变种&#xff0c;主要用于识别和分割图像中的多个物体。它是在YOLOv5的基础上&#xff0c;通过添加一个实例分割模块来实现的。 在实例分割中&#xff0c;算法不仅…

C++输入输出流

输入/输出流类&#xff1a;iostream---------i input&#xff08;输入&#xff09; o output&#xff08;输出&#xff09; stream&#xff1a;流 iostream&#xff1a; istream类&#xff1a;输入流类-------------cin&#xff1a;输入流类的对象 ostre…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

爬虫(一)

1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;…

【Python】02快速上手爬虫案例二:搞定验证码

文章目录 前言1、不要相信什么验证码的库2、以古诗文网为例&#xff0c;获取验证码1&#xff09;code_result.py2&#xff09;gsw.py 前言 提示&#xff1a;以古诗文网为例&#xff0c;获取验证码&#xff1a; 登录&#xff1a;https://so.gushiwen.cn/user/login.aspx 1、不…

牛刀小试 - C++ 推箱子小游戏

参考文档 C笔记&#xff1a;推箱子小游戏 copy函数 memcpy()函数用法&#xff08;可复制数组&#xff09; 使用memcpy踩出来的坑&#xff0c;值得注意 完整代码 /********************************************************************* 程序名:推箱子小游戏 说明&#x…

无状态应用管理Deployment

无状态应用管理Deployment 1、Deployment介绍 Deployment一般用于部署公司的无状态服务。 格式&#xff1a; apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx …

2024亚马逊开店教程:开店准备与注册流程指南

随着新一年的到来&#xff0c;亚马逊开启了新一轮的卖家入驻&#xff0c;并且针对新卖家优化了入驻流程&#xff0c;下面为大家简单整理一下最新亚马逊入驻教程&#xff0c;有想要入驻开店的小伙伴速速看过来&#xff01; 一、开店前准备 1、账号环境准备 为了防止账号由于网…

k8s实例

k8s实例举例 &#xff08;1&#xff09;Kubernetes 区域可采用 Kubeadm 方式进行安装。 &#xff08;2&#xff09;要求在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff0c;Pod使用动态PV类型的存储卷挂载…

Python 数据分析实战——为什么销售额减少?酒卷隆治_案例1

# 为什么黑猫游戏的销售额会减少&#xff1f; # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&…

使用代码取大量2*2像素图片各通道均值,存于Excel文件中。

任务是取下图RGB各个通道的均值及标签&#xff08;R, G&#xff0c;B&#xff0c;Label&#xff09;,其中标签由图片存放的文件夹标识。由于2*2像素图片较多&#xff0c;所以将结果放置于Excel表格中&#xff0c;之后使用SVM对他们进行分类。 from PIL import Image import os …

C++(搜索二叉树)

目录 前言&#xff1a; 1.二叉搜索树 1.1二叉搜索树的定义 1.2二叉搜索树的特点 2.二叉搜索树的实现 2.1框架 2.2查找 2.3插入 2.4删除 1.右子树为空 2.左子树为空 3.左右都不为空 3.递归版本 3.1前序遍历 3.2中序遍历 3.3后续遍历 3.4查找&#xff08;递…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展&#xff0c;机房及其配套设施的数量持续攀升&#xff0c;它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石&#xff0c;机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营&#xff0c;同时也直…

Linux编译器-gcc/g++

文章目录 前言预处理头文件展开条件编译 编译汇编链接 函数库静态库动态库 gcc选项 前言 gcc/g是Linux中的编译器&#xff0c;vim是Linux中的编辑器。要想将代码运行起来还需要编译才可实现。 本篇文章&#xff0c;主要通过预处理、编译、汇编、链接来介绍gcc/g。 预处理 预…

8.6 代理设计模式

文章目录 一、代理模式&#xff08;Proxy Pattern&#xff09;概述二、代理模式和观察者设计模式三、模式结构四、协作角色五、实现策略六、相关模式七、示例八、应用 一、代理模式&#xff08;Proxy Pattern&#xff09;概述 代理模式是一种设计模式&#xff0c;它通过引入一个…

【Unity学习笔记】第十一 · 动画基础(Animation、状态机、root motion、bake into pose、blendTree、大量案例)

转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132081959 作者&#xff1a;CSDN|Ringleader| 如果本文对你有帮助&#xff0c;不妨点赞收藏关注一下&#xff0c;你的鼓励是我前进最大的动力&#xff01;ヾ(≧▽≦*)o 主…

AI编译器的后端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…