Wat is nieuw in Flutter 3.47

Flutter 3.47 is hier, en daarmee brengen we enkele spannende nieuwe updates. Vandaag verwelkomen we de 1.0-release van de standalone materialui en cupertinoui pakketten. Dit is een belangrijke mijlpaal die designsystemen loskoppelt van de core SDK.

Daarnaast verbeteren we de prestaties en tooling op alle fronten. Deze release brengt Impeller standaard naar desktop, bereidt onze pipelines voor op iOS, macOS en Xcode 27, en promoveert Flutter Widget Previews naar de stabiele versie.

Voer flutter upgrade uit in je terminal om aan de slag te gaan, of lees verder over de belangrijkste wijzigingen in deze release.

Kies je eigen UI-avontuur

De eerste stap naar een ontkoppelde Flutter is gezet: Material en Cupertino zijn nu beschikbaar als standalone pakketten! Een van de grootste sterktes van Flutter is het vermogen om pixel-perfecte Material- en Cupertino-widgets te renderen. Omdat deze designbibliotheken historisch gezien direct in de core SDK waren gebundeld, vertraagde dit hun ontwikkeling en maakte het lastiger om bij te dragen of ze up-to-date te houden.

Hoewel de core SDK deze bibliotheken voor deze release nog bevat, kun je nu kiezen voor de standalone materialui en cupertinoui pakketten, die officieel versie 1.0 hebben bereikt op pub.dev.

Ontkoppelde design-roadmaps (Opt-in)

Door te kiezen voor de ontkoppelde designsystemen krijg je meer controle over je design-roadmap. Omdat materialui en cupertinoui nu op pub.dev staan, kunnen bugfixes en nieuwe componenten volgens hun eigen wekelijkse schema's worden uitgebracht, onafhankelijk van de driemaandelijkse Flutter SDK-releases.

De voordelen van deze ontkoppeling zijn:

  • Je kunt de nieuwste Cupertino- en Material-widgetstijlen gebruiken zonder gedwongen te worden je volledige Flutter SDK-versie te upgraden.
  • We kunnen bijdragen en updates sneller en frequenter implementeren.
  • Er wordt een basis gelegd voor een stijloneutrale Flutter core widget catalogus, waardoor het in de toekomst makkelijker wordt om eigen designsystemen te bouwen.

Hoe te migreren

Om je project te migreren naar de nieuwe standalone pakketten, voer je het volgende commando uit:

dart fix --apply --code=migrate_design_widgets

Dit hulpmiddel werkt je imports automatisch bij van package:flutter/material.dart en package:flutter/cupertino.dart naar de nieuwe standalone pakketten.

Let op: Als de migratietool problemen ondervindt bij het bijwerken van je pubspec.yaml (een bekende vroege bug), kun je dit oplossen door handmatig flutter pub add materialui (en cupertinoui indien gebruikt) uit te voeren, en daarna nogmaals dart fix --apply te draaien.

De oorspronkelijke designbibliotheken in de core SDK staan gepland voor formele deprecation in de komende Fall stable release in november. Als je een pakket in het ecosysteem migreert, beschouw deze overstap naar standalone pakketten dan als een major release.

De migratieoverbrugging

Om de overgang te vergemakkelijken terwijl het ecosysteem migreert, worden materialui en cupertinoui geleverd met migratie-utilities. De MaterialUiCompatibilityBridge stelt je applicatie in staat om direct over te stappen op de standalone pakketten, zelfs als sommige van je package-dependencies nog gebruikmaken van legacy core SDK-imports.

Je kunt je app bijvoorbeeld omwikkelen met de compatibility bridge:

import 'package:material_ui/material_ui.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)),
      ),
      builder: (BuildContext context, Widget? child) {
        return MaterialUiCompatibilityBridge(child: child!);
      },
      home: const HomeScreen(),
    );
  }
}

Ontkoppelde lokalisaties

Als onderdeel van deze transitie is flutterlocalizations ook ontbundeld. Lokalisatie-delegaten en vertaalde strings voor Material- en Cupertino-widgets bevinden zich nu respectievelijk in package:materialui and package:cupertino_ui.

Voorheen:

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter/material.dart';

// ...
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
  GlobalCupertinoLocalizations.delegate,
  GlobalMaterialLocalizations.delegate,
  GlobalWidgetsLocalizations.delegate,
],

Nu:

import 'package:material_ui/material_ui.dart';

// ...
localizationsDelegates: GlobalMaterialLocalizations.delegates,

Het instellen van localizationsDelegates op GlobalMaterialLocalizations.delegates bevat nu ook de Cupertino- en Widgets-delegaten, wat de configuratie vereenvoudigt.

Open voor bijdragen

Door de bijdragen aan de Material- en Cupertino-bibliotheken in april te bevriezen, konden we een soepele migratie garanderen. De bibliotheken in materialui en cupertinoui zijn exact dezelfde libraries die je al gebruikt. Nu het freeze is opgeheven, kun je uitkijken naar meer fixes en functies die regelmatig worden uitgerold in de nieuwe pakketten (momenteel gepland als wekelijkse releases). We openen deze pakketten ook officieel voor bijdragen vanuit de community.

Voorbereiding op Apple-updates

Met de komst van Xcode 27, iOS 27 en macOS 27 dit najaar, hebben we ons sterk gericht op het klaarzetten van Flutter voor deze updates. We raden aan om je apps nu al te testen tegen de Apple beta's. Om Xcode 27 te ondersteunen, zijn de minimale ondersteunde OS-versies verhoogd:

PlatformVorige minimumNieuw minimum (Flutter 3.47+)
iOS1315
macOS10.1512

UIScene lifecycle verplichting

De iOS 27 SDK vereist nu de UIScene-lifecycle voor alle UIKit-gebaseerde apps. Apps gebouwd met Xcode 27 die geen gebruikmaken van UIScene, zullen niet opstarten. Voor de meeste apps regelt de Flutter CLI deze migratie automatisch tijdens het build-proces. Handmatige migratie is echter vereist als je eigen native code hebt in je AppDelegate of plugins gebruikt die nog vertrouwen op de legacy application lifecycle. In dat geval moet je handmatig migreren via de UIScene/Delegate Adoption Guide.

Uitfasering van Intel Macs

In lijn met de overstap van Apple naar Apple Silicon, vermindert Flutter de ondersteuning voor Intel-gebaseerde Macs. We hebben automatische testruns op Intel-hardware uitgeschakeld en de Flutter CLI geeft nu waarschuwingen bij het bouwen op Intel-hosts of bij het targeten van duale architecturen. Deze waarschuwingen zullen in een toekomstige release foutmeldingen worden. Je kunt direct overstappen op ARM64-only macOS apps door flutter config --enable-macos-arm64-only uit te voeren.

Voortgang Swift Package Manager

Er is grote vooruitgang geboekt bij de overstap naar Swift Package Manager (SPM); 92 van de top 100 iOS-plugins zijn inmiddels gemigreerd. Als je SPM eerder had uitgeschakeld, kun je dit opnieuw proberen met flutter config --enable-swift-package-manager. Omdat CocoaPods nu in maintenance mode is, zullen plugins die niet migreren naar SPM uiteindelijk stoppen met werken en een lagere score krijgen op pub.dev.

Deze release bevat ook geoptimaliseerde build-tijden, dankzij community-contributeur @lukemmtt, die de build pipelines heeft verbeterd door onnodige SwiftPM package schemes vroegtijdig uit te filteren.

Koers naar Wasm als standaard

We werken actief aan het standaard inschakelen van WebAssembly (Wasm) voor Flutter webapplicaties om native-achtige prestaties in de browser te leveren. Je kunt dit nu al testen door de --wasm flag toe te voegen aan je release build commando:

flutter build web --release --wasm

Houd er rekening mee dat Wasm vereist dat je codebase wordt gemigreerd naar het nieuwe JS interop-pakket (package:web), aangezien de legacy dart:html bibliotheek niet wordt ondersteund. Het upgraden van package dependencies lost deze issues vaak automatisch op.

Voor grotere webapplicaties introduceert deze release experimentele ondersteuning voor deferred loading on Wasm (beschikbaar via een flag in het main channel), waardoor je de applicatie kunt splitsen in kleinere, lazy-loaded modules:

flutter build web --release --wasm --enable-wasm-deferred-loading

Moderne graphics op desktop met Impeller

In Flutter 3.47 wordt Impeller de standaard renderer voor macOS, Windows en Linux. Impeller is Flutter's rendering engine van de volgende generatie, gebouwd om Skia te vervangen. Door moderne hardware API's te gebruiken (zoals Metal op macOS en Vulkan op Windows en Linux), compileert Impeller een vaste set shaders tijdens het build-proces in plaats van dynamisch tijdens runtime. Dit elimineert 'shader compilation jank' (kortstondig stotteren) bij de eerste keer dat een animatie wordt afgespeeld.

Mocht je tijdelijk willen terugkeren naar Skia, volg dan deze stappen:

  • macOS: Zet FLTEnableImpeller op false in Info.plist.
  • Windows: Voeg project.setimpellerswitch(flutter::ImpellerSwitch::Disabled) toe in main.cpp.
  • Linux: Roep fldartprojectsetenableimpeller(project, FALSE) aan in myapplication.cc.

Daarnaast is Wide Gamut Color nu standaard actief op macOS voor rijkere en preciezere kleurweergave op ondersteunde hardware.

Experimentele voortgang Multi-window

In samenwerking met Canonical breiden we de experimentele desktop windowing API's uit. Linux en Windows ondersteunen nu popup-vensters, wat het mogelijk maakt om native contextmenu's en utility-palettes te bouwen.

Popup-vensters op Win32

Je kunt nu windowHandle opvragen op platformspecifieke controllers om een directe pointer naar het onderliggende native venster te krijgen (HWND, NSWindow of GtkWindow). Dit maakt geavanceerde functies mogelijk, zoals dockbare panelen op Windows.

Overige window-verbeteringen

  • Windows: Het activeren van een venster trekt achtergrondvensters niet langer naar voren of steelt de focus bij het hervatten van de app.
  • Linux: Multi-window creatie realiseert vensters nu expliciet voordat ze hun eerste frame ontvangen, wat renderingwaarschuwingen voorkomt.
  • Er is een nieuwe sized-to-content API toegevoegd waarmee je vensters kunt maken die automatisch worden geschaald naar hun inhoud.

Flavors voor desktop

Windows en Linux ondersteunen nu Flutter flavors. In pubspec.yaml kun je bijvoorbeeld verschillende assets per flavor definiëren:

flutter:
  assets:
    - path: assets/flavor_a/images
      flavors:
        - flavor_a
    - path: assets/flavor_b/images
      flavors:
        - flavor_c

Gebruik de --flavor optie om je flavor te specificeren:

flutter build windows --flavor flavor_a
flutter build linux --flavor flavor_a

Scherpere desktoptekst

Desktop-schermen hebben vaak een lagere pixeldichtheid dan mobiele displays. Om scherpere tekst en schonere vectorcurven te leveren, maakt de Flutter engine met Impeller nu gebruik van Signed Distance Function (SDF) rendering op macOS, Linux en Windows.

Stabiele previews en updates aan GenUI

Widget Previews worden stabiel

Flutter Widget Preview is nu stabiel. Hiermee kun je individuele UI-componenten direct renderen, inspecteren en itereren zonder de volledige applicatie te hoeven bouwen of starten. Belangrijkste verbeteringen:

  • Snellere opstarttijden door lokale project caching in een .widget_preview/ map.
  • Flexibeler testen via de abstracte PreviewThemeData API.
  • Automatische synchronisatie van web-assets bij het previewen van web-widgets.

Vooruitgang in GenUI

Versie 0.10.0 van het genui pakket is verschenen met nieuwe functies:

  • Een nieuw a2ui_core pakket dat klassen centraliseert die gerelateerd zijn aan het protocol (expressies, catalogus-items, etc.).
  • Ondersteuning voor A2UI client-side functies, waardoor agents de client kunnen aansturen voor validatie en afgeleide waarden zonder een round trip naar de server.

Verfijning van de platformervaring

Android

Een probleem met het virtuele toetsenbord is opgelost waarbij modifier keys (zoals Shift) konden blijven 'hangen'. Daarnaast is Flutter 3.47 geverifieerd tegen de volgende dependency-versies:

  • Java: 17 (minimaal vereist)
  • Kotlin Gradle Plugin (KGP): 2.4.0
  • Android Gradle Plugin (AGP): 9.1.0
  • Gradle: 9.3.1

De standaard API-levels voor deze release zijn: compileSdkVersion (API 36), targetSdkVersion (API 36) en minSdkVersion (API 24).

iOS en macOS

Code signing is nu transparanter; de CLI toont zowel het Team ID als de Team Name bij het selecteren van een certificaat. Ook zijn de foutmeldingen voor provisioning profiles duidelijker geworden.

Desktop

  • Windows: Caret-positionering voor Koreaanse tekstcompositie is opgelost. Windows-plugins kunnen dure taken nu verplaatsen naar buiten de platform thread via FlutterEngine::PostPlatformThreadTask.
  • Linux: Ondersteuning toegevoegd voor stylus-rotatie en drukgevoeligheid.

Graphics en engine

Fragment shaders die gericht zijn op OpenGLES hebben geen conditionele coördinaat-flipping meer nodig bij het lezen van textures; dit wordt nu afgehandeld in de vertex shader.

Framework Polish

  • Toegankelijkheid: Android high-contrast en kleur-inversie instellingen worden nu automatisch gedetecteerd (MediaQueryData.highContrast and MediaQueryData.invertColors). Keyboard focus blocking is toegevoegd voor BlockSemantics.
  • Tekst en selectie: Selectie-handles op mobiel blijven nu stabiel tijdens licht scrollen. Op Android blokkeren handles het contextmenu niet langer wanneer ze bovenaan het scherm staan. Een crash in SelectableRegion bij lege scrollbare containers is opgelost.
  • Gebaren en scrollen: Verbeterde gesture-propagatie voor native iOS views via platform views. EdgeDraggingAutoScroller respecteert nu de ScrollPhysics van de actieve scroll view.
  • Core Widget verbeteringen: Behoud van originele kleuren in ImageIcon met useOriginalColors: true, specificeerbaar clipping gedrag in AnimatedCrossFade, en directe tracking van image stream fouten via ImageStreamListener.

Klaar voor de upgrade

Update je SDK met het volgende commando:

flutter upgrade