Skip to content

Themes

Switch between dark, light and system themes in a Fyne application.

Show Code
package main
import (
"image/color"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
// customTheme wraps a base theme but forces a specific variant.
type customTheme struct {
base fyne.Theme
variant fyne.ThemeVariant
}
func (t *customTheme) Color(n fyne.ThemeColorName, _ fyne.ThemeVariant) color.Color {
return t.base.Color(n, t.variant)
}
func (t *customTheme) Icon(n fyne.ThemeIconName) fyne.Resource { return t.base.Icon(n) }
func (t *customTheme) Font(s fyne.TextStyle) fyne.Resource { return t.base.Font(s) }
func (t *customTheme) Size(n fyne.ThemeSizeName) float32 { return t.base.Size(n) }
func main() {
a := app.New()
w := a.NewWindow("Theme Toggle")
mode := 0 // 0=System, 1=Dark, 2=Light
apply := func() {
switch mode {
case 0:
// system
fyne.CurrentApp().Settings().SetTheme(theme.DefaultTheme())
case 1:
// dark
fyne.CurrentApp().Settings().SetTheme(
&customTheme{base: theme.DefaultTheme(), variant: theme.VariantDark},
)
case 2:
// light.
fyne.CurrentApp().Settings().SetTheme(
&customTheme{base: theme.DefaultTheme(), variant: theme.VariantLight},
)
}
}
btn := widget.NewButton("Toggle Theme", func() {
mode = (mode + 1) % 3
apply()
})
w.SetContent(container.NewCenter(btn))
w.Resize(fyne.NewSize(520, 300))
apply() // start in System/adaptive
w.ShowAndRun()
}