【发布时间】:2021-12-28 16:01:53
【问题描述】:
在我的项目中,我有两个片段。
一个是normal fragment,另一个是bottomSheetDialogFragment。
在我的normal fragment 中,我有一个lazyColumn。
我想在 bottomSheetDialogFragment 中做一些设置并创建一个新的Hiit 对象并将其放入我的viewmodel 中的hiitItems 列表中。
问题在于因为我的normal fragment 被bottomSheetDialogFragment部分覆盖,所以当我的列表更改时,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