From 3fa131db00a58384e7f7d34782f9c3004f801f58 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 2 Apr 2021 19:02:33 +0100 Subject: [PATCH] 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