Timers
Periodic Tick
Send a message at regular intervals:
go
func (a *app) Init() tui.Cmd {
return tui.TickCmd(100 * time.Millisecond)
}
func (a *app) Update(msg tui.Msg) (tui.Component, tui.Cmd) {
switch msg.(type) {
case tui.TickMsg:
a.frame++
return a, tui.TickCmd(100 * time.Millisecond)
}
return a, nil
}FPS-Based Tick
go
// 30 FPS
return tui.TickEvery(30)Delayed Message
Send a message after a one-time delay:
go
cmd := tui.AfterCmd(2*time.Second, myCustomMsg{})Custom Periodic Function
go
cmd := tui.PeriodicCmd(5*time.Second, func(t time.Time) tui.Msg {
return statusCheckMsg{time: t}
})Animation Tick
For KGP animation frame updates:
go
func (a *app) Init() tui.Cmd {
return tui.AnimateCmd(24) // 24 FPS
}
func (a *app) Update(msg tui.Msg) (tui.Component, tui.Cmd) {
switch msg.(type) {
case tui.AnimationTickMsg:
a.advanceFrame()
return a, tui.AnimateCmd(24)
}
return a, nil
}Batching Commands
Run multiple commands concurrently:
go
func (a *app) Init() tui.Cmd {
return tui.Batch(
tui.TickCmd(100 * time.Millisecond),
a.spinner.Tick(),
fetchDataCmd(),
)
}