4 pontos por GN⁺ 2024-05-26 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2024-05-26

Opiniões do Hacker News

Resumo da coletânea de comentários do Hacker News

  • Seria bom indicar as plataformas suportadas no README. A sugestão é documentar isso no estilo da documentação do Flutter.
  • Quero criar ferramentas internas de desenvolvimento usando Go, atualmente estou usando Wails e estou satisfeito. Este projeto também parece interessante e vale a pena dar uma olhada.
  • Acho que Go pode oferecer uma boa experiência para desenvolvimento de UI cross-platform.
    • Gerenciar a complexidade de build é uma das grandes dificuldades do desenvolvimento cross-platform, e o Go praticamente elimina isso.
    • Fico curioso sobre como resolver layouts cross-platform quando o tamanho dos controles nativos varia entre plataformas.
  • Fico curioso sobre qual é a vantagem da abordagem de árvore virtual de controles.
    • Quero entender quais benefícios isso traz em comparação com atualizar diretamente os controles exibidos ao usuário.
  • Eu estava procurando algo assim há alguns anos.
    • Eu precisava de suporte a Windows, então migrei para C++ e usei wxWidgets.
  • O esforço é louvável, mas uma solução cross-platform sem suporte a Windows é uma pena.
  • Gostaria de ter conhecido este projeto 3 semanas atrás.
    • Acho que um framework React ou React-like portado para Go ofereceria uma excelente experiência de desenvolvimento.
  • O Fltk oferece suporte a Windows.
    • Fico curioso se o Windows ainda não é suportado porque estão usando outra solução.
  • Fico curioso se este código implica que o GOMAXPROCS precisa ser definido com no mínimo 2.
  • Fico curioso sobre como os builds cross-platform são feitos.
    • Seria ótimo ter um comando que gerasse um .app para macOS e um .exe para Windows sem precisar resolver gerenciamento de pacotes, containers e questões de assinatura de cada plataforma.