From 3fa131db00a58384e7f7d34782f9c3004f801f58 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Apr 2021 19:02:33 +0100 Subject: [PATCH 1/2] Fix crash in label with binding Moved to a different setup model where we don't recreate listeners all the time. Fixes #2125 --- widget/label.go | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/widget/label.go b/widget/label.go index ccc6ada36b..8a4817ab78 100644 --- a/widget/label.go +++ b/widget/label.go @@ -55,18 +55,7 @@ func NewLabelWithStyle(text string, alignment fyne.TextAlign, style fyne.TextSty func (l *Label) Bind(data binding.String) { l.Unbind() l.textSource = data - l.textListener = binding.NewDataListener(func() { - val, err := l.textSource.Get() - if err != nil { - fyne.LogError("Error getting current data value", err) - return - } - - l.Text = val - if cache.IsRendered(l) { - l.Refresh() - } - }) + l.createListener() data.AddListener(l.textListener) } @@ -114,10 +103,31 @@ func (l *Label) Unbind() { } l.textSource.RemoveListener(l.textListener) - l.textListener = nil l.textSource = nil } +func (l *Label) createListener() { + if l.textListener != nil { + return + } + + l.textListener = binding.NewDataListener(func() { + if l.textSource == nil { + return + } + val, err := l.textSource.Get() + if err != nil { + fyne.LogError("Error getting current data value", err) + return + } + + l.Text = val + if cache.IsRendered(l) { + l.Refresh() + } + }) +} + // textAlign tells the rendering textProvider our alignment func (l *Label) textAlign() fyne.TextAlign { return l.Alignment From a257709a4f89ad468e95121a98fa28f77e2390f0 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 7 Apr 2021 10:47:17 +0100 Subject: [PATCH 2/2] Additional safety on nil checks --- widget/label.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/widget/label.go b/widget/label.go index 8a4817ab78..f748af3a22 100644 --- a/widget/label.go +++ b/widget/label.go @@ -98,11 +98,12 @@ func (l *Label) SetText(text string) { // // Since: 2.0 func (l *Label) Unbind() { - if l.textSource == nil || l.textListener == nil { + src := l.textSource + if src == nil { return } - l.textSource.RemoveListener(l.textListener) + src.RemoveListener(l.textListener) l.textSource = nil } @@ -112,10 +113,11 @@ func (l *Label) createListener() { } l.textListener = binding.NewDataListener(func() { - if l.textSource == nil { + src := l.textSource + if src == nil { return } - val, err := l.textSource.Get() + val, err := src.Get() if err != nil { fyne.LogError("Error getting current data value", err) return