該插件允許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當窗戶留下對接狀態時發出。
發出所有事件。
| 添加您的貢獻 |
麻省理工學院