【问题标题】:observeAsState not working for list, in jetpack compose在jetpack compose中,observeAsState不适用于列表
【发布时间】:2021-08-10 12:14:03
【问题描述】:

我正在尝试在可组合项中显示对象列表。为此,我有一个带有以下列表变量的视图模型

var allProviders: LiveData<MutableList<ServiceProvider>> = MutableLiveData(mutableListOf())

另外,在视图模型初始化时,我正在调用一个 api 来填充上面的列表:-

private fun getAllMerchantList() {
    getAllMerchants(object: RetrofitCallback {
        override fun onData(data: Any?) {
            //some logic here
            allProviders.value?.addAll(allProvidersLocal)
            Log.i("TAG", "ServiceProviders inside: ${allProviders.value?.size}")
        }

        override fun onFailed(ex: String?) {
            Log.i("TAG", "onFailed: ${ex.toString()}")
        }
    })
}

并且,如上所述,在可组合中,例如:-

val viewModel: MainActivityViewModel = viewModel()
val allProviders by viewModel.allProviders.observeAsState()

但是,上面的代码不起作用。它总是以可组合的形式返回空列表。但是如果我通过 viewmodel 功能登录,我可以看到数据。我该如何纠正这个问题?

【问题讨论】:

    标签: observer-pattern android-jetpack-compose android-viewmodel


    【解决方案1】:

    在 Compose 中使用 mutableStateListOf 而不是 LiveData

    var allProviders by mutableStateListOf&lt;ServiceProvider&gt;()

    现在将其用作常规列表对象。它将触发重组。此外,尽可能在 Compose 中使用 MutableState 类型的对象,因为它们是为它构建的,反之亦然。

    【讨论】:

    • 我看到很多人在使用LiveData 时遇到过这个问题,尽管我自己从未遇到过这个问题。无论如何,我仍然更喜欢MutableState 而不是LiveData
    • 如何观察Activity或Fragment中的mutableState?
    【解决方案2】:

    你也可以使用

    val mutableStateFlod: MutableStateFlow<MutableList<ServiceProvider>> = MutableStateFlow(emptyList())
    

    而不是 LiveData 和所有

    collectAsState
    

    【讨论】:

      猜你喜欢
      • 2022-10-19
      • 2021-06-08
      • 2022-11-10
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多