Let's look at how to upgrade your Flutter applications to version 3.47 by decoupling your design systems, cleaning up your localization imports, and adopting Impeller on desktop targets.
What you'll learn:
- How to migrate core UI libraries to the new standalone
material_uiandcupertino_uipackages. - Setting up the
MaterialUiCompatibilityBridgefor legacy dependencies. - Unbundling your
flutter_localizationssetup. - Enabling and testing the Impeller rendering engine across macOS, Windows, and Linux.
Decoupling Material and Cupertino from the Core SDK
Historically, Flutter bundled its design systems directly inside the core SDK. While convenient, it meant widget updates were tied to quarterly SDK releases. Flutter 3.47 introduces version 1.0 of material_ui and cupertino_ui on pub.dev, letting design packages ship on their own weekly schedules.
To update your project automatically, run the built-in Dart fix command in your terminal:
// Run this in your project root to auto-migrate imports
// dart fix --apply --code=migrate_design_widgets
Gotcha: If the automated migration tool fails to update your
pubspec.yaml, runflutter pub add material_uimanually, then executedart fix --applyonce more to resolve lingering import paths.
Bridging Legacy Dependencies with Compatibility Layers
When updating a large application, you will likely encounter third-party packages still pointing to package:flutter/material.dart. Instead of waiting on upstream maintainers, wrap your root app in the MaterialUiCompatibilityBridge to normalize rendering.
import 'package:material_ui/material_ui.dart';
import 'package:flutter/widgets.dart';
void main() {
runApp(const ProductionApp());
}
class ProductionApp extends StatelessWidget {
const ProductionApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFF1E293B)),
),
builder: (BuildContext context, Widget? child) {
// Normalizes legacy imports while you migrate downstream packages
return MaterialUiCompatibilityBridge(child: child!);
},
home: const DashboardScreen(),
);
}
}
Simplifying Localizations with Standalone Packages
Localization delegates have also been unbundled from the core SDK. Instead of importing three separate localization packages, material_ui now exposes a unified collection of delegates.
Here is how your localization setup looks before and after the migration:
// AFTER: Simplified localization setup using package:material_ui
import 'package:material_ui/material_ui.dart';
import 'package:flutter/widgets.dart';
class LocalizedAppSetup {
static const delegates = GlobalMaterialLocalizations.delegates;
}
Speed Note: Grouping delegates via
GlobalMaterialLocalizations.delegatesautomatically includes Cupertino and Widgets delegates under the hood, shrinking your boilerplate code.
Making the Leap to Impeller on Desktop
Flutter 3.47 makes Impeller the default graphics renderer for macOS, Windows, and Linux. Impeller eliminates shader compilation jank by compiling a fixed set of shaders at build time rather than dynamically at runtime.
If you need to verify or temporarily bypass Impeller on macOS during debugging, update your Info.plist file:
// ios/Runner/Info.plist or macOS/Runner/Info.plist
// Add or update the following boolean flag:
// <key>FLTEnableImpeller</key>
// <false/>
class RendererConfig {
static void checkGraphicsBackend() {
// Impeller uses Metal on macOS, and Vulkan on Windows and Linux by default.
const bool impellerActiveByDefault = true;
assert(impellerActiveByDefault, "Running on modern hardware graphics API.");
}
}
Accessibility Note: Impeller's Wide Gamut Color support is now active by default on macOS, ensuring rich, precise color representation for design tools and media editing software.
Summary
Upgrading to Flutter 3.47 gives you granular control over your design dependencies and unlocks smooth, stutter-free desktop graphics via Impeller. Migrating early ensures you stay ahead of upcoming deprecations in the fall stable release.
Next Steps:
- Run
flutter upgradeand executedart fix --apply --code=migrate_design_widgetsin your repository. - Audit your desktop app performance with Impeller enabled across Windows, macOS, and Linux.