问题描述
我想通过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()
解决方法
您需要像这样手动导入:
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”是不够的,还必须导入单独的顶级扩展函数文件。
让我知道该解释是否足够,我花了一段时间才明白,甚至以为文档已过时,因为我没有导入。
P.S。如您所见,这是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
}