Flutter桌面开发之窗口管理

简介: 今天跟着大家一起学习桌面开发之窗口管理,关于桌面窗口管理,我网上查了很久资料,我觉得window_manager 这个插件几乎可以满足市面上大部分需求了

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

效果图

image.png

相关文章
|
1月前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
|
28天前
|
开发者
鸿蒙Flutter实战:07-混合开发
鸿蒙Flutter混合开发支持两种模式:1) 基于har包,便于主项目开发者无需关心Flutter细节,但不支持热重载;2) 基于源码依赖,利于代码维护与热重载,需配置Flutter环境。项目结构包括AppScope、flutter_module等目录,适用于不同开发需求。
69 3
|
13天前
|
传感器 开发框架 物联网
鸿蒙next选择 Flutter 开发跨平台应用的原因
鸿蒙(HarmonyOS)是华为推出的一款旨在实现多设备无缝连接的操作系统。为了实现这一目标,鸿蒙选择了 Flutter 作为主要的跨平台应用开发框架。Flutter 的跨平台能力、高性能、丰富的生态支持和与鸿蒙系统的良好兼容性,使其成为理想的选择。通过 Flutter,开发者可以高效地构建和部署多平台应用,推动鸿蒙生态的快速发展。
114 0
|
15天前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
55 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
74 7
|
28天前
|
编解码 Dart API
鸿蒙Flutter实战:06-使用ArkTs开发Flutter鸿蒙插件
本文介绍了如何开发一个 Flutter 鸿蒙插件,实现 Flutter 与鸿蒙的混合开发及双端消息通信。通过定义 `MethodChannel` 实现 Flutter 侧的 token 存取方法,并在鸿蒙侧编写 `EntryAbility` 和 `ForestPlugin`,使用鸿蒙的首选项 API 完成数据的读写操作。文章还提供了注意事项和参考资料,帮助开发者更好地理解和实现这一过程。
56 0
|
28天前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
47 0
|
2月前
|
JSON Dart Java
flutter开发多端平台应用的探索
flutter开发多端平台应用的探索
50 6
|
2月前
|
JSON Dart Java
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
|
2月前
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
73 6