You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Fyne的Widget.List每个列表项设置独立OnSelected函数?

解决Fyne List组件各列表项独立点击逻辑的问题

Fyne的List组件的OnSelected是单一回调函数,并非可索引的函数数组,你之前尝试的listView.OnSelected[0]写法是错误的。正确的实现方式是在OnSelected回调内,根据选中项的ListItemID(即列表索引)进行分支处理,从而给每个列表项设置独立的交互逻辑。

修改后的完整代码

package main

import (
    "fyne.io/fyne/v2"
    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/container"
    "fyne.io/fyne/v2/theme"
    "fyne.io/fyne/v2/widget"
)

func main() {
    a := app.New()
    a.Settings().SetTheme(theme.DarkTheme())
    W := a.NewWindow("Application-OutSight")
    W.Resize(fyne.NewSize(640, 460))

    menuBar := []string{"Home","App-Status", "Exit"}
    
    listView := widget.NewList(func() int {
        return len(menuBar)
    }, func() fyne.CanvasObject {
        return widget.NewLabel("template")
    }, func(id widget.ListItemID, o fyne.CanvasObject) {
        o.(*widget.Label).SetText(menuBar[id])
    })

    contenttext := widget.NewLabel("Welcome to this App")
    
    // 正确的独立逻辑实现方式
    listView.OnSelected = func(id widget.ListItemID) {
        switch id {
        case 0: // 处理Home项点击
            contenttext.SetText("欢迎回到首页")
            // 这里添加Home项的自定义逻辑
        case 1: // 处理App-Status项点击
            contenttext.SetText("当前应用状态:正常运行")
            // 这里添加App-Status的自定义逻辑
        case 2: // 处理Exit项点击
            contenttext.SetText("正在退出应用...")
            a.Quit() // 退出应用示例
        }
    }

    split := container.NewHSplit(
        listView,
        container.NewMax(contenttext),
    )
    split.Offset = 0.2
    W.SetContent(split)
    W.ShowAndRun()
}

关键说明

  1. OnSelected的本质:List.OnSelected是一个func(widget.ListItemID)类型的字段,只能赋值一个函数,不能按索引拆分赋值。
  2. 分支处理逻辑:通过switch id判断当前选中的列表项索引,对应menuBar数组的元素位置,为每个分支编写独立的交互代码。
  3. 示例扩展:你可以把示例中的文本替换、退出逻辑,改成自己需要的业务代码(比如加载对应页面、执行操作等)。

内容的提问来源于stack exchange,提问作者Ronny Fontex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:45:42