【问题标题】:jetpack compose stateflow not refreshing listjetpack compose stateflow 不刷新列表
【发布时间】:2021-12-28 16:01:53
【问题描述】:

在我的项目中,我有两个片段。

一个是normal fragment,另一个是bottomSheetDialogFragment

在我的normal fragment 中,我有一个lazyColumn。

我想在 bottomSheetDialogFragment 中做一些设置并创建一个新的Hiit 对象并将其放入我的viewmodel 中的hiitItems 列表中。

问题在于因为我的normal fragmentbottomSheetDialogFragment部分覆盖,所以当我的列表更改时,jetpack compose 不会重新组合。 p>

所以我决定转向stateFlow,因为它总是在触发,我认为这可能会导致重组。但不幸的是,它没有。

以下是我的代码:

// in my viewmodel
// using stateflow to hold the list of hiitItems 
    private var _hiitItems = MutableStateFlow(mutableListOf(HiitItem()))
    val hiitItems = _hiitItems

在我的normal fragment 中,我正在使用 composeView 来利用jetpack compose

 setContent {

// get hiitItems
val hiitItems by vm.hiitItems.collectAsState()
...

 // lazyColumn
LazyColumn(modifier = Modifier.fillMaxSize()) {
    items(hiitItems) // I'm assuming auto refreshing the list here
    {
     ItemCard(item = it) // ItemCard is just an ordinary composable
    }
 }
}

在我的bottomSheetDialogFragment中,我有一个按钮,它的作用是将新创建的hiitItem添加到我的hiitItems列表中,并引起重组:

 hiitItems.add(newItem)

知道为什么在我关闭bottomSheetDialogFragment 后hiitItems 列表中的更改不会导致重新组合吗?

【问题讨论】:

  • 我因为这种奇怪的行为被困了两天。我的两个片段使用相同的视图模型。我还尝试了 mutableStateOf(listOf()) 方法。假设我在每个片段上分别放置两个lazyColunns,那么底部的SheetFragment 将在自动重组后正确显示我的lazyColumn,但我部分覆盖的片段不会。当它不再被覆盖时,它也不会显示任何内容,即使这两个片段在我的视图模型中使用对列表的相同引用。

标签: android-jetpack-compose kotlin-stateflow


【解决方案1】:

您的 mutableStateFlow 未触发,因为您正在更改列表。不要将项目添加到列表(对其进行变异),而是使用新项目创建一个新列表并使用它更新您的流程。

private var _hiitItems = MutableStateFlow(emptyList<HittItem>())

以后

_hiitItems.value = _hiitItems.value + newItem

【讨论】:

    【解决方案2】:

    已解决!原来这个问题与我的MutableStateFlow无关。

    viewModel 范围导致失败。

    具体来说,我的normal fragmentbottomSheetDialogFragment 各有一个不同的viewModel scope。因此,尽管它们确实引用了相同的视图模型,但 normal fragment 未能观察到由 bottomSheetDialogFragment 引起的变化,这就是为什么重组从未触发的原因。

    对于那些可能遇到与我类似的问题的人,您可以查看this answerthis article 进行详细说明!

    要点是确保您始终通过

    获取共享视图模型
    val sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
    

    在您希望共享相同视图模型范围的不同片段中。

    【讨论】:

      猜你喜欢
      • 2023-02-26
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2022-12-22
      相关资源
      最近更新 更多