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

SNM*_*SNM 68 android kotlin android-jetpack android-jetpack-compose

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

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

代码

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

在此处输入图片说明

视图模型

class UserViewModel: ViewModel() {

    private val dataSource = UserDataSource()
    val fetchUserList = liveData {
        emit(dataSource.dummyUserList)
    }
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*Cen 131

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

import androidx.compose.runtime.getValue

import androidx.compose.runtime.livedata.observeAsState
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么 IDE 不为我们做这件事呢?它真的如此含糊以至于无法自动导出必要的导入吗?(Compose 发布后仍然会发生这种情况。) (20认同)
  • 在observeAsState中添加了getValue运行时导入和listOf(),它起作用了 (5认同)
  • 如果您要设置值,也不要忘记添加 import androidx.compose.runtime.setValue (5认同)
  • 我还必须在模块级 build.gradle 文件中添加这些依赖项: `implementation "androidx.compose.runtime:runtime:$compose_version"implementation "androidx.compose.runtime:runtime-livedata:$compose_version"` (4认同)
  • 很好,它有效。但是为什么要构建 `getvalue` 和 `setvalue` 作为 State 的扩展函数而不是让它们成为成员函数,这样我们就不需要单独导入它们了? (2认同)

Kar*_*k H 55

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

import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
Run Code Online (Sandbox Code Playgroud)

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


Val*_*kov 47

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

// 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.*
Run Code Online (Sandbox Code Playgroud)

要使用一个变量作为一个财产委托你应该提供操作功能为只读变量,以及对功能的变量。getValue valgetValuesetValuevar

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


COR*_*ian 32

你可以使用: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("") }
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用......我需要“setValue”和“getValue”方法。谢谢! (2认同)

小智 13

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

import androidx.compose.runtime.*
Run Code Online (Sandbox Code Playgroud)


小智 8

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

val items: List<User>? by userViewModel.fetchUserList.observeAsState()
Run Code Online (Sandbox Code Playgroud)


ahm*_*ira 8

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

import androidx.compose.runtime.getValue
Run Code Online (Sandbox Code Playgroud)


san*_*791 7

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

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

谢塔亚布·米扎尔