【问题标题】:Private field not being set when fragment is created创建片段时未设置私有字段
【发布时间】:2019-09-09 11:56:07
【问题描述】:

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

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 永远不会被设置。即使我在 private val 的行上设置断点,它也永远不会被命中。

什么可以阻止它被设置?我什至尝试在 onViewCreated 方法中放置一个单击处理程序,以查看当我单击某个按钮时它是否已设置,但从未设置。

为什么断点不会命中?

【问题讨论】:

  • argument 委托是如何定义的?
  • 我更新了帖子以显示它。

标签: android kotlin


【解决方案1】:

您的 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

【讨论】:

    【解决方案2】:

    以下方法可行:

    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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多