首页 > 解决方案 > 在 ViewModel 中使用 LiveData 属性值

问题描述

我正在努力寻找一种更好、更优雅的方法来解决这个在我的项目中经常发生的特定案例。

在我的 ViewModel 上,假设我有这个实时数据属性:

val limitDate = MutableLiveData<String>()

并且该变量是由意图或存储库获取设置的,没关系,我将表示就像存储库获取:

fun fetchDate() {
        useCase.fetchLimitDate.collect { limitDate ->
             limitDate.postValue(limitDate)
        }
}

然后,在我将这个日期设置为在视图上观察之后,我需要使用这个值来计算另一个函数中的其他内容。如果我尝试使用相同的 liveData 属性值,此代码最终不会被调用,因为它运行速度太快

  private fun calculateSomethingWithDate() {
    limitDate.value?.let{ date ->
         //Any logic here 
          repository.saveLimitDate(date)
      }
}

如果我添加一个delay(100)它可以工作,但肯定不会这样做,所以我最终拥有另一个保存 liveData 值的属性,并将其设置在第一个函数上,如下所示:

val limitDate = MutableLiveData<String>()
var limitDateValue : String



fun fetchDate() {
   useCase.fetchLimitDate.collect { limitDate ->
     limitDate.postValue(limitDate) //To be observed on view 
     limitDateValue = limitDate
     }
}

private fun calculateSomethingWithDate() {
    repository.saveLimitDate(limitDateValue)
      
}

那么,关于如何使它变得更好的任何建议?

标签: androidandroid-livedataandroid-viewmodelmutablelivedata

解决方案


用于Transformations.map()创建随目标更新的自定义输出(只读) ,请参阅此处MutableLiveData的文档。

val limitDate = MutableLiveData<String>()

val anotherLiveDataProperty = Transformations.map(limitDate) { date ->
    //Any logic here
}
  • Transformations.map()返回 a LiveData,您可以观察它。

推荐阅读