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

AndroidKotlinAndroid JetpackAndroid Jetpack-Compose

Android Problem Overview


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

> Type 'State?>' 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)
    }
}

Android Solutions


Solution 1 - Android

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 - Android

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 - Android

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 - Android

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

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

Solution 5 - Android

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

Solution 6 - Android

Adding a dependency fixed the problem for me:

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

Thanks to Tayaab Mizhar

Solution 7 - Android

In my case, in a compose application it was this missing import that provoc the error

> import androidx.compose.getValue

Solution 8 - Android

I had this problem despite imports! Took a bit but then I realised where my problem was the variable for whatever you're observing needs to be a val not a var:

In my case it was
var background: Int by currentBackgroundColor.observeAsState(0)

Should have been:
val background: Int by currentBackgroundColor.observeAsState(0)

Solution 9 - Android

For me manually/explicitly importing both the below apis worked to resolve this compilation issue,

import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue

Here is the reference, https://developer.android.com/jetpack/compose/state#state-in-composables

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSNMView Question on Stackoverflow
Solution 1 - AndroidEric CenView Answer on Stackoverflow
Solution 2 - AndroidValeriy KatkovView Answer on Stackoverflow
Solution 3 - AndroidBraian CoronelView Answer on Stackoverflow
Solution 4 - Androidenxy0View Answer on Stackoverflow
Solution 5 - AndroidiamanbansalView Answer on Stackoverflow
Solution 6 - Androidsanya5791View Answer on Stackoverflow
Solution 7 - AndroidKevin ABRIOUXView Answer on Stackoverflow
Solution 8 - AndroidSlashee the CowView Answer on Stackoverflow
Solution 9 - AndroidKarthik HView Answer on Stackoverflow