【问题标题】:Type 'State<List<User>?>' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate类型 'State<List<User>?>' 没有方法 'getValue(Nothing?, KProperty<*>)' 因此它不能用作委托
【发布时间】:2020-12-31 15:36:44
【问题描述】:

我正在尝试在 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


【解决方案1】:

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

import androidx.compose.runtime.getValue

import androidx.compose.runtime.livedata.observeAsState

此信息来自“Using State in Jetpack Compose”代码实验室中的第 4 步。

【讨论】:

  • 添加了 getValue 运行时导入以及在 observeAsState 中的 listOf() 并且它起作用了
  • 很好,它有效。但是为什么要构建 getvaluesetvalue 作为 State 的扩展函数,而不是让它们成为成员函数,这样我们就不需要单独导入它们了?
  • 如果你正在设置值,别忘了添加 import androidx.compose.runtime.setValue
  • 我还必须在模块级 build.gradle 文件中添加这些依赖项:implementation "androidx.compose.runtime:runtime:$compose_version" implementation "androidx.compose.runtime:runtime-livedata:$compose_version"
  • 为什么 IDE 不为我们做这件事?是否真的如此模棱两可以至于无法自动导出必要的导入? (在 Compose 发布时仍然会发生。)
【解决方案2】:

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

// 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 变量提供getValue operator function,为var 变量提供getValuesetValue 函数。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这对我有用...我需要setValuegetValue 方法。谢谢!
    【解决方案4】:

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

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

    【讨论】:

    • 这是正确的!它必须是可空的!谢谢
    【解决方案5】:

    你需要导入

    import androidx.compose.runtime.getValue
    

    这将导入这个基本上是by的函数

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

    【讨论】:

      【解决方案6】:

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

      导入 androidx.compose.getValue

      【讨论】:

        【解决方案7】:

        尽管进口了,但我遇到了这个问题!花了一点时间,但后来我意识到我的问题出在哪里,你观察到的变量必须是 val 而不是 var

        在我的情况下是
        var background: Int by currentBackgroundColor.observeAsState(0)

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

        【讨论】:

          【解决方案8】:

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

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

          感谢Tayaab Mizhar

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多