前言
fyne提供了强大的数据绑定组件,可以增强操作体验和组件的动态树的刷新。
一、Entry的绑定
1. 所见即所得
bd := binding.NewString()
lbl := widget.NewLabelWithData(bd)
input := widget.NewEntryWithData(bd)
因为Entry组件和Label组件都是引用的字符串绑定组件,当在Entry输入内容时,同时label的内容也会发生改变。
2. 监听
我们也可以给绑定组件设置监听,当数据有变化时,我们将其显示在普通的label上。
// 监听 label
listenLbl := widget.NewLabel("")
// 给label添加监听方法
bd.AddListener(binding.NewDataListener(func() {
s, err := bd.Get()
if err != nil {
fyne.LogError("get err", err)
return
}
listenLbl.SetText(s)
}))
二、List
1.创建
代码如下(示例):
sl := binding.NewStringList()
l := widget.NewListWithData(sl, nil, nil)
//创建list item,使用label
l.CreateItem = func() fyne.CanvasObject {
return widget.NewLabel("")
}
// 更新项目
l.UpdateItem = func(id widget.ListItemID, item fyne.CanvasObject) {
// 获取Item值
di, _ := sl.GetValue(id)
if l2,ok := item.(*widget.Label);ok{
l2.SetText(di)
}
}
以上是一个字符串类型的List ,我们通过按钮事件往List里添加数据:
i := 0
btn := widget.NewButton("添加", func() {
sl.Append("item " + strconv.Itoa(i))
i++
})
三、绑定结构体
dog:= &Dog{"lucky",2}
bs:= binding.BindStruct(dog)
lblDog:= widget.NewLabel("")
dogBtn:= widget.NewButton("绑定Dog",func() {
// 获取Name
iname, _ := bs.GetValue("Name")
if name,ok:=iname.(string);ok{
lblDog.SetText(name)
}
})
总结
fyne内置了很多组件的数据绑定,大家可以多实践,可以扩展更加强大的功能。
附录
源代码:
https://gitee.com/gene-zhao/fyne-demo.git
更多高级用法,持续更新...