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
Другие вопросы по тегам