Flutter's Desktop Windowing API: Multi-Window Support Arrives
The new Desktop Windowing API brings true multi-window support to Flutter desktop apps, with Canonical leading the charge.
Published on • September 17, 2026
AI Assistant

Flutter began as a mobile framework. Its architecture, APIs, and mental model were designed around the assumption that an application occupies a single screen on a handheld device. When Flutter expanded to desktop, this assumption created limitations that every desktop developer felt. Applications could not spawn multiple windows. Dialogs and popups were confined to the main window’s bounds. There was no way to create the floating tool palettes, detached inspectors, or secondary document windows that desktop users expect.
That changes with Flutter’s new Desktop Windowing API. This is not a workaround or a plugin hack. It is a first-class framework feature that brings true multi-window support to Flutter desktop applications on macOS, Windows, and Linux.
The Single-Window Limitation
Before the Desktop Windowing API, Flutter desktop apps had a fundamental constraint: one window per application. If you wanted to show a settings panel, it had to be a dialog within the main window. If you wanted a document to open in a separate window, you had to launch an entirely new Flutter instance. If you wanted a floating toolbar that followed the user’s workflow, you had to embed it within the main window and hope the layout did not break.
This limitation was not just inconvenient. It was architecturally wrong for desktop. Desktop operating systems are built around multi-window paradigms. Users expect to drag windows, resize them, minimize them to the taskbar, and arrange them across monitors. Flutter’s single-window model forced developers to fight the operating system instead of working with it.
Plugins like window_manager provided workarounds, but they operated at a different abstraction layer than Flutter’s rendering pipeline. Coordinating between Flutter’s widget tree and native window management required careful synchronization and often produced inconsistent behavior across platforms.
Canonical as Strategic Steward
The Desktop Windowing API is being developed with Canonical as a strategic partner. Canonical, the company behind Ubuntu, has been investing heavily in Flutter desktop as the application framework for the Linux ecosystem. Their involvement brings both engineering resources and deep knowledge of native windowing systems.
Canonical’s contribution goes beyond code. They understand how desktop users interact with windows on Linux, how GNOME and KDE handle window management, and what application developers need from the windowing API. This knowledge informs the design decisions that make the Desktop Windowing API both powerful and cross-platform consistent.
The partnership model is notable. Canonical is not building a fork or a separate toolkit. They are contributing directly to Flutter’s core, ensuring that the Desktop Windowing API works consistently across all supported platforms. A window created on macOS, Windows, or Linux should behave the same way from Flutter’s perspective, with platform-specific behaviors handled gracefully by the framework.
Five Window Types
The Desktop Windowing API introduces five distinct window types, each designed for specific use cases and carrying different behavioral expectations.
Regular windows are the standard application windows that users interact with directly. They appear in the taskbar, can be resized, minimized, and maximized, and follow the operating system’s window management conventions. Every Flutter desktop application already creates a regular window; the new API gives developers explicit control over creating additional ones.
Dialog windows are modal or modeless windows that expect user input before continuing. They typically appear centered over their parent window, do not appear in the taskbar, and may block interaction with other windows while open. The Desktop Windowing API integrates with Flutter’s existing showDialog pattern, extending it to create actual separate windows instead of in-app overlays.
Tooltip windows are small, temporary windows that appear on hover or focus. They display contextual information and disappear when the user moves the pointer away. Creating these as real OS windows rather than Flutter overlays means they can extend beyond the main window’s bounds and interact correctly with other applications.
Popup windows are transient windows that appear in response to user actions, like context menus or action sheets. They are similar to tooltips but typically persist until the user makes a selection or dismisses them explicitly.
Satellite windows are the most interesting category. These are windows that are logically associated with another window but exist independently in the OS window manager. A floating palette that follows a main document window, a detached inspector panel, or a secondary editing window are all satellite windows. They may minimize, maximize, and close independently, but the application treats them as related to a parent context.
WindowController and WindowScope
The API surface for managing windows is built around two key abstractions: WindowController and WindowScope.
WindowController is the primary interface for creating and managing windows. A WindowController instance represents a single window and provides methods for positioning, sizing, showing, hiding, and closing it. Creating a new window is straightforward:
final controller = WindowController.create(
type: WindowType.regular,
title: 'Settings',
size: Size(400, 600),
);
controller.open();
The controller also provides access to window events through streams. You can listen for size changes, position changes, focus events, and close requests. This makes it easy to implement features like saving and restoring window positions, or coordinating behavior between multiple windows.
WindowScope is the widget that provides window context to the widget tree. When a Flutter widget tree is rendered inside a window created by the Desktop Windowing API, WindowScope makes that window’s state accessible to descendant widgets. Widgets can query their window’s size, position, and type, and they can request window operations like closing or focusing.
WindowScope also enables cross-window communication. A widget in one window can dispatch events that widgets in other windows can listen to, using Flutter’s existing provider and state management patterns. This means Riverpod providers, Bloc streams, or any other state management solution can coordinate state across multiple windows without special APIs.
Integration with Material Design
The Desktop Windowing API integrates deeply with Flutter’s Material design system. Existing functions like showDialog, showMenu, and Tooltip work with the new windowing infrastructure to create proper OS-level windows instead of in-app overlays when running on desktop.
When you call showDialog in a Flutter desktop application using the new API, the dialog appears as a separate OS window with proper window decorations, taskbar behavior, and focus management. It is not an overlay drawn on top of the main window. It is a real window that the operating system manages.
This integration means developers do not need to rewrite their existing dialog and popup code. The same API calls that produce in-app overlays on mobile produce proper OS windows on desktop. The abstraction holds across platforms and form factors.
Experimental Status
As of the latest Flutter releases, the Desktop Windowing API is available on the main channel as an experimental feature. This means it is usable for development and testing, but the API surface may change based on feedback. Production use is recommended only for applications that can tolerate breaking changes between Flutter versions.
The experimental status reflects the complexity of the problem. Multi-window support touches every layer of Flutter’s architecture, from the rendering pipeline to the event system to the widget framework. Getting it right requires extensive testing across platforms and use cases, and the Flutter team is taking the time to ensure the API is robust before committing to stability.
Sized-to-Content and Advanced Features
Beyond basic window creation, the Desktop Windowing API supports advanced window behaviors that desktop applications require. Sized-to-content windows automatically adjust their dimensions to fit their content, eliminating the need for developers to calculate and set window sizes manually.
The API also provides hooks for window chrome customization, allowing developers to control the title bar, borders, and other window decorations. This enables the kind of custom window designs that modern desktop applications increasingly adopt, with custom title bars that blend into the application’s design language.
For applications that need dockable panes, floating toolbars, or complex window arrangements, the API provides the foundation. While high-level docking systems are still being developed, the core windowing primitives make them possible.
The Desktop Maturity Moment
The Desktop Windowing API represents Flutter’s desktop platform reaching a maturity threshold. Multi-window support is not just a feature. It is a prerequisite for being taken seriously as a desktop application framework. Operating systems are built around windows, and applications that do not respect that paradigm feel broken.
With this API, Flutter desktop applications can finally behave like native desktop applications. They can open settings in separate windows, detach inspectors for multi-monitor workflows, create floating tool palettes, and manage window arrangements the way users expect. The gap between Flutter desktop and native desktop development narrows significantly.
For developers who chose Flutter for its cross-platform promise, the Desktop Windowing API fulfills a critical part of that promise. Mobile, web, and now desktop with true multi-window support. The framework is delivering on its vision of write once, run anywhere with increasing completeness.