LazyVerticalGrid重组后高亮错误项问题求助
问题描述
我实现了一个包含Button的LazyVerticalGrid,代码如下:
@Composable private fun Grid( items: List<ChoiceSelectorItem>, modifier: Modifier = Modifier, notifyEvent: (MyUIEvent) -> Unit ) { LazyVerticalGrid( modifier = modifier ) { items.forEach { item -> item { Button(onClick = { notifyEvent( MyUIEvent.OnItemClicked( item = item, ) ) }) { Text(text = item.name) } } } } }
每次点击项时,触发OnItemClicked事件更新UI状态,Grid会接收新的items列表并显示新的项集合(数量可能为2或5)。
问题:点击Button后会启动涟漪效果,但重组会立即触发,Grid在涟漪动画结束前就显示新列表。比如点击某一项后涟漪动画开始,列表从1行变为3行,动画后半段会显示在用户点击位置之外的项上。
请问是否可以延迟重组直到Button的涟漪动画结束?或者有其他解决办法?
解决办法
延迟状态更新,等待涟漪动画结束
涟漪动画的默认时长约300ms,可在点击事件中先等待动画完成,再触发状态更新。修改Button的点击逻辑:Button(onClick = { CoroutineScope(Dispatchers.Main).launch { delay(300) // 匹配涟漪动画时长 notifyEvent(MyUIEvent.OnItemClicked(item = item)) } }) { Text(text = item.name) }若需要更精准的监听,可通过
LocalIndication获取涟漪动画状态并监听完成事件,但固定时长延迟已能覆盖多数场景。将涟漪效果与Grid布局解耦
给Button添加固定大小的父容器,让涟漪在固定区域内展示,即使Grid重组布局变化,涟漪也不会错位(适用于Grid项大小固定的场景):item { Box(modifier = Modifier.size(80.dp), contentAlignment = Alignment.Center) { Button( onClick = { notifyEvent(MyUIEvent.OnItemClicked(item = item)) }, modifier = Modifier.fillMaxSize() ) { Text(text = item.name) } } }禁用Grid重组时的项动画
若不需要Grid项的入场/退场动画,可给LazyVerticalGrid添加itemContentTransform参数,禁用默认重组动画以减少视觉冲突:LazyVerticalGrid( modifier = modifier, itemContentTransform = remember { SlideInOutItemContentTransform( slideInSpec = { _ -> tween(0) }, slideOutSpec = { _ -> tween(0) } ) } ) { // 原有项渲染逻辑 }
内容的提问来源于stack exchange,提问作者Rainmaker
相关产品推荐
相关产品推荐

