Estoy tratando de obtener un valor de LiveData con observeAsState en jetpack compose, pero aparece un error extraño
El tipo 'State<List?>' no tiene el método 'getValue(Nothing?, KProperty<*>)' y, por lo tanto, no puede servir como delegado
@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) } }Necesitas importar
import androidx.compose.runtime.getValue que importará esta función que es básicamente by
inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = valuePodrías usar: import androidx.compose.runtime.*
Las importaciones necesarias son:
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("") }¡Tuve este problema a pesar de las importaciones! Tomó un poco, pero luego me di cuenta de dónde estaba mi problema: la variable para lo que sea que estés observando debe ser un valor , no una var :
en mi caso fue
var background: Int by currentBackgroundColor.observeAsState(0)
Debería haber sido:
val background: Int by currentBackgroundColor.observeAsState(0)
Agregar una dependencia solucionó el problema para mí:
implementation "androidx.compose.runtime:runtime:$compose_version"
Gracias a Tayaab Mizhar
Para corregir el error, agregue las siguientes importaciones:
// 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.* Para usar una variable como un delegado de propiedad , debe proporcionar la función de operador getValue para las variables val de solo lectura y las funciones getValue y setValue para las variables var .
Para obtener más información sobre cómo se combinan los delegados de propiedad y el estado en jetpack compose, consulte Usar recordar para crear un estado interno en una sección de documentación componible . También hay una explicación en el video Thinking in Compose .
En mi caso, en una aplicación de composición, fue esta importación faltante la que provocó el error.
importar androidx.compose.getValue
Creo que el tipo de elementos debe ser anulable ya que observa LiveData:
val items: List<User>? by userViewModel.fetchUserList.observeAsState()Si obtiene un error del compilador que observeAsState o getValue no están definidos, asegúrese de tener las siguientes importaciones:
import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsStateEsta información proviene del paso n.º 4 del laboratorio de código " Uso del estado en Jetpack Compose ".