首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能给LiveData分配一个值呢?

为什么我不能给LiveData分配一个值呢?
EN

Stack Overflow用户
提问于 2020-02-25 07:26:21
回答 2查看 766关注 0票数 1

我正在学习LiveData,代码A来自https://github.com/googlecodelabs/android-databinding

我认为代码A太复杂了,所以我尝试将其简化为代码B。

但是代码B不能编译,您可以看到图像C,我如何修复它?

码A

代码语言:javascript
复制
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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-25 07:41:49

likes对象初始化为MutableLiveData<>而不是LiveData<>,将代码更改为:

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2020-02-25 08:01:52

您不能直接更改MutableLiveData,LiveData,但是您必须使用名为LiveData的东西,我们可以说LiveData在某种意义上是ImmutableLiveData。MutableLiveData进一步为您提供了两个方法:postValuesetValue,在这里的docs中对这两个方法进行了解释:

https://developer.android.com/reference/android/arch/lifecycle/MutableLiveData

你要做的就是

代码语言:javascript
复制
private val _likes: MutableLiveData<Int> = MutableLiveData()
val likes : LiveData<Int>
get() = _likes

上面我们说过,现在我可以改变LiveData,但是您想提供什么价值,因为您必须这样做

代码语言:javascript
复制
fun changeValue(newValue: Int) {
_likes.value = newValue
}

在你的活动中

代码语言:javascript
复制
vm.likes.observe(this, Observer{
//ui
}

然后任意设置你想要的值

代码语言:javascript
复制
vm.changeValue(1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60389437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档