What's new in Flutter 3.29 and Dart 3.7
By Ann Tech · 15 June 2026
Flutter 3.29 and Dart 3.7 landed in February 2026 with several developer-facing improvements. Here is what's significant and what you need to update.
Impeller on Android: now stable
Impeller has been the default iOS renderer since Flutter 3.10. With 3.29, it graduates to stable on Android — enabled by default on Android API 29+ (Android 10, covering ~95% of active devices).
What this means for you:
- Shader compilation jank eliminated on Android, matching the iOS experience
- Some visual differences from Skia — especially in custom blend modes and large blur radii
- Golden tests against Skia output will fail — regenerate them
# Opt out while you migrate golden tests
flutter run --no-enable-impeller
# Once ready, remove the flag — Impeller is now the default
flutter run
Dart 3.7: inline classes (extension types)
Extension types (called "inline classes" in earlier proposals) are now production-ready:
// Wraps int — no runtime overhead, purely compile-time
extension type UserId(int value) {
// Add methods and operators
bool get isValid => value > 0;
}
extension type ProductId(String value) {
String get display => 'Product #$value';
}
// Now these are distinct types — compiler catches mistakes
void loadUser(UserId id) { ... }
void loadProduct(ProductId id) { ... }
// This is now a compile error:
loadUser(ProductId('p-123')); // ERROR: can't pass ProductId as UserId
Use extension types for type-safe ID types, unit types (metres vs feet), and newtype patterns — all with zero runtime cost.
Dart 3.7: improved wildcard patterns
// _ is now a proper wildcard — can be used multiple times
switch (point) {
case (_, _): print('any 2D point');
case (_, _, _): print('any 3D point');
}
// Ignore parts of a record
final (name, _, age) = ('Alice', 'ignored', 30);
Flutter 3.29: adaptive scaffold improvements
The adaptive_scaffold package (part of the Flutter team's adaptive layout work) now supports foldable devices with hinge detection:
AdaptiveScaffold(
destinations: const [
NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
],
body: (_) => const HomeView(),
// Automatically adjusts for foldables — shows content on each half
useDrawer: false,
)
Widget inspector improvements in DevTools
DevTools 2.40 (bundled with Flutter 3.29) adds:
- Layout Explorer for Row/Column — visual representation of flex factors and constraints
- Property editor — edit widget properties live without restarting
- Network profiler — see HTTP request timings alongside frame timeline
pubspec.yaml: dependency_overrides for conflicts
A common issue resolved in Dart 3.7 — transitive dependency conflicts are more clearly reported:
# Override a transitive dependency to resolve version conflict
dependency_overrides:
some_package: ^2.1.0
The resolver now suggests the exact override needed when it detects a conflict, rather than just reporting the conflict.
Upgrading
flutter upgrade # Gets Flutter 3.29 and Dart 3.7
# Fix deprecations automatically
dart fix --apply
# Regenerate goldens for Impeller changes
flutter test --update-goldens
# Review remaining issues
flutter analyze
Common pitfalls
Not reviewing golden test diffs before committing. --update-goldens overwrites existing files. Always view the diff to confirm the new rendering looks correct — not just different. A visual regression hidden in a mass golden update is hard to spot later.
Assuming extension types replace regular classes. Extension types have no runtime overhead but also no runtime identity — you can't use is to check for them at runtime. They're for compile-time type safety, not polymorphism.
Skipping the release notes. Every Flutter release has a breaking changes page. The 3.29 release includes a few API removals that were deprecated in 3.x. Check flutter.dev/docs/release/breaking-changes/3-29 before upgrading a production app.
Sign in to like, dislike, or report.