Elk jaar speelt hetzelfde patroon zich af. Een team heeft een desktop app nodig. Ze grijpen naar Electron omdat iedereen naar Electron grijpt. Een maand later shippen ze een binary van 180 MB die 400 MB RAM opslokt om een formulier en drie tabs te renderen, en vragen ze zich af waarom de app niet voelt als een Mac app op een Mac.
Electron is een default. Het is niet altijd de juiste keuze.
Het korte antwoord. Flutter is een volwassen optie voor cross-platform desktop app ontwikkeling. Het ships een base binary van ~30 MB, rendert zijn eigen UI via Skia of Impeller op 60 tot 120 fps, draait op Windows, macOS en Linux, en deelt code met iOS, Android en web vanuit dezelfde Dart codebase. Als je al Flutter gebruikt voor mobile, is desktop de goedkope uitbreiding. Als je een werkende Electron app hebt, blijf zitten tot je een echte reden hebt om te migreren.
Wat is cross-platform desktop app ontwikkeling?
Cross-platform desktop app ontwikkeling betekent één codebase bouwen die draait op Windows, macOS en Linux, in plaats van drie native projecten onderhouden. De vier opties die de meeste teams vandaag afwegen:
- Electron (Node en Chromium). Dominant ecosysteem, grootste community, grootste binaries.
- Flutter (Dart met Skia of Impeller). Eén codebase voor mobile, web en desktop.
- Tauri (Rust backend, systeem webview frontend). Kleine binary, jonger ecosysteem.
- Qt of native (C++, Swift, WinUI). Hoogste fidelity, hoogste kost.
Elk ruilt anders op binary size, geheugen, feel, developer experience en hoe native het resultaat aanvoelt voor de persoon die het echt gebruikt.
Waarom Flutter voor desktop (en waarom niet)
Flutter bereikte stable op Windows in 2022 en op macOS en Linux in hetzelfde venster. Het is niet langer experimenteel.
We hebben zelf Flutter desktop apps uitgeleverd, waaronder een exam monitoring tool voor Karel de Grote Hogeschool die netwerkpakketten capteert, virtuele machines detecteert en hardware adapters enumereert op Windows, macOS en Linux vanuit één Flutter codebase. Onze Flutter FFI insight legt uit hoe die native integratie echt werkt.
De dingen die Flutter desktop goed doet:
Eén codebase, elk scherm. Een goed gearchitecteerde Flutter app draait op iOS, Android, Windows, macOS, Linux en het web vanuit dezelfde widgets. Platform-specifieke code (menu’s, window management, shortcuts) leeft in dunne conditionele lagen. Voor een team dat al Flutter mobile ships, is desktop toevoegen een kwestie van weken, niet maanden.
Grootte en geheugen. De gap tussen Flutter en Electron is niet theoretisch. Hij komt naar boven op schijf, in RAM en in de render pipeline.
Die gap telt voor IT teams die uitrollen naar locked-down Windows flotten en voor gebruikers op oudere hardware. 170 MB verschil in binary size is het verschil tussen “snel goedgekeurd” en “geweigerd door beleid” in veel enterprise omgevingen.
Flutter’s gap tot native is ongeveer 2x op binary en RAM. De gap tot Electron ligt dichter bij 5x. En waar die 2x gap tot native daadwerkelijk pijn doet (een render loop, een audio pipeline, een compressiefase), laat dart:ffi je naar C of Rust droppen voor dat ene hot path en de rest in Flutter houden. Het cross-platform code sharing verhaal blijft intact.
Feel. Flutter rendert zijn eigen UI op 60 tot 120 fps via Skia of Impeller. Scroll, animatie en input latency voelen native op gangbare hardware. Je moet nog steeds platform conventies matchen (menu’s op macOS, right-click op Windows, Ctrl vs Cmd shortcuts) maar de widget layer is snel genoeg dat niets voelt als een webpagina in een window.
Native waar nodig, Flutter overal anders. “Cross-platform” in Flutter betekent niet “puur Dart”. Performance-kritische hot paths dwingen je niet uit het framework. Je dropt naar C of Rust via dart:ffi voor de delen die echte native snelheid nodig hebben (image pipelines, audio DSP, packet capture, cryptografie, hardware enumeratie) en houdt Flutter voor alles eromheen: UI, state, navigatie en de cross-platform orchestratie. De KDG exam monitoring tool hierboven is precies dat patroon, met een Dart shell en een C hot path. Beide shippen uit hetzelfde flutter build commando. Platform channels (Swift, Objective-C, Kotlin of C++ oproepen) dekken de hogere OS APIs waar FFI overdreven is.
Hoe ziet “één codebase” er echt uit. De hello-world voor Flutter desktop is dezelfde als de hello-world voor Flutter mobile:
import 'package:flutter/material.dart';
void main() => runApp(
const MaterialApp(
home: Scaffold(
body: Center(child: Text('Hello, Desktop')),
),
),
);
Run het met flutter run -d macos, flutter run -d windows of flutter run -d linux. Dat is de volledige entry point. Platform-specifieke code komt later, in dunne conditionele lagen voor menu’s, shortcuts en window management.
De dingen die Flutter desktop niet goed doet:
Niet elk package is desktop-ready. pub.dev heeft duizenden packages die mobile targetten en op desktop stilletjes niets doen (of crashen). Je zal tijd besteden aan het checken van platform support per dependency.
Accessibility loopt achter op Windows en Linux vergeleken met native. Screen reader support op Windows en Linux is zwakker dan op iOS, Android en macOS. Voor accessibility-first applicaties, test dit voordat je je engageert.
Text input en IME. Aziatische taal input methoden en sommige internationale toetsenborden hebben nog scherpe kantjes. Test met de locales waarmee je gebruikers echt typen.
Grafisch intensieve en latentiegevoelige workloads vragen een hybride. CAD, digital audio workstations, real-time video editors en game engines hebben allemaal performance plafonds die een pure Dart pipeline niet haalt. Flutter is geen game engine en probeert het ook niet te zijn. Maar je hoeft Flutter voor deze apps ook niet op te geven: de shell, UI, state en cross-platform orchestratie blijven in Dart, en de render loop, DSP chain of encoder pipeline droppen naar C of Rust via dart:ffi. Dezelfde flutter build, hetzelfde cross-platform verhaal, native performance waar het telt.
Wanneer Flutter de juiste keuze is voor je desktop app
Voor alles in de lanes van productiviteit, operations, admin, creatieve tooling en vertical SaaS is Flutter desktop de pragmatische default voor nieuw werk.
Desktop-specifieke dingen die je echt zal moeten wiren
Een echte Flutter desktop app schrijft uiteindelijk een handvol dingen die een Flutter mobile app niet nodig heeft:
Window management. Multi-window, window sizing en window state persistentie gebruiken packages zoals window_manager of bitsdojo_window. Beide zijn volwassen.
Menubar en keyboard shortcuts. Native menu’s gebruiken Flutter’s ingebouwde PlatformMenuBar op macOS en equivalente APIs op Windows en Linux. De widget-level Shortcuts en Actions maken key bindings composable over platformen heen.
File picker en drag and drop. file_picker en desktop_drop dekken de gangbare cases. Sandbox permissions op macOS vragen zorg.
Native integratie via dart:ffi. Voor OS APIs zonder Dart package schrijf je een paar regels C of Rust en expose je ze via dart:ffi. Dit is het pad dat we volgen wanneer we capaciteit nodig hebben die nog niet verpakt zit.
Packaging en distributie. Windows gebruikt MSIX of Inno Setup. macOS gebruikt DMG met notarization. Linux gebruikt snap, flatpak of deb. Auto-update gebruikt het auto_updater package of een custom implementatie rond je eigen update server.
Code signing en notarization. Elke productie desktop app heeft beide nodig. Reserveer een dag voor de eerste keer dat je Apple notarization doet, minder voor de tweede.
De Electron migratievraag
Teams met Electron vragen ons of ze moeten migreren naar Flutter. Het eerlijke antwoord: het hangt af van welke triggers je raakt. Migratiekost is reëel en de meeste werkende Electron apps hoeven niet dringend te bewegen. Maar voor teams die een van de signalen hieronder raken, kantelt de rekening en wordt de kost van blijven hoger dan de kost van bewegen.
- Geheugen of binary size is een deployment blocker geworden. Windows fleet policies, klanten die klagen over RAM, field deployments op oude hardware. Als de footprint deals kost of support tickets genereert, is dat een trigger.
- Je plant een Flutter mobile of web versie van hetzelfde product. Zodra cross-platform code sharing op de roadmap staat, is elke maand die je twee stacks onderhoudt een kost die je niet hoeft te dragen.
- Je hebt een performance of feel gap gemeten die Electron niet kan sluiten. Geen buikgevoel. Input latency, animatievloeiendheid, startup time, gemeten tegen de native baseline die je gebruikers verwachten.
- Je team zit sprints Electron in leven te houden. Chromium version bumps, security patch cycles, dependency churn. Als onderhoud feature werk opeet, telt dat ook.
Als een of meer van deze je raken, zijn de volgende vragen hoeveel van de bestaande app herbruikbaar is, welke platform-specifieke stukken herbouwd moeten worden en hoe de realistische timeline eruitziet. Dat is een gesprek, geen formule, en het is hetzelfde gesprek dat we voeren met teams die React Native naar Flutter migratie overwegen. Onze legacy migration service dekt het volledige discovery en delivery pad voor teams die beslist hebben dat het tijd is.
Key takeaways
Electron is een default, geen beslissing. De meeste teams grijpen ernaar omdat iedereen dat doet. Dat is prima wanneer het het juiste antwoord is. Vaak is het dat niet.
Flutter desktop is vandaag productie-klaar. Windows, macOS en Linux, met flagship deployments bij Canonical en echte apps bij agencies zoals wij. Het platform is voorbij het experimentele label.
De grootste leverage zit in code sharing. Als je al een Flutter mobile app ships, is desktop toevoegen een kwestie van weken. Als je eerst desktop ships, is mobile en web er later bij doen net zo goedkoop. Electron geeft je enkel desktop.
Migreer op triggers, niet op principe. Werkende Electron apps hoeven niet dringend te bewegen. Wanneer geheugen, binary size, feel, onderhoudslast of cross-platform code sharing een echte blokker wordt waar je naar kan wijzen, is het tijd om te praten.
De eerlijke lane. Productiviteitstools, admin consoles, interne operations dashboards, hardware companions, vertical SaaS clients en creatieve tooling (Rive bouwt het hunne op Flutter). Flutter desktop past. Voor grafisch intensieve workloads zoals CAD, real-time video en digital audio regelt Flutter nog altijd de shell en dropt dart:ffi je naar C of Rust voor het zware werk. Zie onze Flutter FFI insight voor hoe het hybride patroon echt in productie loopt.
Stel je een klein team voor dat vorig jaar een Flutter mobile app heeft uitgeleverd. Dit kwartaal hebben ze een desktop companion nodig. Geen rebuild, geen tweede team, geen nieuw framework. Ze extraheren de business logica in een package, voegen een desktop entry point toe, wiren de menubar, en shippen. Een week later draait de Windows versie op de laptop van de CEO en de macOS versie op de iMac van de designer. Dat is waar cross-platform desktop app ontwikkeling op neerkomt wanneer het framework ophoudt in de weg te staan.
Flutter overwegen voor je desktop app?