为什么我不能为 LiveData 赋值?
Why can't I assign a value to LiveData?
我正在学习 LiveData,代码 A 来自 https://github.com/googlecodelabs/android-databinding
我认为代码A太复杂了,所以我尝试将其简化为代码B。
但是代码B无法编译,可以看到图片C,请问如何解决?
代码A
class SimpleViewModelSolution : ViewModel() {
private val _name = MutableLiveData("Ada")
private val _lastName = MutableLiveData("Lovelace")
private val _likes = MutableLiveData(0)
val name: LiveData<String> = _name
val lastName: LiveData<String> = _lastName
val likes: LiveData<Int> = _likes
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(_likes) {
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
_likes.value = (_likes.value ?: 0) + 1
}
}
代码B
class SimpleViewModelSolution : ViewModel() {
val name: LiveData<String> =MutableLiveData("Ada")
val lastName: LiveData<String> = MutableLiveData("Lovelace")
val likes: LiveData<Int> = MutableLiveData(0)
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(likes) { //The par 'likes' is OK
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
var a=likes.value //It's OK
likes.value = (likes.value ?: 0) + 1 //Error
}
}
图片 C
将您的 likes
对象初始化为 MutableLiveData<> 而不是 LiveData<>
将您的代码更改为:
val name: LiveData<String> =MutableLiveData("Ada")
val lastName: LiveData<String> = MutableLiveData("Lovelace")
val likes: MutableLiveData<Int> = MutableLiveData<Int>(0)
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(likes) { //The par 'likes' is OK
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
var a = likes.value //It's OK
likes.value = (likes.value ?: 0) + 1 //Now it'll work fine
}
您不能直接更改 LiveData,但您必须使用名为 MutableLiveData 的东西,我们可以说 LiveData 在某种意义上是 ImmutableLiveData。 MutableLiveData 进一步为您提供了另外两种方法 postValue 和 setValue ,它们在文档中有说明:
https://developer.android.com/reference/android/arch/lifecycle/MutableLiveData
所有你需要做的
private val _likes: MutableLiveData<Int> = MutableLiveData()
val likes : LiveData<Int>
get() = _likes
上面我们说现在我可以更改 LiveData 但是你想提供什么价值,你必须这样做
fun changeValue(newValue: Int) {
_likes.value = newValue
}
在你的activity
里面
vm.likes.observe(this, Observer{
//ui
}
然后根据需要设置值
vm.changeValue(1)
我正在学习 LiveData,代码 A 来自 https://github.com/googlecodelabs/android-databinding
我认为代码A太复杂了,所以我尝试将其简化为代码B。
但是代码B无法编译,可以看到图片C,请问如何解决?
代码A
class SimpleViewModelSolution : ViewModel() {
private val _name = MutableLiveData("Ada")
private val _lastName = MutableLiveData("Lovelace")
private val _likes = MutableLiveData(0)
val name: LiveData<String> = _name
val lastName: LiveData<String> = _lastName
val likes: LiveData<Int> = _likes
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(_likes) {
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
_likes.value = (_likes.value ?: 0) + 1
}
}
代码B
class SimpleViewModelSolution : ViewModel() {
val name: LiveData<String> =MutableLiveData("Ada")
val lastName: LiveData<String> = MutableLiveData("Lovelace")
val likes: LiveData<Int> = MutableLiveData(0)
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(likes) { //The par 'likes' is OK
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
var a=likes.value //It's OK
likes.value = (likes.value ?: 0) + 1 //Error
}
}
图片 C
将您的 likes
对象初始化为 MutableLiveData<> 而不是 LiveData<>
将您的代码更改为:
val name: LiveData<String> =MutableLiveData("Ada")
val lastName: LiveData<String> = MutableLiveData("Lovelace")
val likes: MutableLiveData<Int> = MutableLiveData<Int>(0)
// popularity is exposed as LiveData using a Transformation instead of a @Bindable property.
val popularity: LiveData<Popularity> = Transformations.map(likes) { //The par 'likes' is OK
when {
it > 9 -> Popularity.STAR
it > 4 -> Popularity.POPULAR
else -> Popularity.NORMAL
}
}
fun onLike() {
var a = likes.value //It's OK
likes.value = (likes.value ?: 0) + 1 //Now it'll work fine
}
您不能直接更改 LiveData,但您必须使用名为 MutableLiveData 的东西,我们可以说 LiveData 在某种意义上是 ImmutableLiveData。 MutableLiveData 进一步为您提供了另外两种方法 postValue 和 setValue ,它们在文档中有说明:
https://developer.android.com/reference/android/arch/lifecycle/MutableLiveData
所有你需要做的
private val _likes: MutableLiveData<Int> = MutableLiveData()
val likes : LiveData<Int>
get() = _likes
上面我们说现在我可以更改 LiveData 但是你想提供什么价值,你必须这样做
fun changeValue(newValue: Int) {
_likes.value = newValue
}
在你的activity
vm.likes.observe(this, Observer{
//ui
}
然后根据需要设置值
vm.changeValue(1)