跪拜 Guibai
← All articles
Frontend · Flutter · Android

Flutter 3.47 Decouples Material and Cupertino, Makes Impeller Default on Desktop

By 恋猫de小郭 ·
Read original on juejin.cn ↗ Google Translate ↗ Alt translation

Desktop is the headline: Impeller as the default renderer and native window-handle access turn Flutter into a credible option for complex desktop apps that need platform-specific chrome. The Material/Cupertino decoupling means UI fixes no longer wait three months for a Flutter release, but it also forces package authors to ship major-version breaks or risk type conflicts during the transition.

Summary

The Material and Cupertino design libraries are now published as separate `material_ui` and `cupertino_ui` packages, decoupled from the Flutter SDK's quarterly release train. They can ship fixes and features on a weekly cadence, and the old import paths are scheduled for deprecation in November. A compatibility bridge helps mixed ecosystems where some plugins still import the legacy `flutter/material.dart`.

On desktop, Impeller becomes the default renderer across all three platforms, bringing SDF-based text rendering for sharper fonts on lower-DPI screens and wide-gamut color support on macOS. Multi-window support advances with popup windows on Windows and Linux, direct access to native window handles (HWND, NSWindow, GtkWindow), and flavor support for Windows and Linux builds.

Platform baselines shift upward: iOS now requires 15, macOS requires 12, UIScene is mandatory for Xcode 27, and Intel Mac testing is dropped. On Android, Java 17 becomes the minimum, and the Gradle/Kotlin plugin versions jump forward. Web Wasm gains experimental deferred loading to split large modules and improve startup time.

Takeaways
Material and Cupertino are now standalone `material_ui` and `cupertino_ui` packages that can update weekly, independent of the Flutter SDK.
Old `package:flutter/material.dart` imports still work in 3.47 but are scheduled for deprecation in November 2025.
`MaterialUiCompatibilityBridge` bridges `ThemeData` and localizations between legacy and new Material widget trees during migration.
Impeller is now the default renderer on Windows, macOS, and Linux; fallback flags are available per platform.
Desktop Impeller uses SDF text rendering to produce sharper edges on lower-DPI screens, and macOS enables wide-gamut color by default.
Windows and Linux gain popup window support and direct access to native window handles (HWND, NSWindow, GtkWindow).
Windows and Linux builds now support `--flavor` and flavor-specific asset directories.
iOS minimum deployment target rises to 15, macOS to 12; UIScene is mandatory for Xcode 27, and Intel Mac testing is discontinued.
92 of the top 100 iOS Flutter plugins have migrated to Swift Package Manager; the CocoaPods Registry goes permanently read-only on December 2, 2026.
Android baseline moves to Java 17, Kotlin Gradle Plugin 2.4.0, AGP 9.1.0, Gradle 9.3.1, and a default minSdkVersion of 24.
Web Wasm adds experimental deferred loading (`--enable-wasm-deferred-loading`) to split large modules and improve startup.
Widget Preview graduates to stable; GenUI 0.10.0 extracts `a2ui_core` and supports client-side functions so agents can invoke local logic.
OpenGL ES render-to-texture coordinate flipping moves from fragment shaders to vertex shaders, which is a breaking graphics change.
Conclusions

Decoupling Material and Cupertino into independently versioned packages is a structural change that mirrors how the web ecosystem handles design systems, but it creates a temporary schism where a single widget tree can contain two incompatible Theme types.

The weekly release cadence for UI packages addresses a long-standing complaint that Flutter's quarterly cycle left design bugs unfixed for months, but it shifts the burden onto package authors who must now track and test against faster-moving dependencies.

Making Impeller the default on desktop before multi-window exits experimental suggests the rendering stack is stabilizing faster than the windowing APIs, which remain the real bottleneck for complex desktop applications.

Direct native window-handle access is an escape hatch that acknowledges Flutter's platform abstraction will never cover every OS-specific feature, and it gives teams a path to ship desktop apps without waiting for framework-level support.

Dropping Intel Mac testing and requiring UIScene for Xcode 27 signals that Flutter's Apple platform support is now firmly aligned with Apple's own deprecation timeline, leaving Intel Mac users with no safety net beyond the current release.

Wasm deferred loading is a necessary step toward making Flutter Web viable for content-heavy apps, but it remains experimental and gated behind a flag, so production use is still risky.

Concepts & terms
Impeller
Flutter's next-generation rendering engine that uses a custom runtime to precompile shaders, avoiding the frame-drop issues caused by runtime shader compilation in the older Skia backend.
SDF (Signed Distance Function)
A GPU-friendly technique for rendering sharp text and vector shapes by storing distance-to-edge information in a texture, allowing smooth edges at any scale without relying on high-resolution source assets.
Swift Package Manager (SwiftPM)
Apple's native build and dependency management system for Swift projects, which Flutter now uses as the default for iOS and macOS plugins, replacing CocoaPods.
UIScene
Apple's modern iOS and macOS app lifecycle API that supports multiple windows and scenes; it became mandatory in Xcode 27, meaning apps without UIScene support will not launch.
Flavors
A Flutter build configuration mechanism that lets a single codebase produce different app variants (e.g., development, staging, production) with distinct assets, bundle IDs, and settings.
Source: juejin.cn ↗ Google Translate ↗ Backup ↗