Dart 3.10 just landed! This version is packed with incremental improvements to the Dart SDK, with the most awaited feature being the dot shorthand syntax that we're excited to explore with you.
In this article, we'll dive into the most important updates, breaking changes, and migration guidance for developers planning to adopt Dart 3.10.
Dot shorthands
Have you ever found yourself typing the same type name over and over again? Dot shorthand is here to help! It's a simple but powerful feature that lets you skip the type name when Dart already knows what type you're working with. The key requirement is that Dart must be able to determine the type from the surrounding context, such as a variable declaration, function parameter, or comparison.
The result is less typing. When you're working with enums in a switch statement or calling multiple constructors, you often repeat the same type name. Dot shorthand removes that repetition while keeping your code type-safe.
Here's a simple example:
Before:
After:
Because the variable alignment is explicitly typed as MainAxisAlignment, Dart knows that .center refers to MainAxisAlignment.center.
Dot shorthand is especially useful in Flutter where you frequently work with enums. For example:
Before:
After:
In this case, Dart infers the enum types from the parameter type annotations in the Column constructor. See the sections below for more examples and details on when dot shorthand works.
Here are the main ways to use dot shorthand in practice:
Enums
Before:
After:
Constructors
Before:
After:
You can use .new() as a shorthand for unnamed constructors when the context type makes it clear which class's constructor you're calling.
Static methods
Before:
After:
To dive deeper into how and where you can use dot shorthand, check out the official documentation: Official Dot shorthands Documentation.
Eliminating spurious nulls in generator return types
Another quality-of-life tweak in Dart 3.10 is how return types are inferred for generator functions. Previously, Dart inferred nullable element types even when no null values could actually be yielded.
Earlier releases inferred f as returning Iterable<int?>, even though the return; statement stops iteration instead of yielding null. Dart 3.10 now infers Iterable<int>, which eliminates the spurious nullable type.
Tools
Analyzer
The Dart analyzer’s headline upgrade in 3.10 is a revamped plugin system that makes it much easier to build and share project-specific rules, lints, and assists. If you want to extend those capabilities, see the documentation on writing analyzer plugins and on using analyzer plugins.
Beyond the plugin system, the tooling now calls out incompatible lint rules, autofills missing required field formals, embraces the new @Deprecated and @experimental annotations, refreshes assists for constructor bindings and nullable calls, and adds a remove_deprecations_in_breaking_versions lint to help you retire legacy APIs ahead of breaking releases.
Dart CLI and Dart VM
Dart 3.10 separates the CLI from the virtual machine. The new dart executable focuses on CLI parsing and dispatch, while the lean dartvm binary is dedicated to running code. When you execute dart hello.dart, the CLI spins up dartvm behind the scenes, and the same flow powers dart run and dart test. The CLI now runs only in AOT mode and is no longer produced for ia32 targets (the standalone VM binary still runs there). This split gives embedders clearer control over the runtime and unlocks future optimizations across the toolchain.
Libraries
dart:async
A new constructor, Future.syncValue, has been added for creating futures with a known synchronous value. Unlike Future.value, this constructor does not accept another Future<T> as its value — ensuring that your future always resolves immediately.
dart:core
URI parsing has been improved: Uri.parseIPv4Address and the parsing of embedded IPv4 addresses in IPv6 no longer permit leading zeros. Additionally, these functions now accept start and end parameters, allowing substring parsing without needing to create new string instances.
Dart now has more precise deprecation tools, so you don’t have to mark a whole class as “off-limits” if you don’t want to. Now, you can specifically say what you’d prefer others not to do, like extending, implementing, subclassing, mixing in, or instantiating a class. It gives you much more control over how your APIs are used.
dart:io
One major change is that IOOverrides is now an abstract base class, which means it can no longer be implemented directly. Additionally, it's now possible to override the exit(...) behavior within IOOverrides, enabling finer control over process termination in tests and custom environments.
dart:js_interop
The new JSArray.add method makes migrating from List to JSArray safer. Type checks using isA<JSBoxedDartObject> now correctly verify if a value was created with toJSBox. Factories for extension types can use the @JS() annotation to rename keys within object literals.
Additionally, compile-time checks that previously applied to Function.toJS are now also enforced for toJSCaptureThis. Typed lists that are wrappers around typed arrays now return the original typed array when unwrapped instead of instantiating a new typed array with the same buffer.
With this release, dartify on dart2wasm converts JavaScript Promises to Dart Futures, bringing its behavior in line with dart2js and DDC. Finally, createJSInteropWrapper now supports an optional JavaScript prototype parameter, similar to the functionality provided by createStaticInteropMock.
dart:js_util
dart2wasm drops support for dart:js_util (and package:js/js_util.dart), throwing UnsupportedError when invoked, while package:js/js.dart continues to work.
Closing
Dart 3.10 brings exciting refinements that make development faster, cleaner, and more expressive, especially for teams building at scale with Flutter. As these updates roll out, they’re paving the way for smarter, more efficient app architectures and better developer experiences across the board.
At Somnio Software, we stay ahead of every change to help companies turn ideas into high-impact digital products. Whether you’re exploring how to adopt Dart 3.10, planning to enhance your current app, or ready to bring a new concept to life, our team is here to help you make it real.
.png)

