Flutter is Google's UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more athttps://flutter.dev
Dive into Flutter 3.29! This release refines development and boosts performance, with updates to Impeller, Cupertino, DevTools and more. With 104 unique authors contributing this release cycle, Flutter 3.29 showcases the community’s dedication. Let’s explore what’s new!
CupertinoNavigationBar
andCupertinoSliverNavigationBar
now accept abottom widget, typically a search field or segmented control.
In aCupertinoSliverNavigationBar
, this bottom widget can be configured using thebottomMode property to either automatically resize until hidden or to always be shown when the navigation bar is scrolled.
Other changes to the navigation bars include:
CupertinoSliverNavigationBar
snaps between its expanded and collapsed state.CupertinoNavigationBar.large
constructor allows the static navigation bar to display a large title.CupertinoSheetRoute
shows an iOS-styled modal sheet view that can be removed using the drag-to-dismiss gesture.showCupertinoSheet
function displays the sheet with a common setup for nested navigation baked in.CupertinoAlertDialog
’s native fidelity in dark mode, as shown in the following screenshots:FadeForwardsPageTransitionsBuilder
is the new Material 3 (M3) page transition builder, designed to match the Android’s latest page transition behavior. During the transition, the incoming page slides in from right to left while simultaneously fading in, and the outgoing page slides out from right to left, fading out concurrently. This new transition also addresses the performance issues previously caused by theZoomPageTransitionsBuilder
.CircularProgressIndicator
andLinearProgressIndicator
to align with the latest Material Design 3 specifications. To use the updated styling, either set theyear2023
property tofalse
, or setProgressIndicatorThemeData.year2023
tofalse
.Slider
design, featuring updated track and handle shapes. TheSlider
defaults to the previous Material 3 style. To enable the latest design, either setyear2023
tofalse
, or setSliderThemeData.year2023
tofalse
.This release includes several bug fixes and feature enhancements for the Material library. Notable fixes include:
DropdownMenu.onSelected
callback.TabBar
elastic tab animation.RangeSlider
thumb alignment with divisions, thumb padding, and rounded corners.In addition to bug fixes, this release enhances the customizability of several Material components. ThemouseCursor
property has been added toChip
,Tooltip
, andReorderableListView
, allowing for custom mouse cursors on hover.
Flutter now gives you more information about the selection under aSelectionArea
orSelectableRegion
withSelectionListener
andSelectionListenerNotifier
. TheSelectionDetails
object, available throughSelectionListenerNotifier
, provides you with the start and end offsets of the selection (relative to the wrapped subtree), and indicates whether a selection exists and if it’s collapsed. For a widget or selectable subtree that you want to listen to, wrap it with theSelectionListener
widget.
Flutter also gives you information regarding the status of aSelectionArea
orSelectableRegion
through theSelectableRegionSelectionStatusScope
inherited widget. You can check whether a parentSelectionArea
orSelectableRegion
is actively changing or has finalized its selection by usingSelectableRegionSelectionStatusScope.maybeOf(context)
and checking theSelectableRegionSelectionStatus
.
This release improves the accessibility of several Material widgets:
When initially released in May 2024, Flutter’s WebAssembly (wasm) support on the web required you to host your Flutter applications with special HTTP response headers. This requirement has now been relaxed. While updating the headers allows Flutter web apps built with wasm to run with multiple threads, using default headers now allows the application to run with wasm, but limited to a single thread.
We have fixed several issues around images on the WebGL backends but the most important are:
Thanks to the feedback and bug reports on the 3.27 beta and stable releases, a number of correctness and performance improvements were made to the Vulkan backend, including:
In 3.29, Android devices that don’t have a functional Vulkan driver will fall back to Impeller running on OpenGLES instead of using Skia. This behavior is enabled by default and doesn’t need to be configured. This brings Impeller support on Android to 100% of Flutter’s supported Android devices.
Skia support has been removed from the iOS backend and theFLTEnableImpeller
opt-out flag no longer works. Further binary size reductions are expected in future releases as we begin to remove Skia components from iOS builds.
This release contains a number of new features that take advantage of the Impeller backend.
Applications that display multiple backdrop filters can now use the new widgetBackdropGroup
and a newBackdropFilter.grouped
constructor. These can improve performance of multiple blurs above and beyond what was possible on the Skia backend. For an example, visit thebasic.dart source code.
A newImageFilter
constructor allows applying a custom shader to any child widgets. This provides similar functionality to theAnimatedSampler
widget frompackage:flutter_shaders
, except that it also works with backdrop filters. For an example, visit thepainting.dart source code.
Previously, Flutter executed Dart code on a different thread (UI thread) than the platform’s main thread. This allowed higher theoretical throughput if both platform and UI threads were occupied, but came at the cost of making most platform interop require serialized and asynchronous message passing. This architecture also had knock-on effects on text input, accessibility, plugins, and so on.
Starting in 3.29, Flutter on Android and iOS execute Dart code on the application’s main thread, and there is no longer a separate UI thread. This is the first part in a series of changes to improve platform interop on mobile platforms, as it allows making synchronous calls to and from the platform without the overhead of serialization and message passing.
The new DevTools inspector is enabled by default for all users. The new inspector has a condensed widget tree, a new widget properties view, and an option to automatically update in response to hot-reload and navigation events. For more details, visit thenew inspector page on docs.flutter.dev.
After enabling widget selection mode from the DevTools inspector, any selections on the device are considered widget selections until you exit widget selection mode. Previously, after the initial widget selection you needed to click the on-deviceSelect widget button to then select another widget. Instead, there is now an on-device button that can be used to quickly exit widget selection mode.
The Logging tool in DevTools has been improved in the following ways:
These are just a few highlights from this release. To learn more about all the updates included in Flutter 3.29, check out the release notes for DevTools2.41.0 and2.42.2.
We plan to discontinue support for the following packages on April 30th, 2025:
We encourage any interested members of the community to coordinate on establishing and maintaining forks. Links to the issues are provided above for discussion and coordination.
Removal of script-based application of the Flutter Gradle plugin, which has been deprecated since 3.19. This supports converting the Flutter Gradle plugin from Groovy to Kotlin, and towards migrating it to use AGPs public API. This work is expected to decrease the frequency of breakages when a new AGP version is published and reduce build-based regressions.
Projects created before 3.16 that have not yet migrated will likely be impacted. If the flutter tool logs the warning: “You are applying Flutter’s main Gradle plugin imperatively” when building your project, you are impacted and need to migrate according toDeprecated imperative apply of Flutter’s Gradle plugins on docs.flutter.dev.
This is the first release where the HTML renderer has been removed from Flutter web. For more information, visitThe intent to deprecate and remove the HTML renderer in Flutter web and Issue 145584: Intent to deprecate and remove the HTML renderer in Flutter web.
This release also gives youmore control over how images are displayed on the web. In the previous beta release (3.28), Image widgets would automatically use<img>
elements to display images from URLs when CORS errors occurred. This could lead to inconsistent behavior. Now, thewebHtmlElementStrategy
flag lets you choose when<img>
elements are used. While this fallback is disabled by default, you can still enable the fallback or even prioritize<img>
elements if needed for your application.
As part of our ongoing theme normalization project in Material, this release deprecatesThemeData.dialogBackgroundColor
in favor ofDialogThemeData.backgroundColor
. You can use thedart fix
command to migrate affected code.
Also in Material, theButtonStyleButton
iconAlignment
property was deprecated after being added toButtonStyle
and associatedstyleFrom
methods.
For allbreaking changes in this release, see the full list of migration guidance on the breaking changes page of the website.
As always, many thanks to the community forcontributing tests — these help us identify breaking changes. To learn more, check outFlutter’s breaking change policy.
Thanks to the Flutter community for making this release possible! We’re excited for the future and can’t wait to see your apps. Check therelease notes and changelog, then runflutter upgrade
and start building!
Flutter is Google's UI framework for crafting high-quality native interfaces on iOS, Android, web, and desktop. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source. Learn more athttps://flutter.dev
Kevin Chisholm is a Technical Program Manager for Dart and Flutter at Google.