You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:10:23