Evolución del lenguaje Dart
Cambios y adiciones notables en el lenguaje de programación Dart.
Esta página enumera los cambios y adiciones notables en el lenguaje de programación Dart.
- Para conocer detalles específicos sobre la versión de lenguaje compatible más reciente, consulta la documentación del lenguaje o la especificación del lenguaje.
- Para obtener un historial completo de los cambios en el Dart SDK, consulta el SDK changelog.
- Para obtener un historial completo de los cambios incompatibles, incluidos los cambios con versión de lenguaje, consulta la página de Cambios incompatibles.
Para usar una característica de lenguaje introducida después de la versión 2.0, establece una restricción de SDK no inferior a la versión en la que Dart admitió esa característica por primera vez.
Por ejemplo: Para usar Null Safety, introducido en el 2.12,
establece 2.12.0 como la restricción inferior en el archivo pubspec.yaml.
environment:
sdk: '>=2.12.0 <3.0.0'
Cambios en cada versión
#Dart 3.12
#Released 18 May 2026 | Anuncio de Dart 3.12
Dart 3.12 introduce parámetros nombrados privados, que te permiten inicializar campos privados directamente a través de parámetros formales de inicialización. Anteriormente, inicializar un campo privado a través de un parámetro nombrado requería una asignación manual en la lista de inicialización del constructor.
Ahora, cuando un parámetro formal de inicialización se refiere a un campo privado,
Dart elimina el guion bajo inicial (_) para derivar el nombre público del parámetro,
por lo que los llamadores usan el nombre sin prefijo en el sitio de la llamada:
class Point {
final int _x;
final int _y;
Point({required this._x, required this._y});
}
void main() {
// Callers use the public, unprefixed names of the parameters.
final point = Point(x: 1, y: 2);
}
Dart 3.11
#Released 9 February 2026 | Anuncio de Dart 3.11
Aunque Dart 3.11 no introduce nuevas características de lenguaje, la versión incluye varias mejoras en el soporte del analyzer y del editor para la sintaxis dot shorthand introducida en Dart 3.10.
Dart 3.10
#Released 12 November 2025 | Anuncio de Dart 3.10
Dart 3.10 introduce la sintaxis dot shorthands, una sintaxis concisa
que te permite omitir nombres de tipos explícitos al acceder a valores de enums,
miembros estáticos o constructores. Si el compilador puede inferir
el tipo a partir del contexto, ahora puedes usar simplemente .foo
en lugar del nombre completo ContextType.foo.
// Use dot shorthand syntax on enums:
enum Status { none, running, stopped, paused }
Status currentStatus = .running; // Instead of Status.running
// Use dot shorthand syntax on a static method:
int port = .parse('8080'); // Instead of int.parse('8080')
// Uses dot shorthand syntax on a constructor:
class Point {
final int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0;
}
Point origin = .origin(); // Instead of Point.origin()
Dart 3.9
#Released 13 August 2025 | Anuncio de Dart 3.9
Las siguientes características de soporte se han actualizado para Dart 3.9:
-
Null safety: Dart ahora asume Null Safety al calcular la promoción de tipos, la alcanzabilidad y la asignación definitiva. Como resultado de este cambio, podrían producirse más advertencias de
dead_code. -
El límite superior de la versión de Flutter ahora se respeta: a partir de la versión de lenguaje 3.9, el límite superior de la restricción del flutter SDK ahora se respeta en tu paquete raíz.
Por ejemplo, un archivo
pubspec.yamlcon las siguientes restricciones:yamlname: my_app environment: sdk: ^3.9.0 flutter: 3.33.0Da como resultado que
dart pub getfalle si se invoca con una versión del SDK de Flutter diferente de3.33.0. El límite superior de la restricción deflutterse sigue ignorando en los paquetes utilizados como dependencias. Para obtener más información sobre el contexto de este cambio, consulta flutter/flutter#95472.
Para obtener más información sobre estos y otros cambios adicionales, consulta el changelog de Dart 3.9.
Dart 3.8
#Released 20 May 2025 | Anuncio de Dart 3.8
Se han añadido las siguientes características de lenguaje a Dart 3.8:
- Elementos null-aware: un elemento null-aware evalúa
una expresión en un literal de colección y, si el resultado
no es
null, inserta el valor en la colección circundante.
Se han actualizado las siguientes características de soporte:
- dart format: el formateador de Dart 3.8 se basa en la reescritura de la versión anterior, incorporando comentarios, correcciones de errores y mejoras adicionales. Ahora automatiza de forma inteligente la colocación de la coma final, decidiendo si dividir las estructuras en lugar de forzarlas. La actualización también incluye cambios de estilo para ajustar y mejorar la salida del código.
Para obtener más información sobre estos y otros cambios adicionales, consulta el changelog de Dart 3.8.
Dart 3.7
#Released 12 February 2025 | Anuncio de Dart 3.7
Dart 3.7 añadió soporte para variables comodín al lenguaje.
Una variable comodín es una variable local o parámetro llamado _.
Las variables comodín no son vinculantes,
por lo que se pueden declarar varias veces sin colisiones.
Por ejemplo:
Foo(_, this._, super._, void _()) {}
El comando dart format también está vinculado a la versión del lenguaje a partir de la versión 3.7.
Si la versión del lenguaje de un archivo de entrada es 3.7 o posterior, el código se formatea
con el nuevo estilo alto.
El nuevo estilo se ve similar al estilo que obtienes al agregar comas finales a las listas de argumentos, excepto que ahora el formateador agregará y quitará esas comas por ti. Cuando una lista de argumentos o parámetros se divide, se formatea de la siguiente manera:
longFunction(
longArgument,
anotherLongArgument,
);
Puedes encontrar más detalles en el changelog.
Dart 3.6
#Released 11 December 2024 | Anuncio de Dart 3.6
Dart 3.6 añadió soporte para guiones bajos como separadores de dígitos (_) al lenguaje.
Los separadores de dígitos mejoran la legibilidad de los literales numéricos largos.
var m = 1__000_000__000_000__000_000;
Dart 3.5
#Released 6 August 2024 | Anuncio de Dart 3.5
Dart 3.5 no añadió nuevas características de lenguaje, pero realizó cambios menores en el contexto considerado durante la inferencia de tipos. Estos incluyen los siguientes cambios sin versión de lenguaje:
- Cuando el contexto para una expresión
awaitesdynamic, el contexto para el operando de la expresión es ahoraFutureOr<_>. - Cuando el contexto para una expresión if-null completa (
e1 ?? e2) esdynamic, el contexto parae2es ahora el tipo estático dee1.
Dart 3.4
#Released 14 May 2024 | Anuncio de Dart 3.4
Dart 3.4 realizó varias mejoras relacionadas con el análisis de tipos. Estas incluyen:
- Mejoras en el análisis de tipos de expresiones condicionales, expresiones y asignaciones if-null, y expresiones switch.
- Alineación del esquema del tipo de contexto del patrón para patrones cast con la especificación.
- Hacer que el esquema de tipos para el operador de propagación null-aware (
...?) admita valores nulos para literales de mapa y conjunto, para coincidir con el comportamiento de los literales de lista.
Dart 3.3
#Released 15 February 2024 | Anuncio de Dart 3.3
Dart 3.3 añadió algunas mejoras al lenguaje:
-
Los tipos de extensión son una característica nueva en Dart que permite envolver un tipo existente a costo cero. Son similares a las clases wrapper y a los métodos de extensión, pero con diferencias de implementación y compensaciones diferentes.
dartextension type Meters(int value) { String get label => '${value}m'; Meters operator +(Meters other) => Meters(value + other.value); } void main() { var m = Meters(42); // Has type `Meters`. var m2 = m + m; // OK, type `Meters`. // int i = m; // Compile-time error, wrong type. // m.isEven; // Compile-time error, no such member. assert(identical(m, m.value)); // Succeeds. } -
Los getters abstractos ahora son promocionables bajo las reglas de la promoción de campos finales privados, si no hay declaraciones en conflicto.
Dart 3.2
#Released 15 November 2023 | Anuncio de Dart 3.2
Dart 3.2 añadió mejoras al análisis de flujo, incluyendo:
-
Se ha ampliado la promoción de tipos para que funcione en campos finales privados. Anteriormente solo estaba disponible para variables locales y parámetros, ahora los campos finales privados pueden promoverse a tipos no nullables mediante comprobaciones de nulos y pruebas
is. Por ejemplo, el siguiente código ahora es sound:dartclass Example { final int? _privateField; Example(this._privateField); void f() { if (_privateField != null) { // _privateField has now been promoted; you can use it without // null checking it. int i = _privateField; // OK } } } // Private field promotions also work from outside of the class: void f(Example x) { if (x._privateField != null) { int i = x._privateField; // OK } }Para obtener más información sobre cuándo los campos finales privados pueden y no pueden promoverse, consulta Cómo solucionar fallas en la promoción de tipos.
-
Se corrigieron inconsistencias en el comportamiento de la promoción de tipos de las sentencias if-case cuando el valor con el que se realiza la coincidencia lanza una excepción.
Dart 3.1
#Released 16 August 2023 | Anuncio de Dart 3.1
Dart 3.1 no añadió nuevas características ni realizó cambios en el lenguaje.
Dart 3.0
#Released 10 May 2023 | Anuncio de Dart 3.0
Dart 3.0 introdujo varias características nuevas importantes en el lenguaje:
- Los patrones, una nueva categoría de la gramática que te permite hacer coincidir y desestructurar valores.
- Los records, un tipo nuevo que te permite agregar múltiples valores de diferentes tipos en el retorno de una sola función.
- Los modificadores de clase, un conjunto nuevo de palabras clave que te permiten controlar cómo se puede utilizar una clase o mixin.
- Las expresiones switch, una forma nueva de bifurcación múltiple permitida donde se esperan expresiones.
- Las cláusulas if-case, una estructura condicional nueva que hace coincidir un valor con un patrón y ejecuta la rama then o else, según si el patrón coincide.
Dart 3.0 también introdujo algunos cambios incompatibles en el lenguaje:
- Las declaraciones de clase sin el modificador de clase
mixinya no se pueden aplicar como mixins. - Ahora es un error en tiempo de compilación si se utilizan dos puntos (
:) como separador antes del valor predeterminado de un parámetro nombrado opcional. Usa un signo igual (=) en su lugar. - Ahora es un error en tiempo de compilación si una sentencia
continueapunta a una etiqueta que no está adjunta a una sentencia de bucle (for,doywhile) o a un miembro de unswitch.
Dart 2.19
#Released 25 January 2023
Dart 2.19 introdujo algunas precauciones en torno a la inferencia de tipos. Estas incluyen:
- Más banderas de análisis de flujo para casos de código inalcanzable.
- Ya no se delegan los nombres privados inaccesibles a
noSuchMethod. - La inferencia de tipos de nivel superior lanza excepciones en dependencias cíclicas.
Dart 2.19 también introdujo soporte para librerías sin nombre. Las directivas de librería, utilizadas para añadir comentarios de documentación y anotaciones a nivel de librería, pueden y deben ahora escribirse sin nombre:
/// A really great test library.
@TestOn('browser')
library;
Dart 2.18
#Released 30 August 2022 | Anuncio de Dart 2.18
Dart 2.18 mejoró la inferencia de tipos. Este cambio permite el flujo de información entre argumentos en llamadas a funciones genéricas. Antes de la versión 2.18, si no especificabas el tipo de un argumento en algunos métodos, Dart informaba de errores. Estos errores de tipo citaban posibles ocurrencias de nulos. Con la versión 2.18, el compilador infiere el tipo del argumento a partir de otros valores en una invocación. No necesitas especificar el tipo del argumento en línea.
Dart 2.18 también descontinuó el soporte para clases mixin que no extienden
de Object.
Para obtener más información sobre estas características, consulta:
Dart 2.17
#Released 11 May 2022 | Anuncio de Dart 2.17
Dart 2.17 amplió la funcionalidad de los enums con los enums mejorados. Los enums mejorados permiten que las declaraciones de enums definan miembros, incluyendo campos, constructores, métodos, getters, etc.
Dart 2.17 añadió soporte para parámetros super-inicializadores en los constructores. Los super parámetros te permiten evitar tener que pasar manualmente cada parámetro a la invocación super de un constructor no redireccionado. En su lugar, puedes usar super parámetros para reenviar parámetros a un constructor de superclase.
Dart 2.17 eliminó algunas restricciones en los argumentos nombrados. Los argumentos nombrados ahora se pueden intercalar libremente con los argumentos posicionales. A partir de Dart 2.17, puedes escribir el siguiente código:
void main() {
test(skip: true, 'A test description', () {
// Very long function body here...
});
}
Para obtener más información sobre estas características, consulta:
Dart 2.16
#Released 3 February 2022 | Anuncio de Dart 2.16
Dart 2.16 no añadió nuevas características al lenguaje Dart. Sí amplió las herramientas de Dart.
Dart 2.15
#Released 8 December 2021 | Anuncio de Dart 2.15
Dart 2.15 mejoró el soporte para punteros de función, conocidos como tear-offs. En particular, ahora se admiten los tear-offs de constructores.
Dart 2.14
#Released 8 September 2021 | Anuncio de Dart 2.14
Dart 2.14 añadió el operador de desplazamiento sin signo (o desplazamiento triple) (>>>).
Este nuevo operador funciona como >>,
excepto que siempre llena los bits más significativos con ceros.
Para obtener más información sobre estos operadores, consulta operadores de desplazamiento y bit a bit.
Dart 2.14 eliminó algunas restricciones en los argumentos de tipo. Puedes pasar argumentos de tipo a anotaciones y utilizar un tipo de función genérica como argumento de tipo. A partir de Dart 2.14, puedes escribir el siguiente código:
@TypeHelper<int>(42, "The meaning")
late List<T Function<T>(T)> idFunctions;
var callback = [<T>(T value) => value];
late S Function<S extends T Function<T>(T)>(S) f;
Dart 2.13
#Released 19 May 2021 | Anuncio de Dart 2.13
Dart 2.13 amplió el soporte para alias de tipo (typedef).
Los alias de tipo solían funcionar solo para tipos de función
pero ahora funcionan para cualquier tipo.
Puedes usar el nuevo nombre creado con un alias de tipo
en cualquier lugar donde se pudiera usar el tipo original.
Dart 2.13 mejoró el soporte de estructuras en Dart FFI, añadiendo soporte para arrays en línea y estructuras empaquetadas.
Dart 2.12
#Released 3 March 2021 | Anuncio de Dart 2.12
Dart 2.12 añadió soporte para sound null safety. Cuando optas por null safety, los tipos en tu código no admiten valores nulos (non-nullable) por defecto, lo que significa que las variables no pueden contener null a menos que indiques que sí pueden. Con null safety, tus errores de desreferenciación de nulos en tiempo de ejecución se convierten en errores de análisis en tiempo de edición.
En Dart 2.12, Dart FFI se graduó de la fase beta al canal estable.
Dart 2.10
#Released 1 October 2020 | Anuncio de Dart 2.10
Dart 2.10 no añadió nuevas características al lenguaje Dart.
Dart 2.9
#Released 5 August 2020
Dart 2.9 no añadió nuevas características al lenguaje Dart.
Dart 2.8
#Released 6 May 2020 | Anuncio de Dart 2.8
Dart 2.8 no añadió ninguna característica al lenguaje Dart. Sí contuvo una serie de cambios de ruptura (breaking changes) preparatorios para mejorar la usabilidad y el rendimiento relacionados con la anulabilidad para null safety.
Dart 2.7
#Released 11 December 2019 | Anuncio de Dart 2.7
Dart 2.7 añadió soporte para los métodos de extensión, lo que te permite añadir funcionalidad a cualquier tipo —incluso a tipos que no controlas— con la brevedad y la experiencia de autocompletado de las llamadas a métodos normales.
El siguiente ejemplo extiende la clase String de
dart:core con un nuevo método parseInt():
extension ParseNumbers on String {
int parseInt() {
return int.parse(this);
}
}
void main() {
int i = '42'.parseInt();
print(i);
}
Dart 2.6
#Released 5 November 2019 | Anuncio de Dart 2.6
Dart 2.6 introdujo un
cambio incompatible (dart-lang/sdk#37985).
Las restricciones en las que Null sirve como subtipo de FutureOr<T>
ahora producen Null como solución para T.
Por ejemplo: el siguiente código ahora imprime Null.
Antes de Dart 2.6, imprimía dynamic.
La clausura anónima () {} devuelve el tipo Null.
import 'dart:async';
void foo<T>(FutureOr<T> Function() f) { print(T); }
main() { foo(() {}); }
Dart 2.5
#Released 10 September 2019 | Anuncio de Dart 2.5
Dart 2.5 no añadió ninguna característica al lenguaje Dart, pero sí añadió
soporte para llamar a código C nativo desde el código Dart
utilizando una nueva librería principal, dart:ffi.
Dart 2.4
#Released 27 June 2019
Dart 2.4 introduce un cambio incompatible dart-lang/sdk#35097.
Dart ahora impone la covarianza de las variables de tipo utilizadas en las superinterfaces. Por ejemplo: antes de esta versión, Dart aceptaba, pero ahora rechaza, el siguiente código:
class A<X> {};
class B<X> extends A<void Function(X)> {};
Ahora puedes usar async como identificador en
funciones asíncronas y generadoras.
Dart 2.3
#Released 8 May 2019 | Anuncio de Dart 2.3
Dart 2.3 añadió tres operadores diseñados para mejorar el código que realiza manipulación de listas, como el código declarativo de interfaz de usuario.
El operador de propagación
permite desempaquetar los elementos de una lista en otra.
En el siguiente ejemplo, la lista devuelta por buildMainElements()
se desempaqueta en la lista que se pasa al argumento children:
Widget build(BuildContext context) {
return Column(children: [
Header(),
...buildMainElements(),
Footer(),
]);
}
El operador collection if permite añadir elementos condicionalmente.
El siguiente ejemplo añade un elemento FlatButton a menos que
la aplicación muestre la última página:
Widget build(BuildContext context) {
return Column(children: [
Text(mainText),
if (page != pages.last)
FlatButton(child: Text('Next')),
]);
}
El operador collection for permite construir elementos repetidos.
El siguiente ejemplo añade un elemento HeadingAction para
cada sección en sections:
Widget build(BuildContext context) {
return Column(children: [
Text(mainText),
for (var section in sections)
HeadingAction(section.heading),
]);
}
Dart 2.2
#Released 26 February 2019 | Anuncio de Dart 2.2
Dart 2.2 añadió soporte para literales de conjunto:
const Set<String> currencies = {'EUR', 'USD', 'JPY'};
Dart 2.1
#Released 15 November 2018 | Anuncio de Dart 2.1
Dart 2.1 añadió soporte para la conversión de int a double,
lo que permite a los desarrolladores establecer valores double utilizando literales enteros.
Esta característica eliminó la molestia de verse obligado a utilizar un
literal double (por ejemplo, 4.0)
cuando el valor era conceptualmente un entero.
En el siguiente código de Flutter, horizontal y vertical tienen el tipo double:
padding: const EdgeInsets.symmetric(
horizontal: 4,
vertical: 8,
)
Dart 2.0
#Released 22 February 2018 | Anuncio de Dart 2.0
Dart 2.0 implementó un nuevo sistema de tipos sound. Antes de Dart 2.0, los tipos no eran completamente seguros, y Dart dependía en gran medida de la comprobación de tipos en tiempo de ejecución. El código de Dart 1.x tuvo que ser migrado a Dart 2.
Versionado del lenguaje
#A menos que se indique lo contrario, la documentación de este sitio refleja Dart 3.12.2. Página actualizada por última vez el 2026-05-20. Ver fuente oreportar un problema.