jetpack compose stateflow 不刷新列表

jetpack compose stateflow not refreshing list

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

一个是normal fragment,另一个是bottomSheetDialogFragment

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

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

列表中

问题是因为我的normal fragmentbottomSheetDialogFragment部分覆盖,jetpack compose 赢了当我的列表更改时重新撰写。

所以我决定转向 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)

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

你的 mutableStateFlow 没有触发,因为你正在改变列表。不要将项目添加到列表(改变它),而是用新项目创建一个新列表并用它更新你的流程。

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

以后

_hiitItems.value = _hiitItems.value + newItem

已解决!原来这个问题与我的 MutableStateFlow.

无关

导致失败的是 viewModel 范围

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

可能和我有同样问题的朋友,可以查看 and this article详解!

要点是确保您始终通过

获取共享 viewModel
val sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)

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