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

问题描述 投票:0回答:14

我试图在jetpack compose中使用observeAsState从LiveData获取值,但我收到一个奇怪的错误

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

代码

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

视图模型

class UserViewModel: ViewModel() {

    private val dataSource = UserDataSource()
    val fetchUserList = liveData {
        emit(dataSource.dummyUserList)
    }
}
android kotlin android-jetpack android-jetpack-compose
14个回答
301
投票

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

import androidx.compose.runtime.getValue

import androidx.compose.runtime.livedata.observeAsState

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


124
投票

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

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

要将变量用作 属性委托,您应该为只读 getValue

 变量提供 
val
运算符函数
,并为 getValue
 变量提供 
setValue
var
 函数。 

要了解有关如何在 jetpack compose 中组合属性委托和状态的更多信息,请参阅 使用 Remember 在可组合的文档部分中创建内部状态。 Thinking in Compose 视频中还有 解释


50
投票

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

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

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


31
投票

您可以使用:

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("") }

13
投票

我认为自从您观察 LiveData 以来,项目的类型必须可以为空:

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

10
投票

只需在所有导入库下方手动添加此行即可。

import androidx.compose.runtime.*

7
投票

添加依赖项解决了我的问题:

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

感谢Tayaab Mizhar


4
投票

您需要导入

import androidx.compose.runtime.getValue

它将导入这个函数,基本上是

by

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

1
投票

就我而言,在撰写应用程序中,正是缺少导入引发了错误

导入 androidx.compose.getValue


1
投票

尽管进口,我还是遇到了这个问题!花了一点时间,但后来我意识到我的问题是你所观察到的变量需要是 val 而不是 var:

就我而言是

var background: Int by currentBackgroundColor.observeAsState(0)

应该是:

val background: Int by currentBackgroundColor.observeAsState(0)


1
投票

我通过导入以下内容解决了这个问题:

import androidx.compose.runtime.getValue

0
投票

您需要添加以下导入:

委托语法需要以下导入:

导入 androidx.compose.runtime.getValue 导入 androidx.compose.runtime.setValue

来源:这里


0
投票

我添加了你在这里写的所有内容,但对我来说仍然没有用。 我做了“清理”和“重建”项目——什么也没做。


0
投票

我尝试了几乎所有的解决方案,但没有任何效果,然后这个更改起作用了:

 val customers by viewModel.customers.collectAsState(
initial = emptyList<CustomerModel>()) //Added emptyList<Model_name>()
© www.soinside.com 2019 - 2024. All rights reserved.