fyne中的数据双向绑定
qingheluo2024-08-14清河洛284
fyne在v2.0.0版本中引入了数据绑定功能,可以避免手动管理标准对象在"fyne/data/binding"包中实现了数据绑定数据的绑定是“双向的”,这意味着可以将值推入其中并读出数据的变化将传达给所有关联的对象,无需任何额外的代码即可实时同步更新当前支持的数据类型
基础类型(7种)
Bool、Bytes、Float、Int、Rune、String、fyne.URI
基础类型对应的列表(8种)
BoolList、BytesList、FloatList、IntList
RuneList、StringList、URIList
特殊的列表类型:Untype...
fyne在v2.0.0版本中引入了数据绑定功能,可以避免手动管理标准对象
在"fyne/data/binding"包中实现了数据绑定
数据的绑定是“双向的”,这意味着可以将值推入其中并读出
数据的变化将传达给所有关联的对象,无需任何额外的代码即可实时同步更新
当前支持的数据类型
基础类型(7种) Bool、Bytes、Float、Int、Rune、String、fyne.URI 基础类型对应的列表(8种) BoolList、BytesList、FloatList、IntList RuneList、StringList、URIList 特殊的列表类型:UntypedList Map和Struct(2种) UntypedMap、Struct
以上所有类型都可以使用构造函数进行创建对应的绑定数据
New<Type>() 创建一个零值的对应绑定数据 Bind<Type>(&val) 创建一个有初始值的绑定数据 传入的参数val必须为一个指针
绑定数据常用方法
基础数据常用方法 Get() (val, error) Set(val) error 数据列表常用方法 Get() ([]val, error) GetValue(i int) (val, error) Set(list []val) error SetValue(index int, val) error Append(val) Prepend(val) error Remove(val) error
组件的数据绑定
通过上面我们创建了用于双向绑定的数据,通过使用组件对象的Bind(val)方法即可完成绑定
show_num := binding.NewFloat() progre := widget.NewProgressBar() progre.Bind(show_num) slider := widget.NewSlider(0, 1) slider.Step = 0.01 slider.Bind(show_num) demo := container.NewVBox(label, slider) 当拖动滑块,进度条也会跟着变化
由于在实际应用中,不同组件需要绑定的数据类型时不同的
如进度条和滑块绑定Float,复选框绑定Bool,Label绑定String等
不同的组件之间通过数据双向绑定时,会导致数据类型不正确而运行出错
为此,binding包提供了许多有用的类型转换功能
ToString BoolToString(val) BoolToStringWithFormat(val, format string) FloatToString(val) FloatToStringWithFormat(val, format string) IntToStringval) IntToStringWithFormat(val, format string) URIToString(val) ToInt FloatToInt(val) StringToInt(val) StringToIntWithFormat(val, format string) ToFloat IntToFloat(val) StringToFloat(val) StringToFloatWithFormat(val, format string) ToBool StringToBool(val) StringToBoolWithFormat(val, format string) Other StringToURI(val)
使用这些数据转化函数,可以方便的进行绑定数据的数据类型转换
show_num := binding.NewFloat() show_str := binding.FloatToString(show_num) // 将Float转化为String label := widget.NewLabel("") label.Bind(show_str) slider := widget.NewSlider(0, 1) slider.Step = 0.01 slider.Bind(show_num) demo := container.NewVBox(label, slider)