类型‘ State < List < User > ? >’没有方法‘ getValue (Nothing? ,KProperty < * >)’,因此它不能作为委托

我尝试用 jetpack compose 中的 Observer AsState 从 LiveData 获取一个值,但是我得到了一个奇怪的错误

类型‘ State < List? >’没有方法‘ getValue (Nothing? , KProperty < * >)’,因此它不能作为委托

密码

@Composable
fun UserScreen(userViewModel:UserViewModel){
val items: List<User> by userViewModel.fetchUserList.observeAsState()
UserList(userList = items)
}

enter image description here

ViewModel

class UserViewModel: ViewModel() {


private val dataSource = UserDataSource()
val fetchUserList = liveData {
emit(dataSource.dummyUserList)
}
}
28734 次浏览

我认为项目的类型必须是可空的,因为你观察 LiveData:

val items: List<User>? by userViewModel.fetchUserList.observeAsState()

如果遇到没有定义 Observer AsState 或 getValue 的编译器错误,请确保具有以下导入:

import androidx.compose.runtime.getValue


import androidx.compose.runtime.livedata.observeAsState

这些信息来自“ 喷气背包组合中的使用状态”代码实验室中的步骤 # 4。

若要修复错误,请添加以下导入:

// for a 'val' variable
import androidx.compose.runtime.getValue


// for a `var` variable also add
import androidx.compose.runtime.setValue


// or just
import androidx.compose.runtime.*

要使用变量作为 属性委托,您应该为只读 val变量提供 getValue 运算符函数,为 var变量提供 getValuesetValue函数。

要了解更多关于属性委托和状态如何在 jetpack 中组合的信息,请参阅 使用 remember 在可组合文件中创建内部状态文档部分。在 创作中的思考视频中也有 一个解释

在我的例子中,在一个撰写应用程序中,正是这个缺失的导入导致了错误

导入 androidx.compos.getValue

我有这个问题,尽管进口!花了一点时间,但后来我意识到我的问题在于变量,因为无论你观察到什么,都需要是一个 Val而不是一个 Var:

对我来说是的
var background: Int by currentBackgroundColor.observeAsState(0)

应该是:
val background: Int by currentBackgroundColor.observeAsState(0)

你需要进口

import androidx.compose.runtime.getValue

它将导入基本上是 by的函数

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

你可以使用: import androidx.compose.runtime.*


必要的进口包括:

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.runtime.mutableStateOf


var value by remember { mutableStateOf("") }

添加一个依赖项为我解决了这个问题:

implementation "androidx.compose.runtime:runtime:$compose_version"

多亏了 Tayaab Mizhar

对于我来说,手动/显式地导入以下 API 可以解决这个编译问题,

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

这是参考文献, Https://developer.android.com/jetpack/compose/state#state-in-composables