Fyne 中特定列表项的按钮操作

Button action for a specific list item in Fyne

我在 GUI 中有一个列表,其中有一个简单的字符串切片作为其数据源。对于每个列表项,我都创建了一个按钮,该按钮应该为该特定列表项执行某些操作。

下面是一些示例代码:

var data = []string{"folder1", "folder2"}

...

func someListCreationMethod(data []string) *widget.List {
    return widget.NewList(
        func() int {
            return len(data)
        },
        func() fyne.CanvasObject {
            return container.NewPadded(
                widget.NewLabel("Will be replaced"),
                widget.NewButton("Do Something", nil),
            )
        },
        func(id widget.ListItemID, item fyne.CanvasObject) {
            item.(*fyne.Container).Objects[1].(*widget.Label).SetText(data[id])
        },

    )
}

如何将按钮连接到列表项?我需要一种方法来知道按下了哪个按钮或者按钮知道它位于哪个列表项(或者哪个列表项是他的 parent)。

有办法吗?

也许 widget.NewListWithData() 可以解决这个问题,但我不确定这对这种情况是否有帮助。

编辑: 下面是一个更形象的例子来说明这一点(代码略有不同,但原理与上面的代码相同):

在这种情况下,我想对“拉取”按钮所属的一个回购执行拉取。

您可以通过分配Button.OnTapped

来设置按钮功能

功劳归功于 @andy.xyz,他为我指明了正确的方向。

如果人们正在寻找解决方案,我只想提供一些示例代码。

func someListCreationMethod(data []string) *widget.List {
    return widget.NewList(
        func() int {
            return len(data)
        },
        func() fyne.CanvasObject {
            return container.NewPadded(
                widget.NewLabel("Will be replaced"),
                widget.NewButton("Do Something", nil),
            )
        },
        func(id widget.ListItemID, item fyne.CanvasObject) {
            item.(*fyne.Container).Objects[0].(*widget.Label).SetText(data[id])

            // new part
            item.(*fyne.Container).Objects[1].(*widget.Button).OnTapped = func() {
                fmt.Println("I am button " + data[id])
            }
        },

    )
}