Fyne 系列 10:自定义 Widget 入门
cbowen

Fyne 内置控件能覆盖大部分场景。如果你需要一个特殊展示样式,或者想把多个控件封装成一个可复用组件,就可以写自定义 Widget。

从组合控件开始

很多时候不需要真正实现 Renderer,只要写一个函数返回组合好的 fyne.CanvasObject

1
2
3
4
5
6
func NewStatusCard(title, value string) fyne.CanvasObject {
return widget.NewCard(title, "", container.NewVBox(
widget.NewLabel(value),
widget.NewProgressBarInfinite(),
))
}

这种方式简单、稳定,适合项目内部复用。

继承 BaseWidget

如果控件需要自己的状态和刷新逻辑,可以嵌入 widget.BaseWidget

1
2
3
4
5
6
7
8
9
10
type StatusWidget struct {
widget.BaseWidget
Text string
}

func NewStatusWidget(text string) *StatusWidget {
w := &StatusWidget{Text: text}
w.ExtendBaseWidget(w)
return w
}

然后实现 Renderer:

1
2
3
4
func (w *StatusWidget) CreateRenderer() fyne.WidgetRenderer {
label := widget.NewLabel(w.Text)
return widget.NewSimpleRenderer(label)
}

这是最小写法。更复杂的控件会自己维护多个 CanvasObject,并在 Refresh 里同步状态。

什么时候自定义

适合自定义 Widget 的场景:

  • 多处复用同一种 UI 结构
  • 需要封装内部状态
  • 内置控件组合不够表达
  • 需要特殊绘制效果

不建议一开始就自定义所有控件。Fyne 的控件体系已经处理了主题、尺寸、刷新、交互等细节,能组合就先组合。

 评论
评论插件加载失败
正在加载评论插件