La empresa Google ha publicado la versión del lenguaje de programación Dart 2.14, que continúa el desarrollo de la rama reestructurada de Dart 2, que se diferencia de la versión original del lenguaje Dart por el uso de una tipificación estática fuerte (los tipos pueden inferirse automáticamente, por lo que la especificación de tipos no es obligatoria, pero la tipificación dinámica ya no se usa y el tipo inferido se asigna a la variable, aplicándose luego una verificación de tipo estricta).
Características del lenguaje Dart:
- Sintaxis familiar y sencilla de aprender, natural para programadores que vienen de JavaScript, C y Java.
- Ofrecimiento de un rápido inicio y alto rendimiento para todos los navegadores web modernos y diferentes tipos de entornos, desde dispositivos portátiles hasta potentes servidores.
- Capacidad para definir clases e interfaces, permitiendo el uso de encapsulamiento y la reutilización de métodos y datos existentes.
- La especificación de tipos facilita la depuración y la identificación de errores, hace que el código sea más claro y legible, y simplifica su modificación y análisis por parte de otros desarrolladores.
- Entre los tipos soportados se encuentran: varios tipos de hashes, arrays y listas, colas, tipos numéricos y de cadenas, tipos para definir fechas y horas, expresiones regulares (RegExp). También es posible crear tipos propios.
- Para organizar la ejecución paralela, se sugiere usar clases con el atributo isolate, cuyo código se ejecuta completamente en un espacio aislado en un área de memoria separada, interactuando con el proceso principal mediante el envío de mensajes.
- Soporte para el uso de bibliotecas que facilitan el mantenimiento y depuración de grandes proyectos web. Implementaciones de funciones de terceros pueden conectarse como bibliotecas compartidas. Las aplicaciones pueden dividirse en partes y delegar el desarrollo de cada parte a un equipo de programadores diferente.
- Conjunto de herramientas listas para apoyar el desarrollo en el lenguaje Dart, incluyendo la implementación de herramientas de desarrollo dinámico y depuración con corrección de código en tiempo real ("edit-and-continue").
- Para simplificar el desarrollo en el lenguaje Dart, se proporciona un SDK, un gestor de paquetes pub, un analizador de código estático dart_analyzer, un conjunto de bibliotecas, un entorno de desarrollo integrado DartPad y complementos con soporte para Dart en IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 y Vim.
- Paquetes adicionales con bibliotecas y utilidades se distribuyen a través del repositorio pub, que cuenta con más de 20,000 paquetes.
Principales cambios en la versión Dart 2.14:
- Se ha añadido un nuevo operador de desplazamiento triple (>>>), que a diferencia del operador «>>» realiza un desplazamiento lógico, sin tener en cuenta el bit de signo (el desplazamiento se realiza sin distinguir entre números positivos y negativos).
- Se ha eliminado la restricción sobre los argumentos de tipo, que no permitía usar tipos genéricos de funciones como argumento de tipo. Por ejemplo, ahora se puede especificar: late List<T Function<T>(T)> idFunctions; var callback = [<T>(T value) => value]; late S Function<S extends T Function<T>(T)>(S) f;
- Se permite especificar argumentos con tipos en anotaciones, como @Deprecated. Por ejemplo, ahora se puede indicar: @TypeHelper<int>(42, «El significado»)
- En la biblioteca estándar (core), se han añadido métodos estáticos hash, hashAll y hashAllUnordered a la clase Object. En la clase DateTime, se ha mejorado el manejo del tiempo local al convertir horas entre horario de verano y horario estándar, que no es múltiplo de una hora (por ejemplo, en Australia se utiliza un desplazamiento de 30 minutos). En el paquete ffi se ha añadido soporte para el mecanismo de asignación de memoria arena, que libera recursos automáticamente. En el paquete ffigen se ha añadido la posibilidad de generar definiciones typedef de tipos Dart desde el lenguaje C.
- Los 250 paquetes más populares del repositorio pub.dev y el 94% de los top-1000 han sido adaptados para utilizar el modo de seguridad con valores "Null" (null safety), que permite evitar fallos causados por intentos de uso de variables cuyas valores no están definidos y son asignados a "Null". En este modo, se establece que las variables no pueden tener valores indefinidos, a menos que se les asigne explícitamente un valor nulo. Este modo toma en cuenta estrictamente los tipos de las variables, lo que permite al compilador aplicar optimizaciones adicionales. La correspondencia de tipos se verifica en el momento de la compilación; por ejemplo, si se intenta asignar el valor "Null" a una variable con un tipo que no permite un estado indefinido, como "int", se generará un error.
- Se han propuesto conjuntos de reglas unificadas para el analizador de código (linter), que ofrecen soporte simultáneo para la verificación del cumplimiento de las recomendaciones de estilo para Dart y el marco Flutter. Por razones históricas, las reglas de formato de código para Flutter y Dart eran diferentes; además, para Dart había dos conjuntos de reglas en uso: las estrictas de Google y las del comunidad de desarrolladores de Dart. En Dart 2.14 se presenta un nuevo conjunto común de reglas para linter, que se ha decidido aplicar por defecto en nuevos proyectos de Dart y en el SDK de Flutter. Este conjunto incluye reglas básicas (paquete lints/core.yaml), reglas adicionales recomendadas (lints/recommended.yaml) y recomendaciones específicas para Flutter (flutter_lints/flutter.yaml). Se recomienda a los usuarios de las reglas estrictas que pasen a utilizar el nuevo estilo de codificación basado en las recomendaciones de la documentación de Dart.
- Se han realizado optimizaciones en el formatter para el formateo de bloques de código encadenados, lo que permite aumentar significativamente el rendimiento del formateo y evitar interpretaciones ambiguas sobre la pertenencia de los elementos de la expresión. Por ejemplo, la llamada «..doIt» en la expresión «var result = errorState ? foo : bad..doIt()» se refiere no solo a la parte condicional del bloque «bad» sino a toda la expresión, por lo que al formatear ahora se separa: var result = errorState ? foo : bad ..doIt();
- El SDK ha añadido soporte para los procesadores Apple M1 (Silicon), que implica tanto la posibilidad de ejecutar Dart VM, utilidades y componentes del SDK en sistemas con procesadores Apple Silicon, como también el soporte para la compilación de archivos ejecutables para estos chips.
- El comando «dart pub» ha añadido soporte para un nuevo archivo de servicio «.pubignore», que permite definir una lista de archivos que se omitirán al publicar un paquete en el repositorio pub.dev. La configuración especificada no entra en conflicto con la lista de ignorados «.gitignore» (en algunas situaciones, pub.dev requiere que no se envíen archivos necesarios en Git, como scripts internos utilizados durante el desarrollo).
- Se ha trabajado en mejorar el rendimiento del comando «dart test», que ahora no requiere recompilación de las pruebas después de modificar pubspec, siempre que el número de versión no haya cambiado.
- Se ha dejado de soportar la compilación en modo compatible con ECMAScript 5 (este cambio resultará en la pérdida de compatibilidad con el navegador IE11).
- Se han declarado obsoletas algunas utilidades como stagehand, dartfmt y dart2native, que han sido reemplazadas por comandos integrados que se invocan a través de la utilidad dart.
- Se han clasificado como obsoletas las extensiones nativas de VM. Para llamar a código nativo desde código Dart, se recomienda utilizar la nueva interfaz Dart FFI (Interfaz de Funciones Externas).
Se ha presentado simultáneamente una importante versión del marco de interfaz de usuario Flutter 2.5, que se considera una alternativa a React Native y permite lanzar aplicaciones para plataformas iOS, Android, Windows, macOS y Linux a partir de una sola base de código, así como crear aplicaciones para ser ejecutadas en navegadores. Flutter ha sido utilizada para construir la interfaz de usuario del sistema operativo microkernel Fuchsia en desarrollo por Google.
La mayor parte del código de Flutter está implementada en el lenguaje Dart, mientras que el motor de ejecución para aplicaciones está escrito en C++. Al desarrollar aplicaciones, además del propio lenguaje Dart nativo de Flutter, se puede utilizar la interfaz Dart Foreign Function para llamar código en C/C++. La alta performance de ejecución se logra gracias a la compilación de aplicaciones en código máquina para las plataformas de destino. No es necesario recompilar el programa después de cada cambio: Dart ofrece un modo de recarga en caliente que permite realizar cambios en la aplicación en funcionamiento y evaluar los resultados de inmediato.
Los cambios clave en Flutter 2.5:
- Se han implementado optimizaciones de rendimiento significativas. En las plataformas iOS y macOS, se ha realizado la precompilación de sombreadores para la API gráfica Metal. Se ha mejorado la eficiencia en el manejo de eventos asincrónicos. Se ha resuelto un problema relacionado con las demoras durante la liberación de memoria por el recolector de basura de imágenes no utilizadas (por ejemplo, durante la reproducción de un GIF animado de 20 segundos, el número de operaciones del recolector de basura se redujo de 400 a 4). Las demoras en la comunicación entre Dart y Objective-C/Swift (iOS) o Java/Kotlin (Android) se han reducido hasta en un 50%. Se ha añadido soporte para la compilación nativa en sistemas basados en el chip Apple Silicon.

- Se ha establecido soporte para aplicaciones en modo de pantalla completa en la plataforma Android. Se ha continuado con la implementación del concepto de diseño 'Material You', presentado como una variante del Material Design de próxima generación. Se ha añadido un nuevo estado MaterialState.scrolledUnder, se ha implementado la visualización dinámica de las barras de desplazamiento al cambiar de tamaño y se ha propuesto una nueva interfaz para mostrar banners de notificaciones.
- Se han ampliado significativamente las capacidades del plugin para trabajar con cámaras, que ahora incluye herramientas para controlar el enfoque automático, la exposición, el flash, el zoom, la reducción de ruido y la resolución.
- Se han mejorado las herramientas para desarrolladores (DevTools), que ahora cuentan con un modo de inspección de widgets actualizado, así como herramientas para detectar retrasos en el renderizado y rastrear la compilación de shaders.

- Se han mejorado los plugins para Visual Studio Code e IntelliJ/Android Studio.
Fuente: opennet.ru


