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

相关文章
|
2月前
|
存储 JavaScript 前端开发
盘点主流 Flutter 状态管理库2024
状态管理是每个应用不可缺少的,本文将会盘点下主流的状态管理包。
盘点主流 Flutter 状态管理库2024
Doodle Jump — 使用Flutter&Flame开发游戏真不错!
用Flutter&Flame开发游戏是一种什么体验?最近网上冲浪的时候,我偶然发现了一个国外的游戏网站,类似于国内的4399。在浏览时,我遇到了一款经典的小游戏:Doodle Jump...
112777 12
|
3月前
|
安全 Go 数据安全/隐私保护
Flutter开发笔记:Flutter路由技术
Flutter开发笔记:Flutter路由技术
346 0
|
3天前
|
开发框架 Android开发 开发者
构建未来:使用Flutter框架开发跨平台移动应用
【4月更文挑战第24天】 在移动应用的世界中,Android和iOS一直占据主导地位。然而,开发者经常面临一个难题:如何高效地为这两个平台构建和维护应用。传统的解决方案是分别为每个平台编写和维护独立的代码库,这不仅耗时且低效,还增加了开发成本。本文将深入探讨如何使用Google的Flutter框架来构建高性能、美观且能够在Android和iOS上无缝运行的跨平台移动应用。通过分析Flutter的架构、核心组件以及开发优势,我们将了解为何Flutter成为当今市场上最具潜力的跨平台解决方案。
|
18天前
|
移动开发 前端开发 JavaScript
移动端 Hybrid 开发:RN、Flutter与Webview的抉择与融合
【4月更文挑战第6天】本文对比了移动端Hybrid开发的三种主流方案——React Native (RN),Flutter和Webview。RN基于JavaScript,适合React熟练的团队,适用于性能要求高、跨平台的中大型应用。Flutter,使用Dart语言,以其高性能和自定义UI适用于追求极致体验的项目。Webview适合快速移植Web应用至移动端,开发成本低但性能受限。选择时要考虑项目规模、性能需求、团队技术栈等因素,实际应用中常采用混合策略,如RN/Flutter+Webview、原生模块集成等,以实现最佳开发效果和长期技术规划。
55 0
|
4月前
|
Dart
Flutter状态管理:RxDart,详细介绍
Flutter状态管理:RxDart,详细介绍 RxDart是一个基于Dart语言的响应式编程库,它提供了一套用于处理异步事件序列的工具。在Flutter应用中,RxDart可以很好地用于管理应用状态。
|
4月前
|
存储 前端开发
Flutter Provider状态管理---MVVM架构实战
Flutter Provider状态管理—MVVM架构实战 在Flutter中,状态管理是一个非常重要的概念。Flutter Provider是一种状态管理的解决方案,它提供了一种简单,灵活和高效的方法来管理Flutter应用程序中的状态。本文将详细介绍Flutter Provider的使用,以及如何在MVVM架构中使用它。
156 0
|
3月前
|
Linux 开发者 iOS开发
Flutter笔记:桌面端应用多窗口管理方案
Flutter笔记:桌面端应用多窗口管理方案
122 0
|
3月前
|
Linux 开发者 iOS开发
Flutter笔记:桌面应用 窗口定制库 bitsdojo_window
Flutter笔记:桌面应用 窗口定制库 bitsdojo_window
81 0