What’s new in Flutter 3.47 | The Flutter Blog
search
Get started
menu
What’s new in Flutter 3.47
Modular by design: Standalone UI Packages and Impeller on Desktop
Emma Twersky
Aug 12, 2026 · 12 min read
rss_feed
share
content_copyCopy link
Share on X
Share on Bluesky
Share on LinkedIn
What's new in Flutter 3.47
Flutter 3.47 is here, and with it, we’ve got some exciting new updates.
Today, we welcome the 1.0 release of the standalone<br>material_ui and<br>cupertino_ui packages.<br>This is a major milestone that decouples design systems from the core SDK.
We’re also boosting performance and tooling across the board.<br>This release brings Impeller to desktop by default,<br>prepares our pipelines for iOS, macOS, and Xcode 27,<br>and graduates Flutter Widget Previews to stable.
So, run flutter upgrade in your terminal to get started,<br>or read on to learn more about the major changes in this release.
Choose your own UI adventure
The first step toward a decoupled Flutter is here:<br>Material and Cupertino are now available as standalone packages!
One of Flutter’s greatest strengths is its ability<br>to render pixel-perfect Material and Cupertino widgets.<br>However, because these design libraries<br>were historically bundled directly inside the core SDK,<br>it slowed down their development and made it harder to contribute<br>or keep them up to date.
While the core SDK still includes these libraries for this release,<br>you can now opt-in to the standalone material_ui and cupertino_ui<br>packages,<br>which have officially reached version 1.0 on pub.dev.
Decoupling design roadmaps (Opt-in)
By opting into the decoupled design systems,<br>you gain control over your design roadmap. Because material_ui<br>and cupertino_ui now live on pub.dev,<br>they can ship bug fixes and new components on their own weekly schedules,<br>independent of the quarterly Flutter SDK releases.
Decoupling the design systems gives us the following benefits:
You can use the latest Cupertino and Material widget styles<br>without being forced to upgrade your entire Flutter SDK version.
We can land contributions and updates faster and more frequently.
We lay the groundwork for a style-neutral Flutter core widget catalog,<br>making it easier to build custom design systems in the future.
How to migrate
To migrate your project to the new standalone packages,<br>run the following command:
bash<br>dart fix --apply --code=migrate_design_widgets
content_copy
This tool automatically updates your imports<br>from package:flutter/material.dart and package:flutter/cupertino.dart
to the new standalone packages.
Note: If the migration tool encounters issues updating your pubspec.yaml
(a known early bug), you can resolve it<br>by manually running flutter pub add material_ui<br>(and cupertino_ui if you use it), then running dart fix --apply<br>once more.
The original design libraries inside the core SDK<br>are scheduled for formal deprecation in the upcoming Fall stable release<br>in November. If you are migrating a package in the ecosystem,<br>treat this move to the standalone packages as a major release.
Bridging the migration gap
To facilitate bridging the gap as the ecosystem migrates<br>to the new standalone design libraries,<br>material_ui and cupertino_ui ship with migration utilities.<br>The MaterialUiCompatibilityBridge allows your application to migrate<br>to the standalone packages immediately,<br>even if some of your package dependencies<br>are still using legacy core SDK imports.
For example, you can wrap your app in the compatibility bridge:
dart<br>import 'package:material_ui/material_ui.dart';<br>void main() {<br>runApp(const MyApp());<br>class MyApp extends StatelessWidget {<br>const MyApp({super.key});<br>@override<br>Widget build(BuildContext context) {<br>return MaterialApp(<br>theme: ThemeData(<br>colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF6750A4)),<br>),<br>builder: (BuildContext context, Widget? child) {<br>return MaterialUiCompatibilityBridge(child: child!);<br>},<br>home: const HomeScreen(),<br>);
content_copy
Decoupled localizations
As part of this transition, flutter_localizations has also been unbundled.<br>Localization delegates and translated strings for Material<br>and Cupertino widgets now reside inside package:material_ui<br>and package:cupertino_ui respectively.
Before:
dart<br>import 'package:flutter_localizations/flutter_localizations.dart';<br>import 'package:flutter/material.dart';<br>// ...<br>localizationsDelegates: const LocalizationsDelegatedynamic>>[<br>GlobalCupertinoLocalizations.delegate,<br>GlobalMaterialLocalizations.delegate,<br>GlobalWidgetsLocalizations.delegate,<br>],
content_copy
After:
dart<br>import 'package:material_ui/material_ui.dart';<br>// ...<br>localizationsDelegates: GlobalMaterialLocalizations.delegates,
content_copy
Setting localizationsDelegates to GlobalMaterialLocalizations.delegates<br>now includes the Cupertino and Widgets delegates as well,<br>simplifying your setup.
Decoupling localization structure
Open for contribution
By freezing contributions to the Material and Cupertino libraries back in April,<br>we’ve been able to...