【问题标题】:How to create a non-nullable LiveData that can save state如何创建可以保存状态的不可为空的 LiveData
【发布时间】:2022-01-21 11:42:53
【问题描述】:

当我们有如下的 liveData 时,我们不能 _liveData.value++,因为 value 可以为空。

class MainViewModel(savedStateHandle: SavedStateHandle): ViewModel() {
    private val _liveData: MutableLiveData<Int> =
        savedStateHandle.getLiveData("SomeKey", 0)

    val liveData: LiveData<Int> = _liveData

    fun triggerLiveData() {
        _liveData.value++
    }
}

文章https://proandroiddev.com/improving-livedata-nullability-in-kotlin-45751a2bafb7提供了解决方案,即

@Suppress("UNCHECKED_CAST")
class SafeMutableLiveData<T>(value: T) : LiveData<T>(value) {

  override fun getValue(): T = super.getValue() as T
  public override fun setValue(value: T) = super.setValue(value)
  public override fun postValue(value: T) = super.postValue(value)
}

但这不支持 savedState。

我们怎样才能得到一个非空的 LiveData 也有已保存状态?

【问题讨论】:

    标签: android android-livedata viewmodel-savedstate


    【解决方案1】:

    我有一个复制数据但看起来不那么优雅的解决方案

    @Suppress("UNCHECKED_CAST")
    class SafeMutableLiveData<T: Any>(private val mutableLiveData: MutableLiveData<T>) :
        MutableLiveData<T>(mutableLiveData.value) {
    
        override fun getValue(): T = mutableLiveData.value as T
        override fun setValue(value: T) {
            super.setValue(value)
            mutableLiveData.value = value
        }
        override fun postValue(value: T) {
            super.postValue(value)
            mutableLiveData.postValue(value)
        }
    }
    

    用法如下

    class MainViewModel(savedStateHandle: SavedStateHandle): ViewModel() {
        private val _liveData: SafeMutableLiveData<Int> =
            SafeMutableLiveData(savedStateHandle.getLiveData("Something", 0))
    
        val liveData: LiveData<Int> = _liveData
    
        fun triggerLiveData() {
            _liveData.value++
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      相关资源
      最近更新 更多