为什么我不能为 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 在某种意义上是 ImmutableLiveDataMutableLiveData 进一步为您提供了另外两种方法 postValuesetValue ,它们在文档中有说明:
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)