【问题标题】:LiveData.value returns Null But Livedata Direct Observe it getting resultLiveData.value 返回 Null 但 Livedata 直接观察它得到结果
【发布时间】:2021-10-19 08:32:22
【问题描述】:

View Image Here

当我想将实时数据设置为可变实时数据时,我调用 live data.getvalue() 但它返回 null

private const val TAG = "MainViewModel"

@HiltViewModel 类 MainViewModel @Inject 构造函数(私有 val 存储库:VaultRepository):ViewModel() { 私有 var dashMutableData = MutableLiveData() var dashLiveData: LiveData = dashMutableData

init {
    Log.d(TAG, " Init Executed ")
    viewModelScope.launch(Dispatchers.Default) {
        var liveData: LiveData<List<CategoriesModel>> = repository.getDashBoardData()
        Log.d(TAG, "${liveData.value}")
        dashMutableData.postValue(liveData.value)
    }
}

}

【问题讨论】:

  • 您能在观察 LiveData 的位置显示 Activity/Fragment 的代码和 MainViewModel 的代码吗?
  • viewModel.dashLiveData.observe(this, Observer{ it?.let { Log.d(TAG, "LiveData: ${it.toString()}") } })
  • 请不要使用图片来展示您的代码。使用代码 sn-p 或使用降价来显示您的代码。它使其他人更容易调试您的代码,并使您的问题更容易回答。
  • 我会给你任何办公桌 ID,兄弟你能帮帮我吗

标签: android kotlin viewmodel android-livedata mutablelivedata


【解决方案1】:

如果您不打算观察它,为什么要从您的存储库中返回 LiveData?您可以从您的存储库中返回 List&lt;CategoriesModel&gt;

LiveData 没有值,除非它有观察者。如果你添加一个观察者,一旦观察者触发一次,它就会得到一个值。

您不应该这样做,而只是为了证明这一点,如果您在访问值之前添加观察者,它应该可以工作:

init {
    Log.d(TAG, " Init Executed ")
    viewModelScope.launch(Dispatchers.Default) {
        var liveData: LiveData<List<CategoriesModel>> = repository.getDashBoardData()
        livedata.observeForever(object: Observer<T> {
            override fun onChanged(value: T) {
                removeObserver(this)
            }
        })
        delay(100) //not sure this is needed, just making sure the observer triggered once.
        dashMutableData.postValue(liveData.value)
        Log.d(TAG, "${liveData.value}")
    }
}

【讨论】:

  • 在 Viewmodel 中我们无法获取内容如何在 observeForever 中传递内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2023-03-26
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多