创建片段时未设置私有字段

时间:2019-09-09 11:56:07

标签: android kotlin

在我的片段中,我有以下代码:

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方法中,以查看单击某个按钮时是否设置了该单击处理程序,但从未设置过。

为什么断点不会被击中?

2 个答案:

答案 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
    }