我想在observeAsState上通过委托(delegate)语法使用状态,但是它报告错误,表明数据类中没有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()

最佳答案

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

import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
要么
import androidx.compose.runtime.*
我认为这是Android Studio中的错误,因此建议不要自动导入。
[编辑]
您编辑了问题,询问为什么我们需要该导入,所以我将尝试将其包装起来:
当我们想使用“by”将分配委派给一个类时,我们需要使用“operator”修饰符创建一个名为“getValue”的函数,该函数以正确的类型返回值。 “setValue”的逻辑相同,我们需要询问正确类型的参数并使用“operator”,从而允许您在“val”之外的“val”中使用“by”。
发生的情况是,将函数“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
}

10-07 19:24
查看更多