android - 通过在 observeAsState 上委托数据类
问题描述
我想在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”,允许你在“var”中使用“by”,除了“val”。
发生的情况是函数“getValue”和“setValue”被声明为扩展函数,因此导入“State”是不够的,您还必须导入位于单独文件中的顶级扩展函数。
让我知道这个解释是否足够,我花了一段时间才明白这一点,甚至认为文档已经过时,因为我错过了导入。
PS 这是 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
}
推荐阅读
- tensorflow2.0 - 在 Tenorflow 2 中为度量函数重塑模型输出
- kdb - 在 KDB 中,是否有 numpy 的 array.shape 等价物?
- azure-sdk-python - 如何以编程方式将 webhook 事件添加到 KeyVaults?
- python - 我将如何遍历并将用户的输入存储到 neo4j 内的决策树中?
- powerbi - Power BI - 未找到表的列 'Column1' 错误
- c# - 在右侧追加二维数组
- postgresql - 在 Ubuntu 中更新 Postgresql 时,系统未使用 systemd 错误启动
- c - 使用 MPI 的数字 1 到 1000 的总和
- flutter - Flutter : 我想在你点击图片的时候换一张图片,其他的不受点击的影响
- java - 如何优化java中的计数排序?