Fyne List 小部件无法正确显示项目

我正在尝试在 listwithdata 小部件中显示字母表。我使用自定义可点击标签作为要在列表中显示的小部件。

由于某种原因,当小部件加载时一切都显示正常。但是当我开始滚动时,字母开始以完全随机的顺序显示,我不知道为什么。

这是重现该错误的完整工作代码。


package main


import (

    "fmt"


    "fyne.io/fyne/v2"

    "fyne.io/fyne/v2/app"

    "fyne.io/fyne/v2/data/binding"

    "fyne.io/fyne/v2/widget"

)


func makeAlphabet() []string {

    var alphabet []string

    for ch := 'A'; ch <= 'Z'; ch++ {

        alphabet = append(alphabet, string(ch))

    }

    return alphabet

}


type TapLabel struct {

    *widget.Label //composition


    //function pointers to set to get events

    OnTapped func(string)

}


func (mc *TapLabel) Tapped(pe *fyne.PointEvent) {

    if mc.OnTapped != nil {

        mc.OnTapped(mc.Text)

    }

}


func NewTapLabel(text string, tappedLeft func(string)) *TapLabel {

    return &TapLabel{widget.NewLabel(text), tappedLeft}

}


func alphabetToBrands(letter string) {

    fmt.Println(letter)

}


func main() {

    app := app.New()

    window := app.NewWindow("tac_hub")

    window.Resize(fyne.NewSize(200,200))


    rawData := makeAlphabet()

    data := binding.BindStringList(&rawData)

    list := widget.NewListWithData(

        data,

        func() fyne.CanvasObject {

            return NewTapLabel("template", alphabetToBrands)

        },

        func(i binding.DataItem, o fyne.CanvasObject) {

            o.(*TapLabel).Bind(i.(binding.String))

        },

    )


    window.SetContent(list)

    window.ShowAndRun()

}

点击操作正常工作,并给了我正确的字母(不是显示的字母,而是应该显示的字母)。

我猜我一定在某个地方做错了什么,但我不知道是什么。


如果有人可以提供帮助,将不胜感激!


慕森王
浏览 171回答 3
3回答

慕莱坞森

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

繁华开满天机

看起来这里的参数o.(*TapLabel).Bind(i.(binding.String))随着滚动动作的发生而变化。添加日志以i.(binding.String)在滚动时观察该函数中的值

www说

据我所见,自定义小部件的构造函数没有调用ExtendBaseWidget渲染正常工作所需的构造函数。我认为这也回答了@blackgreen 问题。如已接受的答案中所述,您不应使用其构造函数嵌入其他小部件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go