0

使用委托属性时,我很难理解属性类型。例如,从这个 Jetpack Compose文档中,它说两者都是一样的。

 1. val name: String by helloViewModel.name.observeAsState("")
 2. val nameState: State<String> = helloViewModel.name.observeAsState("")

我在这里浏览了 Kotlin Delegated 属性文档。对于第一个示例,根据文档,val name:String当我们尝试读取此name属性时,它将调用getValue()委托实例上的函数,其返回类型为String,而不是State<String>。但是它怎么会返回State<String>,这部分我没有完全得到。

你能指出我缺少什么来理解这个逻辑,或者任何指向文档/博客文章的链接都会很棒。谢谢

4

1 回答 1

1
val nameState: State<String> = helloViewModel.name.observeAsState("")
val name: String = nameState.value

observeAsState的返回类型是State<R>,在这种情况下是 R String(因为name被声明为LiveData<String>)。在这个阶段,您可以从State#value属性中检索状态的值。



val name: String by helloViewModel.name.observeAsState("")

这种语法非常相似,唯一的区别是它将局部变量声明为委托属性,其中委托本身只返回Statevalue属性。

委托的getValue实现(来自 Compose 的源代码,注意它只返回State的值):

inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
于 2021-05-18T12:08:34.520 回答