Flutter y apps para computadoras

Progreso continuo hacia una visión de computación ambiental

Somos bastante abiertos acerca de nuestra misión para hacer que Flutter apunte a una amplia variedad de dispositivos (lo que incluye iOS, Android, Windows, Linux, macOS y la Web) desde una única base de código, con compilación nativa y visuales de calidad de juego. En Google, se usa Flutter en proyectos que van desde el Asistente y Stadia hasta Cloud Search y Blogger. Y, fuera de Google, lo han adoptado diferentes empresas, como ByteDance, Grab, Nubank y MGM Resorts, que se benefician de la productividad y flexibilidad de Flutter.
Muchos de ustedes están interesados en el progreso de los sistemas operativos para computadoras de escritorio, como Windows, macOS y Linux: en las encuestas y en GitHub, las computadoras de escritorio son repetidamente una de las funciones nuevas más populares. Mostraremos más de nuestro trabajo aquí en las próximas semanas y pensamos que deberíamos empezar por estudiar algunos de los trabajos de varios conjuntos de funciones que contribuyen al proyecto general. Si bien la compatibilidad con computadoras de escritorio es actualmente un avance técnico, ha habido mucho trabajo en marcha.



Modo de lanzamiento

Recientemente, implementamos el modo de lanzamiento para Windows y Linux, además de la compatibilidad existente para macOS. Por ejemplo, si estás ejecutando las versiones más recientes de Flutter, ahora puedes compilar una aplicación de Flutter en un archivo ejecutable de Windows con flutter build windows. Esto utiliza nuestro compilador AOT de producción para crear código de máquina nativo x64 que se puede distribuir a una máquina que no tenga Flutter instalado.

Experiencias de clase para computadoras de escritorio

Ya sea que estés compilando archivos ejecutables independientes o aplicaciones web, hay atributos únicos a fin de compilar experiencias de clase para computadoras de escritorio. Las ventanas de las computadoras de escritorio suelen estar en modo de paisaje y son redimensionables; la entrada, en lugar de provenir de un toque o un teclado en pantalla, suele provenir de un teclado y un mouse físicos; y los controles están optimizados para una densidad de pantalla diferente.
A nivel del marco de trabajo, hemos hecho varios cambios en Flutter a fin de admitir las experiencias de clases para computadoras de escritorio.
  • Cuando crees un nuevo proyecto en compilaciones recientes, verás que la plantilla predeterminada ahora incluye una referencia a una propiedad visualDensity, que habilita controles para adaptar su densidad en función de la plataforma a la que se dirige, con un espacio más compacto en las plataformas de computadoras de escritorio. Un ejemplo de cómo se utiliza esto es TextField, que ahora ofrece espacio compacto, cómodo y estándar según la densidad especificada.
  • Hemos agregado compatibilidad mejorada para la entrada de datos con el mouse y el teclado; esto incluye códigos de tecla sin procesar en Windows, el botón derecho del mouse, cambios de cursores y compatibilidad con la rueda de desplazamiento.
  • Ahora puedes consultar la plataforma específica (mediante la clase Platform), y Windows, macOS y Linux proporcionan los resultados adecuados.
  • En el lanzamiento más reciente, hemos agregado un widget de NavigationRail que está específicamente diseñado para experiencias de clase en computadoras de escritorio y tablets.

FFI

El equipo del Dart ha estado trabajando duro para pulir Foreign Function Interface (FFI), que es un gran potenciador de velocidad para la integración de la plataforma. En el caso de las API basadas en C, la biblioteca dart:ffi proporciona un mecanismo directo para vincularse al código nativo; el tiempo de ejecución de Dart proporciona la capacidad de asignar memoria en el montón que está respaldado por un objeto Dart y hacer llamadas a bibliotecas vinculadas dinámicamente.
Para un simple ejemplo de Windows, aquí hay un fragmento de código para llamar a la tradicional API de Win32 MessageBox() enteramente con código de Dart:

En este código, proporcionamos typedefs que representan la firma del método, tanto en sus representaciones nativas como en las basadas en Dart. Con esos elementos definidos, podemos cargar la biblioteca de vínculo dinámico (DLL) de Windows, que proporciona la implementación de la función mediante el método lookupFunction(), que mapea la firma de la función de Dart en el punto de entrada nativo subyacente. Por último, agregamos un simple wrapper idiomático para que sea fácilmente accesible desde otro código de Dart, lo cual genera algo como esto:


Una simple app de ejemplo de Windows que usa la API de MessageBox de Win32

Por supuesto, no tienes que hacer este trabajo tú mismo; lo más probable es que alguien ya haya sentado las bases para la API que quieres usar. Puedes leer más en nuestros documentos sobre cómo usar FFI desde Flutter.

Actualización del modelo del complemento

Por diseño, Flutter tiene un pequeño núcleo. En lugar de agregar peso al marco de trabajo base, los complementos y paquetes (ya sea directamente del equipo de Flutter o del ecosistema de colaboradores más amplio) proporcionan integración con los sistemas operativos subyacentes.
Sin embargo, con Flutter admitiendo cada vez más experiencias para dispositivos móviles, la Web y computadoras de escritorio, el desarrollo de un complemento para cada plataforma compatible se hace cada vez más difícil. Es más probable que un complemento requiera contribuciones de diferentes autores que tengan experiencia en cada plataforma.
Una técnica útil es definir una interfaz común como parte del complemento del núcleo que cada plataforma puede implementar de manera independiente. De esa forma, como se describe en una publicación reciente sobre el desarrollo de complementos modernos, hemos adaptado un esquema de complementos para permitir que el desarrollo de la plataforma se pueda unificar más fácilmente entre varios autores. Como parte de este trabajo, ahora es posible declarar explícitamente qué plataformas son compatibles con un complemento.
Hemos empezado a compilar algunos de los complementos principales usando este modelo, y encontrarás algunos prototipos del modelo unificado en el repositorio flutter/plugins.
Ten en cuenta que las API de los complementos de Windows y Linux aún están en proceso de cambios, así que, si bien te recomendamos que los explores, no estamos preparados en este momento para brindar compatibilidad de producción de uso general. También estamos trabajando a fin de agregar etiquetas de plataforma para computadoras de escritorio en pub.dev.

Ejecución en Windows: Win32 y UWP

Un aspecto interesante del trabajo que hemos realizado en Windows es experimentar con varios enfoques de arquitectura. En cualquier plataforma, Flutter está incorporado en una pequeña aplicación de contenedor de host (un "incorporador"), que usa un enfoque similar a los motores de juego como Unity. Este incorporador específico de la plataforma proporciona un punto de entrada; coordina con el sistema operativo subyacente para el acceso a servicios como las superficies de prestación, la accesibilidad y la entrada; y administra el bucle de eventos de mensajes.



Windows ofrece dos enfoques distintos para crear este incorporador. En primer lugar, el modelo de programación maduro de Win32 puede utilizarse a fin de crear el punto de entrada para el contenido de Flutter, lo que ofrece la máxima compatibilidad con plataformas como Windows 7 y compila un archivo EXE estándar que muchos desarrolladores prefieren usar. Por el contrario, el modelo de app UWP moderno es el enfoque recomendado para Windows 10 y ofrece oportunidades interesantes para ampliar la compatibilidad de Flutter a dispositivos como Xbox o el próximo sistema operativo Windows 10X.
Hemos estado trabajando de manera informal con varios colaboradores para explorar diferentes soluciones y nos encantaría trabajar de forma estrecha con Microsoft para generar una solución de alta calidad. Con la familia de dispositivos Surface extendida para incluir Android y Windows, creemos que Flutter ofrece a Microsoft una plataforma convincente en la que puede compilar experiencias nativas increíbles que abarcan toda su gama de productos.

Diversión con experiencias de escritorio

Este trabajo sigue en vista previa técnica, y las API y herramientas aún no son estables. Todavía hay mucho trabajo que queremos completar antes de promocionar la compatibilidad con computadoras de escritorio a una versión estable, por ejemplo, la mejora de accesibilidad y la compatibilidad con localización.
Si quieres probar esto, tendrás que estar en un canal de desarrollo. Windows y Linux solo están disponibles en la rama principal, que es donde tiene lugar el desarrollo activo de Flutter; macOS está disponible en la rama de desarrollo, que es ligeramente más estable, pero no se recomienda para su uso en producción. Puedes cambiar de canal con flutter channel master o flutter channel dev, y luego usar uno de estos comandos para admitir la plataforma que estés usando:
C:\flutter> flutter config --enable-windows-desktop
$ flutter config --enable-macos-desktop
$ flutter config --enable-linux-desktop
Ya estamos viendo cómo algunos desarrolladores aventureros empiezan a aprovechar Flutter en computadoras de escritorio para crear apps. Una de las primeras aplicaciones de escritorio para macOS en Flutter que vimos es Sharezone, un organizador estudiantil dirigido al mercado educativo alemán, que comenzó como una aplicación para dispositivos móviles, pero que recientemente agregó versiones web y para computadoras de escritorio.


Sharezone Schulplan, una aplicación para que estudiantes, educadores y padres puedan hacer un seguimiento de tareas, grupos de estudio y horarios.

Compartiremos más sobre la compatibilidad con computadoras de escritorio en las próximas semanas. Mientras tanto, nos encantaría escuchar tus experiencias. Si escribes complementos, nos gustaría que empieces a evaluar el trabajo que te tomaría admitir estas próximas plataformas de escritorio. Si ya publicaste una app, ¿por qué no intentas ejecutarla como una aplicación para computadoras de escritorio y nos cuentas cómo te va?