【问题标题】:By delegate data class on observeAsState通过在 observeAsState 上委托数据类
【发布时间】:2020-10-25 09:16:25
【问题描述】:

我想在observeAsState上通过委托语法使用状态,但是报错显示数据类中没有getValue方法。

@Composable
fun ComposeScreen(
    ...
) {
    val item: Item by viewModel.item.observeAsState(Item)  // there is an error in `(Item)`, it seems not delegate directly using the model of data class.
}

// viewModel
val item = itemRepository.item  // item is a LiveData 

// model
data class Item(
    ...
)

更新

我找到解决方案参考别人的演示项目,但我仍然不明白为什么要这样做。

import androidx.compose.runtime.getValue

val item: Item? by viewModel.item.observeAsState()

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    您需要手动导入它,如下所示:

    import androidx.compose.runtime.getValue
    import androidx.compose.runtime.setValue
    

    import androidx.compose.runtime.*
    

    我认为这是 Android Studio 中的一个错误,它不建议自动导入它。

    [编辑] 你编辑了你的问题,问我们为什么需要那个导入,所以我会试着把它总结一下:

    当我们想使用“by”将赋值委托给一个类时,我们需要创建一个名为“getValue”的函数,它带有“operator”修饰符,它返回正确类型的值。 “setValue”也是同样的逻辑,我们需要请求一个正确类型的参数并使用“operator”,让你可以在“var”中使用“by”,除了“val”。

    这里发生的情况是函数“getValue”和“setValue”被声明为扩展函数,因此导入“State”是不够的,您还必须导入单独的顶级扩展函数文件。

    让我知道这个解释是否足够,我花了一段时间才明白这一点,甚至认为文档已经过时,因为我错过了导入。

    附:这是 Compose 代码中的两个函数,如您所见,它们扩展了“State”类。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多