[英]Using a custom setter for a lazy delegate
我有很多重复的代码,并且由于我不是Kotlin的新手,所以我想学习并尝试尽可能多地利用它。 我有许多惰性声明的MutableLiveData<Int>
属性,在代码的某处,我正在检查每个代码,以确保实时数据的值永远不会低于0。我以为使用Kotlin的委托可以工作,但我觉得不知所措。
这是我的声明的摘要(默认值为0)。
private val count: MutableLiveData<Int> by lazy {
MutableLiveData<Int>().also { it.value = 0 }
}
这是一些onClickListeners的片段。
btn_decrement.setOnClickListener {
count.value?.run {
if (this > 0) {
count.value = this - 1
}
}
}
我想做以下事情:
private val d4Count: MutableLiveData<Int> by lazy {
MutableLiveData<Int>().also { it.value = 0 }
}
set(value) {
if (field.value?.toInt() - value < 0) field.value = 0 else field.value -= value
}
但是Android Studio给我2个错误:
“ val”属性不能有setter。 这是有道理的,但是有一种方法可以使count
保持不变,但是可以将MutableLiveData<Int>
的setter更改为类似于我的尝试?
委派的属性不能具有具有非默认实现的访问器。 我真的不知道这意味着什么,但是我认为这对于我实现自己想要的东西至关重要。
我该怎么做,还是我看错了? 有没有更好的方法来做我想做的事?
首先,这不是您使用MutableLiveData
。 您可以使用setValue
(在主线程上or
postValue`(在任何线程上)设置值。
val d4Count = MutableLiveData<Int>()
status.value = 4
status.postValue(4)
如果要更改MutableLiveData
的设置器,则可以扩展MutableLiveData
(1)或创建设置器方法(2)。
(1)
class CustomIntLiveData: MutableLiveData<Int>() {
override fun setValue(value: Int?) {
super.setValue(processValue(value))
}
override fun postValue(value: Int?) {
super.postValue(processValue(value))
}
private fun processValue(value: Int?) : Int {
val currentValue = this.value
return if (currentValue == null || value == null || currentValue - value < 0) {
0
} else {
currentValue - value
}
}
}
(2)
fun setCount(value: Int?) {
val currentValue = d4Count.value
if (currentValue == null || value == null || currentValue - value < 0) {
d4Count.value = 0
} else {
d4Count.value = currentValue - value
}
}
委派的属性不能具有具有非默认实现的访问器。 我真的不知道这意味着什么,但是我认为这对于我实现自己想要的东西至关重要。
这意味着如果使用by
则不能使用set
。
使用其他属性可以帮助您:
class SomeClass {
var count = 0
set(value) {
if (field - value < 0) field = 0 else field -= value
_count.value = field
}
private val _count: MutableLiveData<Int> by lazy {
MutableLiveData<Int>().also { it.value = 0 }
}
}
// Using additional property
val s = SomeClass()
s.count = 5 // this will set value to `count` and `_count` properties depending on the condition in the setter of `count` property.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.