This plugin allows Flutter desktop apps to resizing and repositioning the window.
English | 简体中文
macos
windows
macos
windows
windows
windows
windows
windows
macos
macos
macos
windows
macos
windows
windows
macos
windows
macos
windows
linux
windows
macos
windows
windows
macos
macos
macos
macos
windows
macos
windows
linux
windows
linux
linux
macos
windows
macos
windows
windows
windows
Linux | macOS | Windows |
---|---|---|
✔️ | ✔️ | ✔️ |
Add this to your package's pubspec.yaml
file:
dependencies:
window_manager: ^0.4.2
Or
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());
}
Please see the example app of this plugin for a full example.
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
}
}
If you need to use the hide method, you need to disable QuitOnClose
.
Change the file macos/Runner/AppDelegate.swift
as follows:
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();
},
),
],
);
},
);
}
}
}
Change the file linux/my_application.cc
as follows:
...
// 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));
}
...
Change the file macos/Runner/MainFlutterWindow.swift
as follows:
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()
+ }
}
Change the file windows/runner/win32_window.cpp
as follows:
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);
Since flutter 3.7 new windows project
Change the file windows/runner/flutter_window.cpp
as follows:
bool FlutterWindow::OnCreate() {
...
flutter_controller_->engine()->SetNextFrameCallback([&]() {
- this->Show();
+ "" //delete this->Show()
});
Make sure to call setState
once on the onWindowFocus
event.
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
}
}
Wait until ready to show.
Force closing the window.
Try to close the window.
Check if is intercepting the native close signal.
Set if intercept the native close signal. May useful when combine with the onclose event listener. This will also prevent the manually triggered close event.
Focuses on the window.
macos
windows
Removes focus from the window.
macos
windows
Returns bool
- Whether window is focused.
Shows and gives focus to the window.
Hides the window.
Returns bool
- Whether the window is visible to the user.
Returns bool
- Whether the window is maximized.
Maximizes the window. vertically
simulates aero snap, only works on Windows
Unmaximizes the window.
Returns bool
- Whether the window is minimized.
Minimizes the window. On some platforms the minimized window will be shown in the Dock.
Restores the window from minimized state to its previous state.
Returns bool
- Whether the window is in fullscreen mode.
Sets whether the window should be in fullscreen mode.
windows
Returns bool
- Whether the window is dockable or not.
windows
Returns bool
- Whether the window is docked.
windows
Docks the window. only works on Windows
windows
Undocks the window. only works on Windows
This will make a window maintain an aspect ratio.
Sets the background color of the window.
Move the window to a position aligned with the screen.
Moves window to the center of the screen.
Returns Rect
- The bounds of the window as Object.
Resizes and moves the window to the supplied bounds.
Returns Size
- Contains the window's width and height.
Resizes the window to width
and height
.
Returns Offset
- Contains the window's current position.
Moves window to position.
Sets the minimum size of window to width
and height
.
Sets the maximum size of window to width
and height
.
Returns bool
- Whether the window can be manually resized by the user.
Sets whether the window can be manually resized by the user.
macos
Returns bool
- Whether the window can be moved by user.
macos
Sets whether the window can be moved by user.
macos
windows
Returns bool
- Whether the window can be manually minimized by the user.
macos
windows
Sets whether the window can be manually minimized by user.
windows
Returns bool
- Whether the window can be manually closed by user.
macos
windows
Returns bool
- Whether the window can be manually maximized by the user.
Sets whether the window can be manually maximized by the user.
macos
windows
Sets whether the window can be manually closed by user.
Returns bool
- Whether the window is always on top of other windows.
Sets whether the window should show always on top of other windows.
Returns bool
- Whether the window is always below other windows.
linux
windows
Sets whether the window should show always below other windows.
Returns String
- The title of the native window.
Changes the title of native window to title.
Changes the title bar style of native window.
Returns int
- The title bar height of the native window.
Returns bool
- Whether skipping taskbar is enabled.
Makes the window not show in the taskbar / dock.
macos
windows
Sets progress value in progress bar. Valid range is [0, 1.0].
windows
Sets window/taskbar icon.
macos
Returns bool
- Whether the window is visible on all workspaces.
macos
Sets whether the window should be visible on all workspaces.
Note: If you need to support dragging a window on top of a fullscreen window on another screen, you need to modify MainFlutterWindow to inherit from NSPanel
class MainFlutterWindow: NSPanel {
// ...
}
macos
Set/unset label on taskbar(dock) app icon
Note that it's required to request access at your AppDelegate.swift like this: UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge])
macos
windows
Returns bool
- Whether the window has a shadow. On Windows, always returns true unless window is frameless.
macos
windows
Sets whether the window should have a shadow. On Windows, doesn't do anything unless window is frameless.
Returns double
- between 0.0 (fully transparent) and 1.0 (fully opaque).
Sets the opacity of the window.
Sets the brightness of the window.
Makes the window ignore all mouse events.
All mouse events happened in this window will be passed to the window below this window, but if this window has focus, it will still receive keyboard events.
Starts a window drag based on the specified mouse-down event.
linux
windows
Starts a window resize based on the specified mouse-down & mouse-move event.
linux
Grabs the keyboard.
linux
Ungrabs the keyboard.
Emitted when the window is going to be closed.
Emitted when the window gains focus.
Emitted when the window loses focus.
Emitted when window is maximized.
Emitted when the window exits from a maximized state.
Emitted when the window is minimized.
Emitted when the window is restored from a minimized state.
Emitted after the window has been resized.
macos
windows
Emitted once when the window has finished being resized.
Emitted when the window is being moved to a new position.
macos
windows
Emitted once when the window is moved to a new position.
Emitted when the window enters a full-screen state.
Emitted when the window leaves a full-screen state.
windows
Emitted when the window entered a docked state.
windows
Emitted when the window leaves a docked state.
Emitted all events.