为什么我的懒惰列的重构触发器不会



我有一个LazyColumn,它有多个列表,应该根据index值显示这些列表。然而,当我更改index时,列表会更改,但直到我向下滚动并向上滚动,项目才会被重新绘制。我已经反复使用记住关键字,更改了N次逻辑,但它仍然不会更新。这是我的课程

@Composable
fun MainContent() {
val state = homeViewModel.state.collectAsState(initial = HomepageState.Loading)
Theme(config = config) {
when (state.value) {
is HomepageState.Loading -> Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) { CircularProgressIndicator() }
is HomepageState.Multi -> with(state.value as HomepageState.Multi) {
updateHomepageImagePreference(index)
LazyColumnContent(homepage = items, switcher, logo, index)
}
}
}
}

主页[索引]部分是我想触发重组的部分。我试图传递正确的列表,而不是更改索引,但结果是相同的

@Composable
private fun LazyColumnContent(
homepage: List<List<ModuleConfig>>,
switcher: HomepageSwitcherTheme?,
logo: HomepageThemeNavLogo?,
index: Int = 0
) {
LaunchedEffect(key1 = index) {
updateHomepageSwitcher(switcher)
updateNavigationBarLogo(logo)
}
return LazyColumn(
modifier = Modifier
.fillMaxSize()
.background(vennConfig.themeConfig.backgroundColor?.color)
) {
itemsIndexed(homepage[index]) { _, item ->
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = {
val productsInCategoryCriteriaSatisfied =
if (item.requiresProductsInCategoryId.isNullOrEmpty()) true
else categoryHasProducts[item.requiresProductsInCategoryId] ?: true
return@AndroidView if (productsInCategoryCriteriaSatisfied) moduleFactory.build(
item,
requireContext()
)
else View(context) // blank view
}
)
}
}
}

我猜我的Compose用法有问题,但我不知道是什么。

AndroidViewfactory只有在视图出现时才会被调用。如果需要在同一视图上更新item,可以使用update。此外,当您没有任何内容显示时,您不需要创建空视图,只需按需创建AndroidView即可:

val productsInCategoryCriteriaSatisfied =
if (item.requiresProductsInCategoryId.isNullOrEmpty()) true
else categoryHasProducts[item.requiresProductsInCategoryId] ?: true
if (productsInCategoryCriteriaSatisfied) {
AndroidView(
modifier = Modifier.fillMaxSize(),
factory = { context ->
moduleFactory.build(
item,
context
)
},
update = {
it.item = item
},
)
}

另一个问题是,您可能已经更改了项目顺序。

解决这个问题最干净的方法是使用key参数:默认情况下,它是相等的项索引。

完美地,您的物品有一个id,但您也可以根据任何其他物品属性构建key。当key自上次重新组合后不相同时,将重新创建AndroidView。p.s.当您不需要索引时,可以使用items而不是itemsIndexed:

LazyColumn {
items(list, key = { it.id }) { item ->
}
}

相关内容

  • 没有找到相关文章

最新更新