Kotlin Jetpack Compose Как изменяется тип в свойстве Delegate
Мне сложно понять тип свойства при использовании делегированного свойства. Например, в этой документации Jetpack Compose говорится, что обе вещи одинаковы.
1. val name: String by helloViewModel.name.observeAsState("")
2. val nameState: State<String> = helloViewModel.name.observeAsState("")
Я просмотрел документацию по делегированным свойствам Kotlin здесь. Для первого примера, согласно документации,
val name:String
, когда мы пытаемся прочитать это
name
свойство, он будет называть
getValue()
функция в экземпляре делегата, возвращаемый тип которой будет
String
, нет
State<String>
. Но почему это возвращается
State<String
>, эту часть я не получил полностью.
Можете ли вы указать мне, чего мне не хватает, чтобы понять эту логику, или любая ссылка на документы / сообщение в блоге было бы отличным. Спасибо
1 ответ
val nameState: State<String> = helloViewModel.name.observeAsState("")
val name: String = nameState.value
возвращаемого значения ТипObservationAsState -
State<R>
, где R -
String
в этом случае (поскольку
name
объявлен как
LiveData<String>
). На этом этапе вы можете получить значение состояния из свойства .
val name: String by helloViewModel.name.observeAsState("")
Этот синтаксис очень похож, с той лишь разницей, что он объявляет локальную переменную как делегированное свойство, а сам делегат просто возвращает свойство State#valuevalue .
Делегатский
getValue
реализация (из исходного кода Compose , обратите внимание, что он просто возвращает
State
значение):
inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value