【问题标题】:Android ViewModel do not load data the first time it is calledAndroid ViewModel 在第一次调用时不加载数据
【发布时间】:2020-05-14 06:53:13
【问题描述】:

我正在使用 ViewModel 来获取设置片段所需的数据。当我调用 get viewModel.getItems().observer{} 时,它总是返回一个空列表,除非我更改设备方向或暂停并恢复片段。

class OnSaleListFragmentViewModel : ViewModel() {
    private val items : MutableLiveData<List<Item>> by lazy {
        MutableLiveData<List<Item>>().also {
            loadItems()
        }
    }

    private fun loadItems() {
        viewModelScope.launch {
            getDataFromDAO()
        }
    }


    fun getItems() : LiveData<List<Item>> {
        return items
    }


    private suspend fun getDataFromDAO()  = withContext(Dispatchers.IO) {
        val dao : DAO = DAO.instance

        val data = async { dao.getItems() }

        try {
           items.postValue(data.await())
        } catch (e : Exception)  {
           items.postValue(listOf())
        }
}

【问题讨论】:

  • 你确定你没有进入异常分支吗?
  • 是的,没有引发异常
  • 由于某些原因 items.value 第一次被调用时为空
  • 这是有道理的,它是在后台线程上读取的。使用.observe
  • 在片段中我这样做: viewmodel = ViewModelProvider(this).get(myFragment::class.java) viewmodel.getItems().observe(viewLifecycleOwner, Observer { myAdapter.reload(它)})

标签: android kotlin viewmodel android-livedata


【解决方案1】:

尝试替换

private val items : MutableLiveData<List<Item>> by lazy {
    MutableLiveData<List<Item>>().also {
        loadItems()
    }
}

private val items = MutableLiveData<List<Item>>()

并从其他地方致电loadItems()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2021-12-28
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多