Flutter 3.47 and Dart 3.13 bring primary constructors and an iOS 15 floor

Flutter 3.47 and Dart 3.13 bring primary constructors and an iOS 15 floor

Dart 3.13 makes primary constructors stable. Flutter 3.47 ships standalone Material and Cupertino packages and raises the iOS minimum to 15. What to migrate.

FlutterDartMaterialiOS

Flutter 3.47 and Dart 3.13 were announced on August 12, 2026. Dart gets stable primary constructors, Material and Cupertino ship as standalone 1.0 packages, and Flutter raises its minimum platform versions to iOS 15, macOS 12 and Java 17. A follow-up post on September 9 covered the Material and Cupertino migration in more detail. With the in-SDK libraries due for deprecation in November and the iOS 27 SDK requiring the scene lifecycle, Flutter teams have two clocks running.

What shipped

Dart 3.13: primary constructors are stable

Primary constructors, previewed in Dart 3.12, are stable in 3.13. They let you declare fields directly in the class header:

class Point(final int x, final int y);

New lints and IDE refactorings help migrate existing classes. Dart 3.13 also adds an experimental preview of Wasm deferred loading, enabled with dart compile wasm -O2 --enable-deferred-loading, and native tree-shaking through @RecordUse.

Material and Cupertino leave the SDK

Flutter 3.47 marks the 1.0 release of the standalone material_ui and cupertino_ui packages. The in-SDK Material and Cupertino libraries are scheduled for formal deprecation in the fall stable release in November.

The September 9 post, "Material and Cupertino decoupling are here", describes the migration as a dart fix drop-in. The packages ship on weekly schedules, while the SDK continues to release every three months.

Flutter 3.47 platform changes

  • Impeller is now the default renderer on macOS, Windows and Linux.
  • Widget Previews is stable.
  • The minimum iOS version rises from 13 to 15, and the minimum macOS version from 10.15 to 12.
  • Java 17 is now the minimum.
  • Flutter prepares for the iOS 27 SDK, which mandates the UIScene lifecycle.
  • On Android, the release is verified against Kotlin 2.4.0, AGP 9.1.0 and Gradle 9.3.1.
  • According to the Flutter team, 92 of the top 100 iOS plugins have migrated to Swift Package Manager.

What it means for your app

The iOS 15 floor drops some users

Raising the minimum to iOS 15 means your new builds no longer support iOS 13 and 14. Whether that matters depends on your audience, so check your analytics before upgrading. The same applies to macOS versions below 12 if you ship a desktop app.

The scene lifecycle touches native files

Flutter 3.47 prepares for the iOS 27 SDK and its UIScene requirement, and the iOS project inside your repository is still yours to maintain. Expect to clean up your Podfile and Info.plist as part of the upgrade, especially in older projects that have collected custom native code over the years.

Material and Cupertino become dependencies

Moving to material_ui and cupertino_ui now keeps you ahead of the deprecation warnings that arrive in November. It also changes how design updates reach you. The packages ship on a weekly schedule, so you can take widget fixes without waiting for an SDK release, and you can upgrade the SDK without pulling in design changes you did not plan for.

Toolchains move together

Java 17, Kotlin 2.4.0, AGP 9.1.0 and Gradle 9.3.1 are the versions Flutter verified on Android. CI images and local machines on older JDKs or Gradle versions are a likely source of a failed first build after upgrading. On iOS, most of the top 100 plugins are on Swift Package Manager, though not all of them, and smaller plugins may take longer.

Desktop rendering and tooling

If you ship desktop apps, Impeller becoming the default renderer on macOS, Windows and Linux reaches your app without any code change, so plan a visual check on each platform. Widget Previews reaching stable is the quieter improvement, and it makes previews safer to build into your team's everyday UI workflow.

Primary constructors cut boilerplate

Models and DTOs are where primary constructors pay off first. A class that used to list each field and then repeat it in a constructor now declares it once. With lints and IDE refactorings available, this is a good moment to modernize data classes, ideally in small batches that are easy to review.

A practical checklist

  1. Check your analytics for users on iOS 13 and 14, and on macOS versions below 12, before you commit to the upgrade.
  2. Update CI images and developer machines to Java 17, and align your Android build with Kotlin 2.4.0, AGP 9.1.0 and Gradle 9.3.1.
  3. Upgrade to Flutter 3.47 on a branch, build iOS against the iOS 27 SDK, and clean up Podfile and Info.plist for the UIScene lifecycle.
  4. Add material_ui and cupertino_ui, run dart fix, and review the diff before merging.
  5. Check every iOS plugin you depend on for Swift Package Manager support, and flag the ones that still rely on CocoaPods.
  6. Convert a few model classes to primary constructors with the new lints and refactorings, then agree on a convention before converting the rest.
  7. If you ship desktop apps, do a visual pass on macOS, Windows and Linux now that Impeller is the default renderer there.
  8. If you ship Flutter web with Wasm, try deferred loading on a branch, and keep it out of production while it is experimental.

My take

The Material and Cupertino split has the longest consequences. Weekly package releases mean faster fixes, and they also mean one more set of versions to track and test. I think that trade is worth it: design-system changes should not wait for a quarterly SDK, and SDK upgrades should not force design changes.

Primary constructors are the change developers will enjoy most, and they do not need a big-bang migration. Use them in new code, convert older classes when you touch them, and let the lints catch the rest.

The iOS 15 floor is the decision to make deliberately. For many apps it will be uneventful, but you should know that from your own numbers before you ship. Pair the upgrade with the UIScene work so you only open the iOS project once.


Sources