【问题标题】:Kotlin Jetpack Compose Understanding Type in Delegate propertyKotlin Jetpack Compose 理解 Delegate 属性中的类型
【发布时间】:2021-08-02 20:21:15
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android kotlin android-jetpack-compose delegated-properties


    【解决方案1】:
    val nameState: State<String> = helloViewModel.name.observeAsState("")
    val name: String = nameState.value
    

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



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

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

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

    inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
    

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 1970-01-01
      • 2022-07-02
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2021-08-20
      相关资源
      最近更新 更多