为什么我不能使用 `MutableState` 作为属性委托?

时间:2021-05-02 18:49:53

标签: android android-studio kotlin android-jetpack-compose

我正在尝试使用 MutableState 的实例作为属性委托。

这是我所拥有的:

val countState = remember { mutableStateOf(0) }

这是我想要的:

var count by remember { mutableStateOf(0) }

但是,当我使用 by 关键字时,出现编译器错误:

Type 'TypeVariable(T)' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate

怎么了?

1 个答案:

答案 0 :(得分:4)

作为代理,MutableState 需要一个 getValue 函数(用于读取值)和一个 setValue 函数(用于写入值)。

当您通过 MutableState 访问 mutableStateOf 时,您使用导入:

import androidx.compose.runtime.mutableStateOf

但是,此导入不包括 getValuesetValueMutableState 函数 - 它们被定义为单独文件中的扩展函数。要访问它们,需要对该文件进行显式导入。

这本身通常不是问题 - 如果您输入:

countState.getValue(...)

Android Studio 会自动为您建议所需的导入。

但是,当您使用 by 关键字时,这是一个问题 - Android Studio 不会自动为您建议导入。相反,它会给出 cannot serve as a delegate 错误,而没有任何指示您需要做什么。

所以解决方法是自己手动添加扩展函数的导入:

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

希望 IDE 团队中的某个人可以在未来使这一点更加明显 - 对导入的自动建议将是理想的!