Type 'State<List<User>?>' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate

14,879

Solution 1

If you get a compiler error that observeAsState or getValue are not defined make sure you have the following imports:

import androidx.compose.runtime.getValue

import androidx.compose.runtime.livedata.observeAsState

This information is from Step #4 in the "Using State in Jetpack Compose" codelab.

Solution 2

To fix the error add the following imports:

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

To use a variable as a property delegate you should provide getValue operator function for read-only val variables and getValue and setValue functions for var variables.

To read more about how property delegates and state are combined in jetpack compose see Use remember to create internal state in a composable documentation section. There's also an explanation in Thinking in Compose video.

Solution 3

You could use: import androidx.compose.runtime.*


Necessary imports are:

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

Solution 4

I think type of items must be nullable since you observing LiveData:

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

Solution 5

You need to import

import androidx.compose.runtime.getValue

which will import this function which is basically by

inline operator fun <T> State<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
Share:
14,879
SNM
Author by

SNM

say no more

Updated on June 19, 2022

Comments

  • SNM
    SNM about 2 years

    I'm trying to get a value from LiveData with observeAsState in jetpack compose, but I get a weird error

    Type 'State<List?>' has no method 'getValue(Nothing?, KProperty<*>)' and thus it cannot serve as a delegate

    Code

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

    enter image description here

    ViewModel

    class UserViewModel: ViewModel() {
    
        private val dataSource = UserDataSource()
        val fetchUserList = liveData {
            emit(dataSource.dummyUserList)
        }
    }