类型'State <List <User>?>'没有方法'getValue(Nothing ?, KProperty <*>)',因此它不能充当委托

时间:2020-09-13 20:45:58

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

我正在尝试通过jetpack中的observeAsState从LiveData中获取一个值,但出现一个奇怪的错误

类型'State '没有方法'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)
    }
}

7 个答案:

答案 0 :(得分:36)

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

// 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.*

要将变量用作 property delegate,您应该为只读 val 变量以及 getValueoperator function 函数提供 getValue setValue用于 var 变量。

要了解有关如何在 jetpack compose 中组合属性委托和状态的更多信息,请参阅 Use remember to create internal state in a composable 文档部分。 an explanation 视频中还有 Thinking in Compose

答案 1 :(得分:26)

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

导入androidx.compose.runtime.getValue

导入androidx.compose.runtime.livedata.observeAsState

此信息来自“在Jetpack Compose中使用状态”代码实验室中的步骤4。

答案 2 :(得分:4)

自您观察LiveData以来,我认为商品类型必须为空:

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

答案 3 :(得分:1)

在我的例子中,在撰写应用程序中,正是这个缺少的导入引发了错误

<块引用>

导入 androidx.compose.getValue

答案 4 :(得分:1)

尽管有导入,我还是遇到了这个问题!花了一点时间,但后来我意识到我的问题是您观察到的任何变量都需要是 val 而不是 var

就我而言是
var background: Int by currentBackgroundColor.observeAsState(0)

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

答案 5 :(得分:1)

您可以使用: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("") }

答案 6 :(得分:0)

您需要导入

WS_THICKFRAME

这将导入这个函数,它基本上是 import androidx.compose.runtime.getValue

by