Announcing Dart 3.9
Hello, Dart developers! The latest stable version, Dart 3.9, is officially here!
This release is all about making your work easier and your apps more efficient. With key updates to null safety, performance boosts to the Dart CLI, and the exciting addition of the Dart and Flutter MCP Server to empower your AI assistants, there’s a lot to love. Read on to discover everything that’s new in Dart 3.9.
Language updates
Null safety
Dart 3.9 assumes null safety when computing type promotion, reachability, and definite assignment. To take advantage of these improvements, set your package’s SDK constraint lower bound to 3.9 or greater (sdk: ^3.9.0). As a result of this change, more dead_code warnings may be produced.
Soundness updates
We fixed a soundness issue that allowed direct invocation of a value returned from a getter without any runtime checks when the getter’s return type was a generic type argument instantiated as dynamic or Function. This soundness issue arose with the dev-compiler DDC, and no other tools are affected.
Before the fix the following getter could trigger an issue with a direct invocation. For example:
// The following getter used to trigger an issue with a direct
// invocation
// The getter
class Container<T> {
T get value => ((int i) => i.isEven) as T;
}
// The direct invocation
Container<dynamic>().value('Invocation with missing runtime checks!');Tools updates
Dart and Flutter MCP Server
The Dart and Flutter MCP Server acts as a bridge, giving AI coding assistants such as Gemini CLI, Cursor, and GitHub Copilot, access to more of your Dart project’s context. Instead of just suggesting code, your AI assistant can now understand your project deeply and take action on your behalf.
With the Dart and Flutter MCP Server, you can ask an AI assistant to:
- Fix runtime errors (see example).
- Manage dependencies (see example).
- Write and correct code.
- And more.
The Dart and Flutter MCP Server is now available on the stable channel of the Dart SDK.
Faster Dart CLI
Previously, when you ran some Dart CLI commands like dart analyze and dart fix, your computer had to compile the code for the analysis server just before running it. Now, these tools use an Ahead-Of-Time (AOT) compiled snapshot of the analysis server, which means the server has been pre-compiled into fast, native machine code.
Results vary depending on the source code, but we ran some common commands on a sample package and got some interesting results. Some short commands like dart format now complete in a fraction of the time and longer running ones like dart analyze got nearly 50% faster.
pub client updates
Git dependencies can now be version-solved based on git tags.
When you use a tag_pattern in the descriptor and there is a version constraint, all commits matching the pattern are considered during resolution. In the following example, only version 2.0.1 of my_dependency and higher is considered:
dependencies:
my_dependency:
git:
url: https://github.com/example/my_dependency
tag_pattern: v{{version}}
version: ^2.0.1Starting from language version 3.9, the flutter constraint upper bound is now respected in your root package (the dart constraint was already respected). Setting a narrow dart or flutter constraint can be useful to ensure a team of developers all use the same SDK version when jointly developing an app (see issue #95472 for details).
For example, in a root pubspec like this pub get will fail if invoked with a version of the Flutter SDK that is not 3.33.0:
name: my_app
environment:
sdk: ^3.9.0
flutter: 3.33.0Dart native compiler
We added cross-compilation support for target architectures of arm (ARM32) and riscv64 (RV64GC) when the target OS is Linux.
Deprecations & breaking changes
32-bit x86 architecture
Dart has deprecated the 32-bit x86 architecture. For most developers this will have no impact, as it mainly affects older x86-based Android emulators and a small number of physical devices. 32-bit ARM and 64-bit x86_64 emulators and devices are still supported. The full technical breakdown is available in the Dart GitHub deprecation issue.
dart build
dart build is in preview on the beta channel.
dart build -f exe <target> is now dart build cli — target=<target>. See dart build cli — help for more info.
Wrap up
That’s a wrap on Dart 3.9! We hope you’re as excited about these updates as we are. We always appreciate your feedback, so feel free to share your thoughts. Until next time, happy coding!