jetpack 撰写stateflow不刷新列表

Fev*_*ver 3 android-jetpack-compose kotlin-stateflow

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

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

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

我想在 BottomSheetDialogFragment 中进行一些设置并创建一个新Hiit对象并将其放入hiitItems我的viewmodel.

问题是,由于我的部分被 覆盖normal fragment,当我的列表更改时,jetpack compose 将不会重新组合。bottomSheetDialogFragment

所以我决定转向考虑stateFlow到它总是在触发,并且我认为这可能会导致重组。但不幸的是,事实并非如此。

下面是我的代码:

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

在我的中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
    }
 }
}
Run Code Online (Sandbox Code Playgroud)

在 my 中bottomSheetDialogFragment,我有一个按钮,其功能是将新创建的 hiitItem 添加到我的hiitItems列表中,并导致重组:

 hiitItems.add(newItem)
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*esc 7

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

private var _hiitItems = MutableStateFlow(emptyList<HittItem>())
Run Code Online (Sandbox Code Playgroud)

然后

_hiitItems.value = _hiitItems.value + newItem
Run Code Online (Sandbox Code Playgroud)