如何扩展 fyne BaseWidget - go 给出错误“type *

我正在尝试扩展 fyne 小部件以具有带背景的简单可点击内容。我搜索了 fyne 小部件以找到一个可以用作入门的示例,并在 List/ListItem 中找到了类似的东西。

我基本上复制了列表项代码并稍微调整了一下。它看起来确实类似于fyne 文档中的简单示例。但是由于某些未知原因,go 给了我一个错误,我不知道原因是什么,也不知道如何解决:

custom_widget/simple_card.go:80:24: c.card.super undefined (type *SimpleCard has no field or method super)

这是模块的代码(custom_widget/simple_card.go):

package custom_widget


import (

    "fyne.io/fyne/v2"

    "fyne.io/fyne/v2/canvas"

    "fyne.io/fyne/v2/theme"

    "fyne.io/fyne/v2/widget"

    "log"

)


// Declare conformity with interfaces.

var _ fyne.Widget = (*SimpleCard)(nil)

var _ fyne.Tappable = (*SimpleCard)(nil)


type SimpleCard struct {

    widget.BaseWidget


    onTapped   func()

    background *canvas.Rectangle

    content    fyne.CanvasObject

    selected   bool

}


func NewSimpleCard(content fyne.CanvasObject, tapped func()) *SimpleCard {

    card := &SimpleCard{onTapped: tapped, content: content}

    card.ExtendBaseWidget(card)

    return card

}


// CreateRenderer is a private method to Fyne which links this custom_widget to its renderer.

func (c *SimpleCard) CreateRenderer() fyne.WidgetRenderer {

    c.ExtendBaseWidget(c)


    c.background = canvas.NewRectangle(theme.SelectionColor())

    c.background.Hide()


    objects := []fyne.CanvasObject{c.background, c.content}


    // NewBaseRenderer and BaseRenderer are copied from

    // https://github.com/fyne-io/fyne/blob/master/internal/widget/base_renderer.go

    // because the functionality is marked internal in fyne !?

    return &SimpleCardRenderer{NewBaseRenderer(objects), c}

}


func (c *SimpleCard) Tapped(_ *fyne.PointEvent) {

    log.Println("I have been tapped")

    if c.onTapped != nil {

        c.selected = true

        c.Refresh()

        c.onTapped()

    }

}


// Declare conformity with the WidgetRenderer interface.

var _ fyne.WidgetRenderer = (*SimpleCardRenderer)(nil)


type SimpleCardRenderer struct {

    BaseRenderer


    card *SimpleCard

}

哔哔one
浏览 108回答 1
1回答

UYOU

删除您创建的所有渲染器类型并在CreateRenderer刚刚的 return中widget.NewSimpleRenderer(container .NewMax(c.background, c.content))。它比你想象的要简单。从主要小部件中复制代码通常不是最好的方法,因为我们有快捷方式和/或必须支持比您自己的小部件更多的功能。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go