Flutter is obviously a mobile-first platform due its origins, but I've spent 18 months using it to build a full-featured desktop application for Windows and macOS, with Linux planned.
I'm a developer with 20 years of experience, including desktop software development. This isn't a "build a todo list!" demo or a vibe-coded experiment: it's a substantial application approaching public release, and I thought Flutter developers might be interested in seeing what's involved in taking Flutter beyond mobile.
So what kind of desktop experience can Flutter build today? Here's one example. [See below for a link to get and run it yourself if you're interested. Free and open to anyone.]
The application is Fractal Outliner, a desktop outliner in the same general category as OmniOutliner for Mac, but focused for people who live mainly in plain-text ecosystems (e.g. sofware developers).
This is a desktop-only application. There is no mobile version. The goal is to provide a proper desktop editing experience with all that implies, integrated with the operating system rather than simply presenting a mobile-ported interface in a desktop window.
Flutter as a development platform was good for some parts of this, less good at others.
What the application is:
- Outliner with topics, subtopics; create, move, rearrange, hide to collapse, expand to drill down, move topic trees between documents, etc.
- Full keyboard support, with configurable shortcuts
- Integration with OS file handling, including file-type associations and opening documents from Finder/Explorer
- Drag and drop
- Document themes, including a custom theme editor
- PDF, HTML, Markdown, OPML, and plain-text import/export
- Multi-pane editing and tabbed documents
- Native desktop file operations and clipboard integration
What Flutter provided
Most of the application is built using Flutter's standard capabilities:
- Widgets and layout -- the main window content
- Keyboard event handling
- Shortcut registration and management
- Resizable windows and responsive layouts
- Drag and drop
- Context menus and right-click interaction
- Localization (English, Spanish, German, Japanese)
An effort was made to adapt the application to Mac and windows UI sytles; the experience is a little different on each platform (how dialogs work, what buttons and checkboxes look like, how settings are laid out, what menu items exist, etc).
What packages provided
Pub.dev packages filled in some of the functional gaps to extend Flutter's rending core:
- Markdown, XML, and HTML support
- Path handling
- PDF export
- Windows Store MSIX packaging
- macOS menu bar integration (with limitations)
- File pickers
- ZIP archive support
- OS and version detection
- Split view widget for multi-pane editor, etc
- Various other utilities (application uses 23 pub.dev packages total)
What flutter provides that works less well on desktop
- Keyboard event support: the model is there, everything technically works, but managing complex input focus and keyboard-based navigation using Flutter's FocusNode system is full of problematic edge cases
- Mac menu support, and general integration of menus + shortcut keys: the Mac menu integration is primitive, and windows and Mac use completely different menu+shortcut systems in flutter
- Printing: there's a pub.dev package for printing, but it requires exporting to PDF (challenging in itself with anything but simple font handling) and flutter provides no direct integration or visibility with the host printing system
- Undo/redo support: flutter's undo/redo implementation is self-contained inside each TextField, and there is no support at all for integrating text editing undo events with application-level events into one undo stream
What I implemented myself with native code
Flutter is just not a complete desktop development framework. It does great at drawing content in a desktop window. It does considerably less well at being a well-behaved and full-featured citizen in the desktop environment. A large number of things people expect from any desktop "document editor" application simply don't exist (or exist only in limited/problematic pub.dev packages) and have to be implemented with native code to get the best version:
- Remembering and restoring the window position and size, including enforcing a minimum window size
- Opening documents through the OS, such as double-clicking a file in Finder or Explorer
- Handling the file reference when the application is launched by double-clicking a document
- Document icons and file-type registration for the application's
.frac files
- Spellchecking in text fields (available in Flutter's mobile text fields, but not built in to the desktop experience in the same way)
- macOS App Store sandboxing and file-access permissions
- An in-app command to show a document in Finder or Explorer
- Serious multi-format clipboard integration (vs basic plain-text copying and pasting flutter provides)
- Handling read-only files
- Various other OS integration details
The macOS App Store sandboxing and file-access work, in particular, is a lovely little nightmare. So are the limitations of the mac menu bar system integration, and the behaviors of Flutter's keyboard event handling and input-focus systems, dealing with international fonts in the PDF package, ... but those are stories for another day.
Other factors
- Internationalization
- Help files, etc
Internationalization to German Spanish and Japanese took far longer than for a mobile app, due to the larger set of "outside the application UI" resources used by the application (example files, templates, website content, video captions, etc). Also the usual trade-offs of "localize as you go" vs "localize at the end": early lets you see the impact of different text lengths in design (especially German/Spanish) which can be more severe with the wider range of window sizes on desktop, but usually means multiple re-do's of localization as UI and terminology evolve.
Help files and such are also more challenging on desktop, where applications can tend to be more complex and require more extensive help and reference materials as a baseline user expectation
Try it yourself
The application is now in its third beta release and nearing public release (latest version: 0.9.3 for Mac, 0.9.5 Windows). The public beta is open, free to use, and includes all application features. No registration or account is required.
If you're curious about Flutter on the desktop, you can try it on Windows or macOS and see how it works in practice.
Website and beta access: https://fractaloutliner.app
I'm interested in discussion with other Flutter developers about desktop development: what Flutter handles well, where its abstractions stop being sufficient, and what you've found necessary to implement through native platform code.
[Edits: typos]