0

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

一个是a normal fragment,另一个是a bottomSheetDialogFragment

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

我想在 bottomSheetDialogFragment 中进行一些设置并创建一个新Hiit对象并将其放入我hiitItemsviewmodel.

问题是,由于 mynormal fragment部分被 覆盖,所以bottomSheetDialogFragment当我的列表更改时,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 后列表中的更改不会导致重新组合吗?

4

2 回答 2

3

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

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

然后

_hiitItems.value = _hiitItems.value + newItem
于 2021-12-28T17:07:14.737 回答
0

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

导致失败的是viewModel 范围。

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

对于那些可能遇到与我类似的问题的人,您可以查看此答案本文以进行详细说明!

要点是确保您始终通过以下方式获取共享视图模型

val sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)

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

于 2022-01-01T02:44:35.663 回答