Anunciando Dart 3.9

¡Hola, desarrolladores de Dart! La última versión estable, Dart 3.9, ya está disponible oficialmente.

Este release se trata de facilitar tu trabajo y hacer tus apps más eficientes. Con actualizaciones clave en null safety, mejoras de rendimiento en el CLI de Dart, y la emocionante adición del Dart y Flutter MCP Server para potenciar tus asistentes de IA, hay mucho que celebrar. Sigue leyendo para descubrir todo lo nuevo en Dart 3.9.

Banner del release de Dart 3.9 con el logo de Dart y un ícono de diana animado.
Anunciando Dart 3.9

Actualizaciones del lenguaje

#

Null safety

#

Dart 3.9 asume null safety al calcular type promotion, reachability, y definite assignment. Para aprovechar estas mejoras, establece el lower bound de la restricción del SDK de tu paquete a 3.9 o superior (sdk: ^3.9.0). Como resultado de este cambio, pueden producirse más warnings de dead_code.

Actualizaciones de soundness

#

Corregimos un problema de soundness que permitía la invocación directa de un valor devuelto por un getter sin verificaciones en runtime cuando el tipo de retorno del getter era un argumento de tipo genérico instanciado como dynamic o Function. Este problema de soundness surgía con el dev-compiler DDC, y no se ven afectadas otras herramientas.

Antes del fix, el siguiente getter podía provocar un problema con una invocación directa. Por ejemplo:

dart
// 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!');

Actualizaciones de herramientas

#

Dart y Flutter MCP Server

#

El Dart y Flutter MCP Server actúa como puente, dando a los asistentes de IA para programación como Gemini CLI, Cursor, y GitHub Copilot, acceso a más contexto de tu proyecto Dart. En lugar de solo sugerir código, tu asistente de IA ahora puede entender tu proyecto profundamente y tomar acciones en tu nombre.

Con el Dart y Flutter MCP Server, puedes pedirle a un asistente de IA:

  • Corregir errores en runtime (ver ejemplo).

  • Gestionar dependencias (ver ejemplo).

  • Escribir y corregir código.

  • Y más.

El Dart y Flutter MCP Server ya está disponible en el canal stable del SDK de Dart.

Animación demostrando un asistente de IA corrigiendo un problema de layout usando el Dart y Flutter MCP Server.
Corrigiendo un problema de layout, habilitado por el Dart y Flutter MCP Server ( partes de esta grabación han sido aceleradas)

Dart CLI más rápido

#

Anteriormente, cuando ejecutabas algunos comandos del CLI de Dart como dart analyze ****y dart fix, tu computadora tenía que compilar el código del analysis server justo antes de ejecutarlo. Ahora, estas herramientas usan un snapshot AOT (Ahead-Of-Time) compilado del analysis server, lo que significa que el server ha sido pre-compilado a código nativo rápido.

Los resultados varían dependiendo del código fuente, pero ejecutamos algunos comandos comunes en un paquete de ejemplo y obtuvimos resultados interesantes. Algunos comandos cortos como dart format ahora se completan en una fracción del tiempo y los de ejecución más larga como dart analyze fueron casi un 50% más rápidos.

Gráfico mostrando mejoras de rendimiento para comandos del CLI de Dart, como format y analyze más rápidos.
Resultados de rendimiento de ejemplo después de la actualización del CLI de Dart

actualizaciones del cliente pub

#

Las Git dependencies ahora pueden resolver versiones basándose en git tags.

Cuando usas un tag_pattern en el descriptor y hay una restricción de version, todos los commits que coinciden con el patrón se consideran durante la resolución. En el siguiente ejemplo, solo la versión 2.0.1 de my_dependency y superior se considera:

yaml
dependencies:
  my_dependency:
    git:
      url: https://github.com/example/my_dependency
      tag_pattern: v
    version: ^2.0.1

A partir de la versión del lenguaje 3.9, la restricción upper bound de flutter ahora se respeta en tu paquete raíz (la restricción de dart ya se respetaba). Establecer una restricción estrecha de dart o flutter puede ser útil para asegurar que un equipo de desarrolladores use todos la misma versión del SDK cuando desarrollan conjuntamente una app (consulta el issue #95472 para más detalles).

Por ejemplo, en un pubspec raíz como este, pub get fallará si se invoca con una versión del SDK de Flutter que no sea 3.33.0:

yaml
name: my_app
environment:
  sdk: ^3.9.0
  flutter: 3.33.0

Compilador nativo de Dart

#

Añadimos soporte de cross-compilation para arquitecturas objetivo de arm (ARM32) y riscv64 (RV64GC) cuando el OS objetivo es Linux.

Deprecaciones y breaking changes

#

Arquitectura x86 de 32 bits

#

Dart ha deprecado la arquitectura x86 de 32 bits. Para la mayoría de los desarrolladores esto no tendrá impacto, ya que principalmente afecta a los emuladores antiguos de Android basados en x86 y a un pequeño número de dispositivos físicos. Los emuladores y dispositivos ARM de 32 bits y x86_64 de 64 bits siguen siendo soportados. El desglose técnico completo está disponible en el issue de deprecación de Dart en GitHub.

dart build

#

dart build está en preview en el canal beta.

dart build -f exe <target> ahora es dart build cli — target=<target>. Consulta dart build cli — help para más información.

Conclusión

#

¡Eso es todo para Dart 3.9! Esperamos que estés tan emocionado con estas actualizaciones como nosotros. Siempre apreciamos tu feedback, así que siéntete libre de compartir tus opiniones. ¡Hasta la próxima, feliz codificación!

Más de Dart