Использование пользовательского сеттера для ленивого делегата
У меня много повторяющегося кода, и, поскольку я довольно новичок в 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' не может иметь установщика. Это имеет смысл, но есть ли способ сохранить
count
неизменный, но изменитьMutableLiveData<Int>
сеттер на что-то похожее на мою попытку?Делегированное свойство не может иметь средства доступа с реализациями не по умолчанию. Я действительно не знаю, что это значит, но я предполагаю, что это ключ к тому, чтобы я достиг того, чего хочу.
Как мне поступить, или я смотрю на это неправильно? Есть ли лучший способ сделать то, что я хочу?
2 ответа
Использование дополнительных свойств может помочь вам:
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.
Во-первых, это не то, как вы используете 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
}
}
Делегированное свойство не может иметь средства доступа с реализациями не по умолчанию. Я действительно не знаю, что это значит, но я предполагаю, что это ключ к тому, чтобы я достиг того, чего хочу.
Это означает, что вы не можете использовать set
если вы используете by
,