【问题标题】:Kotlin Extensions property vs. function - ConflictKotlin 扩展属性与功能 - 冲突
【发布时间】:2018-04-04 15:11:09
【问题描述】:

我有以下两个定义。

第一个作为扩展函数,允许设置可见 View 并使用第二个参数将其设置为消失或不可见。

fun View.setVisible(visible: Boolean, goneWhenVisibleFalse: Boolean) {
    visibility = when {
        visible -> View.VISIBLE
        goneWhenVisibleFalse -> View.GONE
        else -> View.INVISIBLE
    }
}

这里的第二个,作为扩展属性使用上面的第一个。

var View.visible: Boolean
    get() = visibility == View.VISIBLE
    set(value) {
        setVisible(value, true)
    }

在此之前并不复杂。代码编译并且应用程序正确启动。但是我得到一个黑屏,logcat 中没有错误,没有什么可以追踪的。

一段时间后,我将第一个函数的签名更改为接收第二个参数,默认为true:

fun View.setVisible(visible: Boolean, goneWhenVisibleFalse: Boolean= true)

然后它就可以正常工作了。问题是:为什么会发生这种情况?我深入研究了字节码。但是看起来没有重复签名,两种情况下参数的数量是不同的。

也许是 kotlin 的错误?我正在使用 kotlin 插件 v1.2.30

【问题讨论】:

  • 在 v1.2.31 中可以正常工作,参数没有默认值
  • 有点奇怪的代码,因为 setVisible(value, true) 将永远消失
  • 不可能回答“为什么会这样?”无法调试您的实际应用程序。我们没有发现 Kotlin 中存在任何表现为用户应用挂起而没有诊断的错误。
  • @yole,是的,你是对的。但代码很简单。您可以尝试自己的实现。我一直在寻找 cmets 以更好地理解这种行为。
  • @DEADMC 是的,这段代码是错误的。

标签: android kotlin kotlin-extension


【解决方案1】:

使用这个:

View.setVisible(visible: Boolean, goneWhenInvisible: Boolean = false) { 
    visibility = if (visible) View.VISIBLE 
    else if (goneWhenInvisible) View.GONE 
    else View.INVISIBLE
}

【讨论】:

  • 是的,还有 = true。但是为什么没有它们呢?
  • @crgarridos 我不明白你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多