亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Fyne List 小部件無法正確顯示項目

Fyne List 小部件無法正確顯示項目

Go
慕森王 2022-10-10 19:51:18
我正在嘗試在 listwithdata 小部件中顯示字母表。我使用自定義可點擊標簽作為要在列表中顯示的小部件。由于某種原因,當小部件加載時一切都顯示正常。但是當我開始滾動時,字母開始以完全隨機的順序顯示,我不知道為什么。這是重現該錯誤的完整工作代碼。package mainimport (    "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()}點擊操作正常工作,并給了我正確的字母(不是顯示的字母,而是應該顯示的字母)。我猜我一定在某個地方做錯了什么,但我不知道是什么。如果有人可以提供幫助,將不勝感激!
查看完整描述

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并在數據切片周圍關閉。


查看完整回答
反對 回復 2022-10-10
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

看起來這里的參數o.(*TapLabel).Bind(i.(binding.String))隨著滾動動作的發生而變化。添加日志以i.(binding.String)在滾動時觀察該函數中的值



查看完整回答
反對 回復 2022-10-10
?
www說

TA貢獻1775條經驗 獲得超8個贊

據我所見,自定義小部件的構造函數沒有調用ExtendBaseWidget渲染正常工作所需的構造函數。我認為這也回答了@blackgreen 問題。

如已接受的答案中所述,您不應使用其構造函數嵌入其他小部件。


查看完整回答
反對 回復 2022-10-10
  • 3 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號