- Toolkit de GUI reactiva, simple y multiplataforma
- Simplicidad: se puede agregar fácilmente a un proyecto y empezar a construir una UI de inmediato. No se necesitan herramientas adicionales ni pasos de generación de código. Escribes código Go y puedes crear aplicaciones GUI nativas como binarios autocontenidos
- Multiplataforma: usa widgets nativos cuando es posible y, al compilar, elige automáticamente el backend más adecuado para la plataforma en uso. Actualmente se ofrecen dos implementaciones de backend: una basada en FLTK y otra basada en Cocoa
- Reactivo: actualiza automáticamente la UI cuando cambia el estado de la aplicación. Proporciona funciones de renderizado sin efectos secundarios y usa el hook
UseState para gestionar el estado de la aplicación
- Amplio soporte de widgets: Spot ofrece de forma predeterminada varios controles de UI, como botones, etiquetas, entradas de texto, sliders y menús desplegables
Preguntas frecuentes (FAQs)
¿Qué significa "reactivo"?
- En Spot, reactivo significa que la UI se actualiza automáticamente cuando cambia el estado de la aplicación. Esto se logra reconstruyendo el árbol inmutable de componentes cuando cambia el estado y comparándolo con el estado anterior para determinar qué controles de UI deben actualizarse.
¿Qué son los "widgets nativos" que usa Spot?
- Actualmente, Spot usa el backend Cocoa en macOS y un backend basado en FLTK en todas las demás plataformas. Opcionalmente, también se puede usar FLTK en Mac. Hay planes de mejorar el soporte para Windows en el futuro.
¿Puedo implementar mis propios hooks?
- Sí, al igual que en React, puedes implementar tus propios hooks. Solo necesitas crear una función que reciba
*spot.RenderContext como primer argumento y, a través de ella, engancharte al ciclo de vida de Spot.
¿Cómo se escriben componentes personalizados?
- En Spot hay varias formas de separar la UI en componentes. El método principal es crear una estructura que implemente la interfaz
spot.Component. Esta interfaz tiene un único método: Render(ctx *spot.RenderContext) spot.Component.
¿Puedo usar una biblioteca de widgets distinta a la provista?
- Sí, es posible. Solo necesitas crear una estructura que implemente la interfaz
spot.Component y gestione widgets nativos.
¿Puedo usar backends distintos de Cocoa o FLTK?
- Por ahora, solo se admiten esos dos backends. Si quieres agregar otro backend, puedes enviar un PR.
¿Cuál es la diferencia entre spot/ui y spot?
spot es el paquete principal que proporciona el modelo reactivo y la funcionalidad de renderizado. Es independiente del backend y puede usarse con cualquier conjunto de controles que implemente la interfaz spot.Control.
spot/ui ofrece un conjunto de controles GUI multiplataforma ya preparados para usarse junto con spot.
¿Cuál es la diferencia entre "component" y "control"?
- En Spot, un component es una unidad lógica de la aplicación que incluye lógica de negocio y estado. Todos los componentes están compuestos por otros componentes y, en última instancia, se renderizan como uno o más "controles".
- Un control es un tipo especial de componente que se monta en el árbol de UI y representa elementos visuales en pantalla.
¿Qué significan en Spot los términos "make", "render", "build", "mount" y "update"?
- Make: el proceso de crear una nueva instancia de componente. Se realiza haciendo referencia a una instancia de una estructura que implemente la interfaz
spot.Component o llamando a spot.Make desde una función de renderizado.
- Render: el proceso de aplicar el estado del componente a los bloques de construcción y devolver otra instancia de componente. Se realiza llamando al método
Render en una instancia de componente.
- Build: el proceso de crear un nuevo árbol de UI a partir de una instancia de componente. Genera un árbol de controles renderizando componentes de forma recursiva.
- Mount: el proceso de crear controles reales de UI a partir de un árbol de controles (virtual). Se realiza llamando a
Mount en un nodo del árbol o llamando a spot.Mount desde una instancia de componente o función de renderizado.
- Update: el proceso de actualizar un árbol de controles ya montado. Se realiza llamando a
Update en un nodo del árbol.
Funciones que Spot no soporta actualmente
- Layout automático
- Múltiples ventanas
- Cuadros de diálogo modales
- Ventanas redimensionables
- Barra de menú
- Widgets personalizados
- Acceso a widgets nativos
- Arrastrar y soltar
- Internacionalización
Lista de controles de UI compatibles
- Button: botón simple para iniciar una acción (Fl_Button, NSButton)
- Checkbox: control para seleccionar una de dos opciones mutuamente excluyentes (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
- ComboBox: menú desplegable con entrada de texto (ComboBox, NSComboBox)
- Dial: control circular de estado (Fl_Dial, NSProgressIndicator (with
NSCircular style))
- Dropdown: menú desplegable para seleccionar una opción entre varias (Fl_Choice, NSComboBox)
- Image: control de imagen (Image, NSImageView)
- Label: etiqueta de texto simple no editable (Fl_Box, NSTextField)
- ListBox: control desplazable que permite seleccionar uno o varios elementos de una lista dada (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
- ProgressBar: barra de progreso para visualizar el avance de tareas de larga duración (Fl_Progress, NSProgressIndicator)
- Slider: control de entrada con slider horizontal (Fl_Slider, NSSlider)
- Spinner: control de entrada numérica con botones arriba/abajo (Fl_Spinner, NSTextField+NSStepper)
- TextField: control de entrada de texto de una sola línea (Fl_Input, NSTextField)
- TextView/TextEditor: cuadro de texto de propósito general para ver/editar contenido de texto de múltiples líneas (Text, NSTextView)
- Window: control que representa una ventana (de nivel superior) en pantalla (Fl_Window, NSWindow)
Opinión de GN⁺
- Spot facilita el desarrollo de aplicaciones GUI multiplataforma en Go. En particular, introduce un modelo reactivo que permite a los desarrolladores enfocarse en la lógica de la aplicación sin preocuparse por las actualizaciones de la UI.
- Como actualmente no soporta muchas funciones, puede haber limitaciones al desarrollar aplicaciones complejas. En especial, si necesitas funciones como layout automático o múltiples ventanas, conviene considerar otro toolkit.
- La simplicidad de Spot y su soporte multiplataforma pueden ser muy útiles para proyectos pequeños o para desarrollar prototipos. Sin embargo, en aplicaciones grandes puede haber límites funcionales.
- Si la comunidad y la documentación de Spot siguen madurando, más desarrolladores podrán adoptarlo y usarlo con facilidad. Sería especialmente útil contar con más ejemplos sobre cómo escribir hooks y componentes personalizados.
- La posibilidad de ampliar los backends de Spot es interesante. En particular, si se agrega un mejor soporte para Windows, más desarrolladores podrán usarlo.
1 comentarios
Opiniones de Hacker News
Resumen de comentarios de Hacker News
.appde macOS y un.exede Windows sin tener que resolver la gestión de paquetes de cada plataforma, los contenedores y los problemas de firma.