Gio UI – Cross-platform GUI for Go
Cross‑platform app strategies
- Many options mentioned: Flutter, React Native (+Expo), Ionic/Capacitor, Tauri, NativeScript, Uno Platform, AvaloniaUI, MAUI/Blazor Hybrid, QML, Skip (SwiftUI→Compose), and the plain web.
- Several commenters say Flutter has been the most practical “all-platform” choice for the last few years, particularly for mobile, though Flutter Web is criticized for accessibility, canvas-based rendering, and performance/scrolling issues.
- Others prefer React Native/Expo or Ionic+TypeScript for reusing web skills and producing DOM-based HTML/CSS output.
- Tauri is used successfully for internal tools; mobile support exists but is newer. Wails offers a Go+WebView approach similar to Tauri/Electron.
.NET and C# ecosystems
- Uno Platform and AvaloniaUI are cited as serious cross‑platform UI frameworks. Uno focuses more on mobile and native controls; Avalonia focuses on desktop with Skia rendering.
- MAUI is seen as improving, but lacks Linux support; some view that as a deal-breaker on dev machines.
- Opinions diverge on adopting .NET due to perceived platform lock‑in vs praise for its performance, tooling, and AOT/WASM support.
Gio, Fyne, and Go‑centric UI
- In Go, Gio and Fyne are the main GUI toolkits; Wails is another option using web tech.
- Differences: Gio is immediate‑mode and mostly pure Go; Fyne is retained‑mode and uses cgo. Some question the efficiency and suitability of immediate‑mode UIs outside game‑like contexts.
- One experience report finds Gio unsuitable for “serious complex” apps: missing built‑in components (video, maps, rich text), unclear extension paths, frequent breaking changes, limited theming, and immature WASM.
- Others counter that recent Gio versions improved theming, and point to real apps (including streaming apps) as evidence it can work well.
- There are complaints that Go GUI stacks in general lack drag‑and‑drop file paths and robust Unicode/CJK support (Fyne in particular).
Performance, memory, and Go specifics
- Gio’s “zero allocation” design is discussed: passing interface-typed ops could force heap allocations due to boxing; method receivers on concrete types avoid this. There’s an extended side-thread on Go’s escape analysis and generics overhead.
Web, canvas, and accessibility
- Gio’s and Flutter’s web backends use
<canvas>, raising concerns about accessibility, non‑native feel, keyboard shortcuts, and clipboard behavior. - Some note workarounds like parallel invisible DOM trees for accessibility, but acknowledge it’s complex and often incomplete.
Historical context and UI expectations
- Several comments lament that modern cross‑platform toolkits still feel fragmented and underpowered compared to older systems (VB/WinForms, Java Swing, Smalltalk, StarOffice, Delphi‑like RAD tools).
- Expectations have risen (GPU, complex text, animations, accessibility), making a polished cross‑platform toolkit an “all edge cases” project.
- Common complaint: many modern toolkits omit essential desktop widgets like tableviews/datagrids and treeviews, limiting adoption.