3 回答

TA贡献1810条经验 获得超4个赞
使用自定义小部件的解决方案:
这是基于 Fyne Extending Widgets 教程。特别是你打电话ExtendBaseWidget
:
ExtendBaseWidget 被扩展小部件用于利用 BaseWidget 功能。
您仍然 embed widget.Label
,但不是作为指针(使用指针也可以,但文档使用非指针示例),以便将必要的方法提升到您的小部件中:
func NewTapLabel(text string, tappedLeft func(string)) *TapLabel {
label := &TapLabel{}
label.ExtendBaseWidget(label)
label.SetText(text)
label.OnTapped = tappedLeft
return label
}
然后更改更新函数以将实际绑定字符串设置为标签,而不是像原始示例中那样再次绑定数据:
func(i binding.DataItem, o fyne.CanvasObject) {
s, _ := i.(binding.String).Get()
o.(*TapLabel).SetText(s)
},
至于为什么如果省略 call 会出现错误ExtendBaseWidget,我怀疑这是因为它缺少此方法设置的基本小部件实现。
没有自定义小部件的解决方案:
list := widget.NewListWithData(
data,
func() fyne.CanvasObject {
return &widget.Label{Text: "template"}
},
func(i binding.DataItem, o fyne.CanvasObject) {
o.(*widget.Label).Bind(i.(binding.String))
},
)
list.OnSelected = func(id widget.ListItemID) {
fmt.Println(rawData[id])
}
放弃您的自定义TapLabel以支持&widget.Label{Text: "template"},然后打印您使用的点击项目list.OnSelected并在数据切片周围关闭。

TA贡献1816条经验 获得超4个赞
看起来这里的参数o.(*TapLabel).Bind(i.(binding.String))
随着滚动动作的发生而变化。添加日志以i.(binding.String)
在滚动时观察该函数中的值

TA贡献1775条经验 获得超8个赞
据我所见,自定义小部件的构造函数没有调用ExtendBaseWidget
渲染正常工作所需的构造函数。我认为这也回答了@blackgreen 问题。
如已接受的答案中所述,您不应使用其构造函数嵌入其他小部件。
- 3 回答
- 0 关注
- 170 浏览
添加回答
举报