我试图在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)
}
}
如果出现编译器错误,指出observeAsState 或getValue 未定义,请确保您具有以下导入:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState
此信息来自“在 Jetpack Compose 中使用状态”代码实验室中的步骤 #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
变量提供
setValue
和
var
函数。
要了解有关如何在 jetpack compose 中组合属性委托和状态的更多信息,请参阅 使用 Remember 在可组合的文档部分中创建内部状态。 Thinking in Compose 视频中还有 解释。
对我来说,手动/显式导入以下两个 API 可以解决此编译问题,
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
这是参考, https://developer.android.com/jetpack/compose/state#state-in-composables
您可以使用:
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("") }
我认为自从您观察 LiveData 以来,项目的类型必须可以为空:
val items: List<User>? by userViewModel.fetchUserList.observeAsState()
只需在所有导入库下方手动添加此行即可。
import androidx.compose.runtime.*
您需要导入
import androidx.compose.runtime.getValue
它将导入这个函数,基本上是
by
inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
就我而言,在撰写应用程序中,正是缺少导入引发了错误
导入 androidx.compose.getValue
尽管进口,我还是遇到了这个问题!花了一点时间,但后来我意识到我的问题是你所观察到的变量需要是 val 而不是 var:
就我而言是
var background: Int by currentBackgroundColor.observeAsState(0)
应该是:
val background: Int by currentBackgroundColor.observeAsState(0)
我通过导入以下内容解决了这个问题:
import androidx.compose.runtime.getValue
您需要添加以下导入:
委托语法需要以下导入:
导入 androidx.compose.runtime.getValue 导入 androidx.compose.runtime.setValue
来源:这里
我尝试了几乎所有的解决方案,但没有任何效果,然后这个更改起作用了:
val customers by viewModel.customers.collectAsState(
initial = emptyList<CustomerModel>()) //Added emptyList<Model_name>()