4 Punkte von GN⁺ 2024-05-26 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-05-26

Hacker-News-Meinungen

Zusammenfassung ausgewählter Hacker-News-Kommentare

  • Es wäre gut, die unterstützten Plattformen im README anzugeben. Es wird vorgeschlagen, es ähnlich wie in der Flutter-Dokumentation zu gestalten.
  • Ich möchte interne Entwicklungstools mit Go erstellen, verwende derzeit Wails und bin damit zufrieden. Dieses Projekt sieht ebenfalls interessant aus und ist einen Blick wert.
  • Ich denke, dass Go eine gute Erfahrung für die plattformübergreifende UI-Entwicklung bieten kann.
    • Die Build-Komplexität zu beherrschen ist eine der großen Herausforderungen bei der plattformübergreifenden Entwicklung, und Go eliminiert diese fast vollständig.
    • Ich frage mich, wie plattformübergreifende Layouts gelöst werden, wenn native Controls je nach Plattform unterschiedlich groß sind.
  • Ich frage mich, welche Vorteile der Ansatz mit einem virtuellen Control-Tree hat.
    • Ich würde gern wissen, welche Vorteile das gegenüber der direkten Aktualisierung der für den Nutzer sichtbaren Controls hat.
  • Ich habe seit Jahren nach so etwas gesucht.
    • Ich brauchte Windows-Unterstützung und bin deshalb auf C++ umgestiegen und habe wxWidgets verwendet.
  • Die Mühe ist lobenswert, aber eine plattformübergreifende Lösung ohne Windows-Unterstützung ist schade.
  • Schade, dass ich dieses Projekt nicht schon vor drei Wochen entdeckt habe.
    • Ich denke, ein nach Go portiertes React oder ein React-ähnliches Framework könnte eine hervorragende Developer Experience bieten.
  • Fltk unterstützt Windows.
    • Ich frage mich, ob Windows bisher nicht unterstützt wird, weil eine andere Lösung verwendet wird.
  • Ich frage mich, ob dieser Code bedeutet, dass GOMAXPROCS mindestens auf 2 gesetzt werden muss.
  • Ich frage mich, wie plattformübergreifende Builds umgesetzt werden.
    • Es wäre gut, wenn es einen Befehl gäbe, der MacOS-.app- und Windows-.exe-Dateien erzeugt, ohne dass Paketverwaltung, Container und Signaturprobleme für jede Plattform einzeln gelöst werden müssen.