- Ein einfaches plattformübergreifendes reaktives GUI-Toolkit
- Einfachheit: Lässt sich unkompliziert zu einem Projekt hinzufügen, um sofort eine UI zu erstellen. Es sind keine zusätzlichen Tools oder Codegenerierungsschritte erforderlich. Durch das Schreiben von Go-Code können native GUI-Anwendungen als eigenständige Binärdateien erzeugt werden.
- Plattformübergreifend: Verwendet nach Möglichkeit native Widgets und wählt beim Kompilieren automatisch das für die laufende Plattform am besten geeignete Backend aus. Aktuell werden zwei Backend-Implementierungen bereitgestellt: eine auf FLTK-Basis und eine auf Cocoa-Basis.
- Reaktiv: Aktualisiert die UI automatisch, wenn sich der Anwendungszustand ändert. Bietet nebenwirkungsfreie Rendering-Funktionen und verwendet den
UseState-Hook zur Verwaltung des Anwendungszustands.
- Umfangreiche Widget-Unterstützung: Spot bietet standardmäßig verschiedene UI-Controls wie Buttons, Labels, Texteingaben, Slider und Dropdowns.
Häufig gestellte Fragen (FAQs)
Was bedeutet „reaktiv“?
- In Spot bedeutet reaktiv, dass die UI automatisch aktualisiert wird, wenn sich der Anwendungszustand ändert. Das geschieht, indem bei einer Zustandsänderung der unveränderliche Komponentenbaum neu aufgebaut und mit dem vorherigen Zustand verglichen wird, um zu bestimmen, welche UI-Controls aktualisiert werden müssen.
Was sind die „nativen Widgets“, die Spot verwendet?
- Derzeit verwendet Spot unter macOS das Cocoa-Backend und auf allen anderen Plattformen ein FLTK-basiertes Backend. Optional kann auch auf dem Mac FLTK verwendet werden. Eine bessere Unterstützung für Windows ist für die Zukunft geplant.
Kann ich eigene Hooks implementieren?
- Ja, genau wie bei React können eigene Hooks implementiert werden. Dazu erstellt man eine Funktion, die
*spot.RenderContext als erstes Argument entgegennimmt und darüber in den Spot-Lifecycle „einhaken“ kann.
Wie schreibt man benutzerdefinierte Komponenten?
- In Spot gibt es mehrere Möglichkeiten, die UI in Komponenten aufzuteilen. Die wichtigste Methode ist das Erstellen einer Struktur, die das Interface
spot.Component implementiert. Dieses Interface besitzt genau eine Methode: Render(ctx *spot.RenderContext) spot.Component.
Kann ich eine andere Widget-Bibliothek als die mitgelieferte verwenden?
- Ja, das ist möglich. Man muss lediglich eine Struktur erstellen, die das Interface
spot.Component implementiert und native Widgets verwaltet.
Kann ich Backends außer Cocoa oder FLTK verwenden?
- Derzeit werden nur diese beiden Backends unterstützt. Wenn du ein anderes Backend hinzufügen möchtest, kannst du einen PR einreichen.
Was ist der Unterschied zwischen spot/ui und spot?
spot ist das Kernpaket, das das reaktive Modell und die Rendering-Funktionalität bereitstellt. Es ist backendunabhängig und kann mit jedem Control-Set verwendet werden, das das Interface spot.Control implementiert.
spot/ui stellt ein vorgefertigtes plattformübergreifendes Set von GUI-Controls bereit, das zusammen mit spot verwendet werden kann.
Was ist der Unterschied zwischen „Komponente“ und „Control“?
- In Spot ist eine Komponente eine logische Einheit der Anwendung, die Business-Logik und Zustand enthält. Alle Komponenten bestehen aus anderen Komponenten und werden letztlich in ein oder mehrere „Controls“ gerendert.
- Ein Control ist eine spezielle Art von Komponente, die im UI-Baum gemountet wird und ein visuelles Element auf dem Bildschirm darstellt.
Was bedeuten in Spot die Begriffe „make“, „render“, „build“, „mount“ und „update“?
- Make: Der Prozess zum Erzeugen einer neuen Komponenteninstanz. Dies geschieht durch Referenzieren einer Instanz einer Struktur, die das Interface
spot.Component implementiert, oder durch Aufruf von spot.Make mit einer Rendering-Funktion.
- Render: Der Prozess, bei dem der Zustand einer Komponente auf die Bausteine angewendet wird, um andere Komponenteninstanzen zurückzugeben. Dies geschieht durch Aufruf der Methode
Render auf einer Komponenteninstanz.
- Build: Der Prozess zum Erzeugen eines neuen UI-Baums aus einer Komponenteninstanz. Dabei wird die Komponente rekursiv gerendert, um einen Control-Baum zu erzeugen.
- Mount: Der Prozess zum Erzeugen realer UI-Controls aus dem (virtuellen) Control-Baum. Dies geschieht durch Aufruf von
Mount auf einem Baumknoten oder durch Aufruf von spot.Mount mit einer Komponenteninstanz oder einer Rendering-Funktion.
- Update: Der Prozess zum Aktualisieren des (gemounteten) Control-Baums. Dies geschieht durch Aufruf von
Update auf einem Baumknoten.
Funktionen, die Spot derzeit nicht unterstützt
- Automatisches Layout
- Mehrere Fenster
- Modale Dialoge
- Fenster mit Größenanpassung
- Menüleiste
- Benutzerdefinierte Widgets
- Zugriff auf native Widgets
- Drag-and-drop
- Internationalisierung
Liste der unterstützten UI-Controls
- Button: Einfacher Button zum Auslösen einer Aktion (Fl_Button, NSButton)
- Checkbox: Control zur Auswahl einer von zwei einander ausschließenden Optionen (Fl_Check_Button, NSButton (NSButtonTypeSwitch))
- ComboBox: Dropdown-Menü mit Texteingabe (ComboBox, NSComboBox)
- Dial: Kreisförmiges Status-Control (Fl_Dial, NSProgressIndicator (mit
NSCircular-Stil))
- Dropdown: Dropdown-Menü zur Auswahl einer von mehreren Optionen (Fl_Choice, NSComboBox)
- Image: Bild-Control (Image, NSImageView)
- Label: Einfaches, nicht bearbeitbares Text-Label (Fl_Box, NSTextField)
- ListBox: Scrollbares Control, in dem ein oder mehrere Einträge aus einer vorgegebenen Liste ausgewählt werden können (Fl_Select_Browser/Fl_Multi_Browser, NSTableView)
- ProgressBar: Fortschrittsbalken zur Visualisierung des Fortschritts lang laufender Aufgaben (Fl_Progress, NSProgressIndicator)
- Slider: Horizontales Slider-Eingabe-Control (Fl_Slider, NSSlider)
- Spinner: Numerisches Eingabe-Control mit Auf-/Ab-Buttons (Fl_Spinner, NSTextField+NSStepper)
- TextField: Einzeiliges Texteingabe-Control (Fl_Input, NSTextField)
- TextView/TextEditor: Allgemeines Textfeld zum Anzeigen/Bearbeiten mehrzeiliger Textinhalte (Text, NSTextView)
- Window: Control, das ein (oberstes) Fenster auf dem Bildschirm darstellt (Fl_Window, NSWindow)
Meinung von GN⁺
- Spot erleichtert die Entwicklung plattformübergreifender GUI-Anwendungen in der Go-Sprache. Insbesondere führt es ein reaktives Modell ein, sodass sich Entwickler auf die Anwendungslogik konzentrieren können, ohne sich um UI-Updates kümmern zu müssen.
- Da derzeit viele Funktionen nicht unterstützt werden, kann es bei der Entwicklung komplexer Anwendungen Einschränkungen geben. Wenn insbesondere Funktionen wie automatisches Layout oder mehrere Fenster benötigt werden, sollte ein anderes Toolkit in Betracht gezogen werden.
- Die Einfachheit von Spot und die plattformübergreifende Unterstützung können für kleine Projekte oder die Prototypenentwicklung sehr nützlich sein. Bei großen Anwendungen können jedoch Funktionsgrenzen bestehen.
- Wenn sich die Community und die Dokumentation rund um Spot weiterentwickeln, könnten mehr Entwickler leichter darauf zugreifen und es nutzen. Besonders hilfreich wären mehr Beispiele für benutzerdefinierte Hooks und das Schreiben von Komponenten.
- Die Erweiterbarkeit der Backends von Spot ist interessant. Insbesondere wenn eine bessere Unterstützung für Windows hinzukommt, könnten mehr Entwickler es einsetzen.
1 Kommentare
Hacker-News-Meinungen
Zusammenfassung ausgewählter Hacker-News-Kommentare