【发布时间】: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