jetpack compose stateflow 不刷新列表
jetpack compose stateflow not refreshing list
在我的项目中,我有两个片段。
一个是normal fragment
,另一个是bottomSheetDialogFragment
。
在我的 normal fragment
中,我有一个 lazyColumn。
我想在 bottomSheetDialogFragment 中做一些设置并创建一个新的 Hiit
对象并将其放入我的 viewmodel
.
列表中
问题是因为我的normal 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 后没有导致重新合成吗?
你的 mutableStateFlow 没有触发,因为你正在改变列表。不要将项目添加到列表(改变它),而是用新项目创建一个新列表并用它更新你的流程。
private var _hiitItems = MutableStateFlow(emptyList<HittItem>())
以后
_hiitItems.value = _hiitItems.value + newItem
已解决!原来这个问题与我的 MutableStateFlow
.
无关
导致失败的是 viewModel 范围。
具体来说,我的normal fragment
和bottomSheetDialogFragment
各有一个不同的viewModel scope
。因此,尽管它们确实引用了相同的视图模型,normal fragment
未能观察到由 bottomSheetDialogFragment
引起的变化,这就是重组从未触发的原因。
可能和我有同样问题的朋友,可以查看 and this article详解!
要点是确保您始终通过
获取共享 viewModel
val sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
在您想要共享相同视图模型范围的不同片段中。
在我的项目中,我有两个片段。
一个是normal fragment
,另一个是bottomSheetDialogFragment
。
在我的 normal fragment
中,我有一个 lazyColumn。
我想在 bottomSheetDialogFragment 中做一些设置并创建一个新的 Hiit
对象并将其放入我的 viewmodel
.
问题是因为我的normal 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 后没有导致重新合成吗?
你的 mutableStateFlow 没有触发,因为你正在改变列表。不要将项目添加到列表(改变它),而是用新项目创建一个新列表并用它更新你的流程。
private var _hiitItems = MutableStateFlow(emptyList<HittItem>())
以后
_hiitItems.value = _hiitItems.value + newItem
已解决!原来这个问题与我的 MutableStateFlow
.
导致失败的是 viewModel 范围。
具体来说,我的normal fragment
和bottomSheetDialogFragment
各有一个不同的viewModel scope
。因此,尽管它们确实引用了相同的视图模型,normal fragment
未能观察到由 bottomSheetDialogFragment
引起的变化,这就是重组从未触发的原因。
可能和我有同样问题的朋友,可以查看
要点是确保您始终通过
获取共享 viewModelval sharedViewModel = ViewModelProvider(requireActivity()).get(SharedViewModel::class.java)
在您想要共享相同视图模型范围的不同片段中。