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不会导致重新组合吗?
您的 mutableStateFlow 不会触发,因为您正在改变列表。不要将项目添加到列表中(对其进行更改),而是使用新项目创建一个新列表并用它更新您的流程。
private var _hiitItems = MutableStateFlow(emptyList<HittItem>())
Run Code Online (Sandbox Code Playgroud)
然后
_hiitItems.value = _hiitItems.value + newItem
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3585 次 |
| 最近记录: |