在我的片段中,我有以下代码:
class {
private val resetHash: String by argument(ARGUMENT_RESET_HASH)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// resetHash is never set
}
}
参数定义为:
inline fun <reified T> Fragment.argument(argumentName: String): ReadOnlyProperty<Fragment, T> {
return object : ReadOnlyProperty<Fragment, T> {
override fun getValue(thisRef: Fragment, property: KProperty<*>): T {
return arguments?.get(argumentName) as T
}
}
}
私有成员resetHash从未设置。即使我在使用私有val的线上设置断点,也永远不会受到打击。
有什么可以防止它被设置的?我什至尝试将单击处理程序放在onViewCreated方法中,以查看单击某个按钮时是否设置了该单击处理程序,但从未设置过。
为什么断点不会被击中?
答案 0 :(得分:3)
您的resetHash
属性被委托。 Kotlin代表很懒。不调用它就不会执行:
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class TestDelegate : ReadOnlyProperty<Any, String> {
override fun getValue(thisRef: Any, property: KProperty<*>): String {
println("delegate called")
return "test"
}
}
class Test {
val prop by TestDelegate()
}
fun main() {
val test = Test()
println("no call")
println("prop: ${test.prop}")
}
// will print
// no call
// delegate called
// prop: test
答案 1 :(得分:1)
以下将起作用:
class MyFragment : Fragment() {
private val resetHash: String by argument(ARGUMENT_RESET_HASH)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
resetHash
// it is set now
}