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.