- Toolkit de GUI reativo, simples e multiplataforma
- Simplicidade: pode ser adicionado facilmente ao projeto e permite construir a UI imediatamente. Não exige ferramentas extras nem etapa de geração de código. Ao escrever código Go, é possível gerar aplicações GUI nativas como binários autocontidos
- Multiplataforma: usa widgets nativos sempre que possível e, na compilação, seleciona automaticamente o backend mais adequado para a plataforma em execução. Atualmente, há duas implementações de backend disponíveis: uma baseada em FLTK e outra em Cocoa
- Reativo: atualiza automaticamente a UI quando o estado da aplicação muda. Fornece funções de renderização sem efeitos colaterais e usa o hook
UseState para gerenciar o estado da aplicação
- Amplo suporte a widgets: o Spot oferece nativamente vários controles de UI, como botões, rótulos, entrada de texto, sliders e menus suspensos
Perguntas frequentes (FAQs)
O que significa "reativo"?
- No Spot, reativo significa que a UI é atualizada automaticamente quando o estado da aplicação muda. Isso é feito reconstruindo a árvore imutável de componentes após a mudança de estado e comparando-a com o estado anterior para determinar quais controles de UI precisam ser atualizados.
O que são os "widgets nativos" usados pelo Spot?
- Atualmente, o Spot usa o backend Cocoa no macOS e um backend baseado em FLTK em todas as outras plataformas. Opcionalmente, também é possível usar FLTK no Mac. Há planos para um suporte melhor ao Windows no futuro.
Posso implementar meus próprios hooks?
- Sim, assim como no React, você pode implementar seus próprios hooks. Basta criar uma função que receba
*spot.RenderContext como primeiro argumento e, por meio dela, se conectar ao ciclo de vida do Spot.
Como escrever componentes personalizados?
- Há algumas formas de separar a UI em componentes no Spot. O método principal é criar uma struct que implemente a interface
spot.Component. Essa interface possui um único método: Render(ctx *spot.RenderContext) spot.Component.
Posso usar uma biblioteca de widgets diferente da fornecida?
- Sim. Basta criar uma struct que implemente a interface
spot.Component e gerencie widgets nativos.
Posso usar backends além de Cocoa ou FLTK?
- No momento, apenas esses dois backends são suportados. Se quiser adicionar outro backend, você pode enviar um PR.
Qual é a diferença entre spot/ui e spot?
spot é o pacote principal que fornece o modelo reativo e os recursos de renderização. Ele é independente de backend e pode ser usado com qualquer conjunto de controles que implemente a interface spot.Control.
spot/ui fornece um conjunto pré-construído de controles GUI multiplataforma para uso com spot.
Qual é a diferença entre "componente" e "controle"?
- No Spot, um componente é uma unidade lógica da aplicação que inclui lógica de negócio e estado. Todos os componentes são compostos por outros componentes e, no fim, são renderizados em um ou mais "controles".
- Um controle é um tipo especial de componente que é montado na árvore de UI e representa um elemento visual na tela.
O que significam os termos "make", "render", "build", "mount" e "update" no Spot?
- Make: processo de criar uma nova instância de componente. Isso é feito referenciando uma instância de uma struct que implementa a interface
spot.Component ou chamando spot.Make com uma função de renderização.
- Render: processo de aplicar o estado do componente aos blocos de construção para retornar outra instância de componente. Isso é feito chamando o método
Render em uma instância de componente.
- Build: processo de gerar uma nova árvore de UI a partir de uma instância de componente. Faz isso renderizando componentes recursivamente para criar a árvore de controles.
- Mount: processo de criar controles de UI reais a partir da árvore de controles (virtual). Isso é feito chamando
Mount em um nó da árvore ou chamando spot.Mount com uma instância de componente ou função de renderização.
- Update: processo de atualizar a árvore de controles (montada). Isso é feito chamando
Update em um nó da árvore.
Recursos que o Spot ainda não suporta
- layout automático
- múltiplas janelas
- caixas de diálogo modais
- janelas redimensionáveis
- barra de menus
- widgets personalizados
- acesso a widgets nativos
- arrastar e soltar
- internacionalização
Lista de controles de UI suportados
- Button: botão simples para iniciar uma ação (Fl_Button, NSButton)
- Checkbox: controle para selecionar uma de duas opções mutuamente exclusivas (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
- ComboBox: menu suspenso com entrada de texto (ComboBox, NSComboBox)
- Dial: controle circular de estado (Fl_Dial, NSProgressIndicator (with
NSCircular style))
- Dropdown: menu suspenso para selecionar uma entre várias opções (Fl_Choice, NSComboBox)
- Image: controle de imagem (Image, NSImageView)
- Label: rótulo de texto simples, não editável (Fl_Box, NSTextField)
- ListBox: controle com rolagem que permite selecionar um ou vários itens de uma lista fornecida (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
- ProgressBar: barra de progresso para visualizar o andamento de tarefas longas (Fl_Progress, NSProgressIndicator)
- Slider: controle de entrada com slider horizontal (Fl_Slider, NSSlider)
- Spinner: controle de entrada numérica com botões para cima/baixo (Fl_Spinner, NSTextField+NSStepper)
- TextField: controle de entrada de texto em uma única linha (Fl_Input, NSTextField)
- TextView/TextEditor: caixa de texto genérica para visualizar/editar conteúdo de texto em múltiplas linhas (Text, NSTextView)
- Window: controle que representa uma janela (de nível superior) na tela (Fl_Window, NSWindow)
Opinião do GN⁺
- O Spot facilita o desenvolvimento de aplicações GUI multiplataforma em Go. Em especial, ao adotar um modelo reativo, permite que desenvolvedores foquem na lógica da aplicação sem se preocupar com atualizações da UI.
- Ainda há muitos recursos sem suporte, o que pode impor limitações no desenvolvimento de aplicações mais complexas. Em especial, se forem necessários recursos como layout automático ou múltiplas janelas, pode ser melhor considerar outro toolkit.
- A simplicidade do Spot e seu suporte multiplataforma podem ser muito úteis para projetos pequenos ou para desenvolvimento de protótipos. Porém, em aplicações de grande porte, suas limitações funcionais podem pesar.
- Se a comunidade e a documentação do Spot evoluírem mais, será mais fácil para mais desenvolvedores adotá-lo e usá-lo. Em especial, seria bom ter mais exemplos sobre como criar hooks e componentes personalizados.
- A possibilidade de expandir os backends do Spot é interessante. Em especial, se houver suporte melhor ao Windows, mais desenvolvedores poderão adotá-lo.
1 comentários
Opiniões do Hacker News
Resumo da coletânea de comentários do Hacker News