今天跟着大家一起学习桌面开发之窗口管理,关于桌面窗口管理,我网上查了很久资料,我觉得window_manager 这个插件几乎可以满足市面上大部分需求了,地址
window_manager:https://pub.flutter-io.cn/packages/window_manager
安装
将此添加到你的软件包的 pubspec.yaml 文件:
dependencies: window_manager: ^0.2.7 全局初始化
import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // 必须加上这一行。 await windowManager.ensureInitialized(); runApp(MyApp()); } 常用方法
- waitUntilReadyToShow
等待,直到准备好展示。
- destroy
强制关闭窗口。
- close
试着把窗口关上。
- isPreventClose
检查是否正在拦截本地关闭信号。
- setPreventClose
设置是否拦截本机关闭信号。当与onclose事件监听器结合使用时可能有用。这也将防止手动触发的关闭事件。
- focus
聚焦在窗口上。
- blur
从窗口移除焦点。
- isFocused
返回bool -窗口是否聚焦。
- show
显示并给予窗口焦点。
- hide
隐藏窗口。
- isVisible
返回bool -该窗口是否对用户可见。
- isMaximized
返回bool -窗口是否被最大化。
- maximize
最大化窗口。只在Windows上工作
- unmaximize
Unmaximizes the window.
- isMinimized
返回bool -窗口是否最小化。
- minimize
最小化窗口。在某些平台上,最小化的窗口将显示在码头上。
- restore
将窗口从最小化状态恢复到以前的状态。
- isFullScreen
返回bool -窗口是否处于全屏模式。
- setFullScreen
设置窗口是否应处于全屏模式。
- setAspectRatio
这将使窗口保持一个纵横比。
- setBackgroundColor
设置窗口的背景颜色。
- setAlignment
将窗口移动到与屏幕对齐的位置。
- center
将窗口移动到屏幕中央。
- getBounds
返回矩形-窗口的边界作为对象。
- setBounds
调整窗口的大小并将其移动到所提供的边界。
- getSize
返回大小-包含窗口的宽度和高度。
- setSize
将窗口调整为宽度和高度。
- getPosition
返回偏移量-包含窗口的当前位置。
- setPosition
移动窗口到位置。
- setMinimumSize
将窗口的最小大小设置为宽度和高度。
- setMaximumSize
将窗口的最大大小设置为宽和高。
- isResizable
返回bool -窗口是否可以由用户手动调整大小。
- setResizable
设置窗口是否可由用户手动调整大小。
- isMovable (macos)
返回bool -窗口是否可以被用户移动。
- setMovable (macos)
设置用户是否可以移动窗口。
- isMinimizable (macos windows)
返回bool -该窗口是否可以由用户手动最小化。
- setMinimizable (macos windows)
设置窗口是否可以由用户手动最小化。
- isClosable (windows)
返回bool -是否可以由用户手动关闭窗口。
- isMaximizable (windows)
返回bool -该窗口是否可以由用户手动最大化。
- setMaximizable
设置窗口是否可以由用户手动最大化。
- setClosable (macos windows)
设置窗口是否可以由用户手动关闭。
- isAlwaysOnTop
返回bool -该窗口是否总是在其他窗口之上
- setAlwaysOnTop
设置窗口是否始终显示在其他窗口的顶部。
- isAlwaysOnBottom
返回bool -该窗口是否总是低于其他窗口。
- setAlwaysOnBottom (linux)
设置窗口是否始终显示在其他窗口的下方。
- getTitle
返回字符串-本机窗口的标题。
- setTitle
将本机窗口的标题更改为title。
- setTitleBarStyle
更改本机窗口的标题栏样式。
- getTitleBarHeight
返回int -本机窗口的标题栏高度。
- isSkipTaskbar
返回bool -是否启用跳过任务栏。
- setSkipTaskbar
使窗口不显示在任务栏/ dock中。
- setProgressBar (macos)
在进度条中设置进度值。有效范围是[0,1.0]。
- setIcon (windows)
设置窗口/任务栏图标。
- hasShadow ( macos windows)
返回bool -窗口是否有阴影。在Windows上,总是返回true,除非窗口是无框架的。
- setHasShadow (macos windows)
设置窗口是否应该有阴影。在Windows上,它不做任何事情,除非窗口是无框架的。
- getOpacity
返回0.0(完全透明)和1.0(完全不透明)之间的double -。
- setOpacity
设置窗口的不透明度。
- setBrightness ( macos windows)
设置窗口的亮度。
- setIgnoreMouseEvents
使窗口忽略所有鼠标事件。
在此窗口中发生的所有鼠标事件将被传递到此窗口下方的窗口,但如果此窗口具有焦点,它仍将接收键盘事件。
- startDragging
根据指定的鼠标下拉事件启动窗口拖动。
- startResizing (linux windows)
根据指定的鼠标下按和鼠标移动事件启动窗口调整大小。
最后我根据自己的业务需要整理成一个WindowUtil,方便扩展和使用
import 'package:flutter/material.dart'; import 'package:window_manager/window_manager.dart'; class WindowUtil { ///默认透明度 static final double defaultOpacity = 0.9; ///是否浮窗 static bool isOnTop = false; ///窗口初始化设置 static Future ensureInitialized() async { return await windowManager.ensureInitialized(); } ///初始化参数配置,这里根据自己的模块业务而定,我窗口默认是140,210 static void setWindowFunctions({bool? isMacOS}) async { WindowOptions windowOptions = WindowOptions( size: Size(140, 210), center: true, backgroundColor: Colors.transparent, //设置窗口是否显示在 任务栏或 Dock 上 skipTaskbar: false, titleBarStyle: isMacOS == true ? TitleBarStyle.normal : TitleBarStyle.hidden, ); windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); await windowManager.focus(); }); //设置当前窗口在屏幕的位置 // windowManager.setPosition(Offset.zero); windowManager.center(); //设置背景 //设置窗口透明度 // setOpacity(opacity: defaultOpacity); //设置是否可移动macOS windowManager.setMovable(true); //设置是否有阴影macOS windowManager.setHasShadow(false); //设置窗口是否可以由用户手动调整大小 windowManager.setResizable(true); //设置标题 windowManager.setTitle(''); //设置窗口是否总是显示在其他窗口的顶部 windowManager.setAlwaysOnTop(false); if (isMacOS == true) { //设置用户是否可以手动关闭该窗口 windowManager.setClosable(false); } else { windowManager.setClosable(true); windowManager.setPreventClose(true); } } //设置拖动窗口 static void startDragging() async { await windowManager.startDragging(); } //关闭窗口 static void close() async { windowManager.destroy(); } //设置窗口透明度 static void setOpacity([double? opacity]) async { opacity ??= defaultOpacity; //设置背景 // windowManager // .setBackgroundColor(AppColors.primaryColor.withOpacity(opacity)); windowManager.setBackgroundColor(Colors.transparent); //透明度小于0.1时,不设置setOpacity,避免窗口看不见 if (opacity >= 0.1) { //设置窗口透明度 windowManager.setOpacity(opacity); } } //设置浮窗 static void setAlwaysOnTop([bool? isAlwaysOnTop]) { isOnTop = isAlwaysOnTop ?? false; //设置窗口是否总是显示在其他窗口的顶部 windowManager.setAlwaysOnTop(isAlwaysOnTop ?? false); } } 效果图
