Reputation: 6825
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
@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)
}
}
Upvotes: 204
Views: 67481
Reputation: 5023
You need to add the following imports:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
Src: here
Upvotes: 11
Reputation: 133
Coming from XML background, my case was very different
Have to change
val counter by remember { MutableStateFlow(0) }
to
val counter by remember { mutableStateOf(0) }
Upvotes: 0
Reputation: 3481
I fixed this issue by just importing this:
import androidx.compose.runtime.getValue
Upvotes: 12
Reputation: 872
Just add this line manually below all the import libraries.
import androidx.compose.runtime.*
Upvotes: 15
Reputation: 1439
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
Upvotes: 59
Reputation: 498
Adding a dependency fixed the problem for me:
implementation "androidx.compose.runtime:runtime:$compose_version"
Thanks to Tayaab Mizhar
Upvotes: 7
Reputation: 22905
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("") }
Upvotes: 36
Reputation: 2752
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
Upvotes: 4
Reputation: 325
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)
Upvotes: 1
Reputation: 4436
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.
Upvotes: 343
Reputation: 17735
In my case, in a compose application it was this missing import that provoc the error
import androidx.compose.getValue
Upvotes: 1
Reputation: 40702
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.
Upvotes: 148
Reputation: 137
I think type of items must be nullable since you observing LiveData:
val items: List<User>? by userViewModel.fetchUserList.observeAsState()
Upvotes: 14