今天跟着大家一起学习桌面开发之窗口管理,关于桌面窗口管理,我网上查了很久资料,我觉得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);
}
}