【问题标题】:Setter not called for Kotlin POJO没有为 Kotlin POJO 调用 Setter
【发布时间】:2017-07-11 12:06:01
【问题描述】:

我编写了一个简单的 POJO(或 POKO),并希望将其用于在 Kotlin 编写的 Android 应用程序中进行数据绑定。我的问题,setter 中的代码没有被调用。我希望在控制台中看到Set value to <>。知道为什么这没有发生吗?

这是我发在try.kotlinlang.org的代码:

fun main(args: Array<String>) {
    var myData = MyData()
    println(myData.helloWorldText)
    println(myData.helloWorldText)
    println(myData.helloWorldText)
    println(myData.helloWorldText)
}

class MyData {

    private val values = listOf<String>("Oh...", "Oh captain...", "Oh captain, my ...", "Oh captain, my captain...")

    private var i = -1

    var helloWorldText: String = ""
        get() = values[++i % values.size]
        set(value) {
            println("Set value to " + field)
        }
}

背景信息:稍后我想让我的 POJO 实现 android.databinding.Observable 并在 setter 中调用 registry.notifyChange(this, BR.helloWorldText)

【问题讨论】:

  • 你能发帖吗,你如何改变价值?
  • 该值只能使用setter来改变。在我的应用程序中,每当调用 getter 时,该值都会隐式更改。到目前为止,这工作正常。值发生变化。
  • 那么问题出在哪里?
  • setter里面的代码没有被执行。因此,对于数据绑定,我无法注册我的Observable.OnPropertyChangedCallbackThis 解释了如何为 Java 设置 PropertyChangedCallback。
  • 您更新的代码不应显示该字符串,因为没有分配。所以这个值永远不会被设置。

标签: android data-binding kotlin


【解决方案1】:

代码从不调用setter,只调用getter。

感谢帮助解决问题的 cmets。此代码按预期运行:

fun main(args: Array<String>) {
    var myData = MyData()
    println(myData.helloWorldText)

    myData.nextValuePlease()        
    println(myData.helloWorldText)
}

class MyData {

    private val values = listOf<String>("Oh...", "Oh captain...", "Oh captain, my ...", "Oh captain, my captain...")

    private var i = 0

    fun nextValuePlease() {
        i = ++i % values.size
        helloWorldText = helloWorldText
    }

    var helloWorldText: String
        get() = values[i]
        set(value) {
            println("Set value to \"" + value+"\"")
        }
}

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2023-04-03
    • 2013-04-22
    • 1970-01-01
    • 2017-10-26
    • 2019-06-13
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多