该插件允许Flutter Desktop应用程序调整和重新定位窗口。
英语| 简体中文
macos windowsmacos windowswindowswindowswindowswindowsmacosmacosmacos windowsmacos windowswindowsmacos windowsmacos windowslinux windowsmacos windowswindowsmacosmacosmacosmacos windowsmacos windowslinux windowslinuxlinuxmacos windowsmacos windowswindowswindows| Linux | macos | 视窗 |
|---|---|---|
| ✔️ | ✔️ | ✔️ |
将其添加到包装的pubspec.yaml文件中:
dependencies :
window_manager : ^0.4.2或者
dependencies :
window_manager :
git :
url : https://github.com/leanflutter/window_manager.git
ref : main import 'package:flutter/material.dart' ;
import 'package:window_manager/window_manager.dart' ;
void main () async {
WidgetsFlutterBinding . ensureInitialized ();
// Must add this line.
await windowManager. ensureInitialized ();
WindowOptions windowOptions = WindowOptions (
size : Size ( 800 , 600 ),
center : true ,
backgroundColor : Colors .transparent,
skipTaskbar : false ,
titleBarStyle : TitleBarStyle .hidden,
);
windowManager. waitUntilReadyToShow (windowOptions, () async {
await windowManager. show ();
await windowManager. focus ();
});
runApp ( MyApp ());
}
请参阅此插件的示例应用程序以获取完整示例。
import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowEvent ( String eventName) {
print ( '[WindowManager] onWindowEvent: $ eventName ' );
}
@override
void onWindowClose () {
// do something
}
@override
void onWindowFocus () {
// do something
}
@override
void onWindowBlur () {
// do something
}
@override
void onWindowMaximize () {
// do something
}
@override
void onWindowUnmaximize () {
// do something
}
@override
void onWindowMinimize () {
// do something
}
@override
void onWindowRestore () {
// do something
}
@override
void onWindowResize () {
// do something
}
@override
void onWindowMove () {
// do something
}
@override
void onWindowEnterFullScreen () {
// do something
}
@override
void onWindowLeaveFullScreen () {
// do something
}
}如果需要使用隐藏方法,则需要禁用QuitOnClose 。
更改文件macos/Runner/AppDelegate.swift如下:
import Cocoa
import FlutterMacOS
@NSApplicationMain
class AppDelegate: FlutterAppDelegate {
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
- return true
+ return false
}
} import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
_init ();
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
void _init () async {
// Add this line to override the default close handler
await windowManager. setPreventClose ( true );
setState (() {});
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowClose () async {
bool _isPreventClose = await windowManager. isPreventClose ();
if (_isPreventClose) {
showDialog (
context : context,
builder : (_) {
return AlertDialog (
title : Text ( 'Are you sure you want to close this window?' ),
actions : [
TextButton (
child : Text ( 'No' ),
onPressed : () {
Navigator . of (context). pop ();
},
),
TextButton (
child : Text ( 'Yes' ),
onPressed : () {
Navigator . of (context). pop ();
await windowManager. destroy ();
},
),
],
);
},
);
}
}
}更改文件linux/my_application.cc如下:
...
// Implements GApplication::activate.
static void my_application_activate(GApplication* application) {
...
gtk_window_set_default_size(window, 1280, 720);
- gtk_widget_show(GTK_WIDGET(window));
+ gtk_widget_realize(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
gtk_widget_grab_focus(GTK_WIDGET(view));
}
...
更改文件macos/Runner/MainFlutterWindow.swift如下:
import Cocoa
import FlutterMacOS
+ import window_manager
class MainFlutterWindow: NSWindow {
override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.setFrame(windowFrame, display: true)
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
+ override public func order(_ place: NSWindow.OrderingMode, relativeTo otherWin: Int) {
+ super.order(place, relativeTo: otherWin)
+ hiddenWindowAtLaunch()
+ }
}
更改文件windows/runner/win32_window.cpp如下:
bool Win32Window::CreateAndShow(const std::wstring& title,
const Point& origin,
const Size& size) {
...
HWND window = CreateWindow(
- window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+ window_class, title.c_str(),
+ WS_OVERLAPPEDWINDOW, // do not add WS_VISIBLE since the window will be shown later
Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
Scale(size.width, scale_factor), Scale(size.height, scale_factor),
nullptr, nullptr, GetModuleHandle(nullptr), this);由于Flutter 3.7新Windows Project更改文件windows/runner/flutter_window.cpp如下:
bool FlutterWindow::OnCreate() {
...
flutter_controller_->engine()->SetNextFrameCallback([&]() {
- this->Show();
+ "" //delete this->Show()
});确保在onWindowFocus事件中调用setState一次。
import 'package:flutter/cupertino.dart' ;
import 'package:window_manager/window_manager.dart' ;
class HomePage extends StatefulWidget {
@override
_HomePageState createState () => _HomePageState ();
}
class _HomePageState extends State < HomePage > with WindowListener {
@override
void initState () {
super . initState ();
windowManager. addListener ( this );
}
@override
void dispose () {
windowManager. removeListener ( this );
super . dispose ();
}
@override
Widget build ( BuildContext context) {
// ...
}
@override
void onWindowFocus () {
// Make sure to call once.
setState (() {});
// do something
}
}
等到准备就绪。
武力关闭窗户。
尝试关闭窗口。
检查是否在拦截本机关闭信号。
设置如果拦截本机关闭信号。与OnClose事件侦听器结合使用时可能有用。这也将防止手动触发的关闭事件。
专注于窗口。
macos windows从窗户上取出聚焦。
macos windows返回bool - 窗口是否集中。
显示并将重点放在窗户上。
隐藏窗户。
返回bool - 用户是否可见窗口。
返回bool - 窗口是否最大化。
最大化窗口。 vertically模拟Aero快照,仅在Windows上起作用
删除窗口。
返回bool - 窗口是否最小化。
最小化窗口。在某些平台上,最小化的窗口将显示在码头中。
将窗口从最小化状态恢复到其先前的状态。
返回bool - 窗口是否处于全屏模式。
设置该窗口是否应处于全屏模式。
windows返回bool - 窗口是否可停靠。
windows返回bool - 窗口是否停靠。
windows停靠窗口。仅在Windows上工作
windows解开窗口。仅在Windows上工作
这将使窗口保持长宽比。
设置窗口的背景颜色。
将窗口移至与屏幕对齐的位置。
将窗口移到屏幕的中心。
返回Rect窗口的边界作为对象。
调整并将窗口移至提供的边界。
返回Size - 包含窗口的宽度和高度。
将窗口调整到width和height 。
返回Offset - 包含窗口的当前位置。
将窗口移至位置。
将窗户的最小尺寸设置为width和height 。
将窗口的最大尺寸设置为width和height 。
返回bool - 用户是否可以手动调整窗口。
设置用户是否可以手动调整窗口。
macos返回bool窗口是否可以由用户移动。
macos设置窗口是否可以由用户移动。
macos windows返回bool - 用户是否可以手动最小化窗口。
macos windows设置用户是否可以手动最小化窗口。
windows返回bool - 用户是否可以手动关闭窗口。
macos windows返回bool - 用户是否可以手动最大化窗口。
设置用户是否可以手动最大化窗口。
macos windows设置用户是否可以手动关闭窗口。
返回bool - 窗口是否始终位于其他窗口顶部。
设置窗口是否应始终在其他窗口的顶部显示。
返回bool - 窗口是否始终在其他窗口下方。
linux windows设置窗口是否应始终在其他窗口下方显示。
返回String - 本机窗口的标题。
将本机窗口的标题更改为标题。
更改本机窗口的标题条样式。
返回int本机窗口的标题条高度。
返回bool - 是否启用跳过任务栏。
使窗口未在任务栏 /码头中显示。
macos windows设置进度值中的进度值。有效范围是[0,1.0]。
windows设置窗口/任务栏图标。
macos返回bool是否在所有工作区中可见窗口。
macos设置是否应在所有工作区中可见窗口。
注意:如果您需要支持拖动另一个屏幕上全屏幕窗口顶部的窗口,则需要修改MainflutterWindow以从NSPANEL继承
class MainFlutterWindow : NSPanel {
// ...
} macos在任务栏(DOCK)应用程序图标上设置/未设置标签
请注意,需要在您的appdelegate.swift上请求访问。
macos windows返回bool - 窗户是否具有阴影。在Windows上,除非窗口无框,否则始终返回true。
macos windows设置窗口是否应该具有阴影。在Windows上,除非窗户无框,否则什么也不做。
返回double - 在0.0(完全透明)和1.0(完全不透明)之间。
设置窗口的不透明度。
设置窗户的亮度。
使窗口忽略所有鼠标事件。
此窗口中发生的所有鼠标事件都将传递到此窗口下方的窗口,但是如果此窗口有焦点,它仍然会接收键盘事件。
根据指定的鼠标向下事件启动窗口阻力。
linux windows根据指定的鼠标向下和鼠标移动事件启动窗口大小。
linux抓住键盘。
linux解开键盘。
窗口要关闭时发出。
当窗户获得聚焦时发出。
当窗户失去焦点时发出。
窗口最大化时发射。
当窗口从最大化状态退出时发出。
窗口最小化时发出。
从最小化状态恢复窗口时发出。
调整窗户大小后发出。
macos windows窗口完成大小时发出一次。
当窗口移至新位置时发出。
macos windows窗口移至新位置时发出一次。
当窗口进入全屏状态时发出。
当窗户留下全屏状态时发出。
windows窗口进入对接状态时发出。
windows当窗户留下对接状态时发出。
发出所有事件。
| 添加您的贡献 |
麻省理工学院