Как получить доступ к переменным в kotlin, не вызывая его установщик и получатель - PullRequest
0 голосов
/ 09 октября 2018

Я работаю над библиотекой, где любое изменение аргумента обновляет представление.В функции refresh() я устанавливаю значения некоторых аргументов в значения по умолчанию.

var viewAlpha= 255
        set(value) {
            field = value
            refresh()
        }

fun refresh() {
    viewAlpha = 255
    invalidate()
}

Это вызывает StackOverflowError по очевидным причинам.

Причина: java.lang.StackOverflowError: размер стека 8MB

Возможно ли получить доступ к переменным в kotlin, не вызывая его установщик, когда мы обращаемся к нему в том же классе.Подобно тому, что мы делаем в Java.

1 Ответ

0 голосов
/ 09 октября 2018

Одним из способов было бы предоставить вам хорошее старое поле для выхода из цикла setter-refres:

private var _viewAlpha = 255

var viewAlpha
        get() {
            return _viewAlpha
        }
        set(value) {
            _viewAlpha = value
            refresh()
        }

fun refresh() {
    _viewAlpha = 255
    invalidate()
}

Если вы хотите упростить свою логику для нескольких полей, вы можете абстрагировать эту реализацию в отдельнуюКласс и использовать обратный вызов с прямым установщиком, который будет работать без вызова refresh.Как это:

class Field(val onSetCb: (Field) -> Unit) {

    private var viewAlpha = 255

    fun get() {
        return viewAlpha
    }

    fun set(value: Int) {
        setDirect(value)
        onSetCb(this)
    }

    fun setDirect(value: Int) {
        viewAlpha = value;
    }
}

// Elsewhere...

fun refresh(field: Field) {
    field.setDirect(255)
    invalidate()
}

val f = Field(::refresh)
f.set(255)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...