Jetpack Compose重组竞态疑问:快速点击消失按钮会触发check失败吗?
关于Compose按钮快速点击导致check失败的可能性分析
先看这段实现“点击后消失”的按钮代码:
@Composable fun ButtonThatDisappearsOnClick() { var showButton by remember { mutableStateOf(true) } if (showButton) { Button(onClick = { check(showButton) { "onClick shouldn't be called for a hidden button" } // !!! showButton = false }) { Text("My button") } } }
你猜测用户快速点击两次按钮时,上面的check调用可能会失败,逻辑是:
- 用户首次点击按钮,
showButton被设为false,状态更新触发重组调度 - 视图完成重组前再次快速点击,
onClick会第二次触发,导致check校验失败
但实际上这种情况不可能发生,原因有两点:
- Compose的
Button内置了防重复点击机制,点击后按钮会进入短暂的不可点击状态(比如保持按压视觉反馈),直到当前点击事件处理完成或者重组结束,不会接收重复的点击请求。 - 当
showButton被设为false后,即便重组是异步调度的,Compose的状态系统会联动限制按钮的交互状态,在按钮真正被移除前,已经不会响应新的点击事件了。
你在实践中无法复现也印证了这一点,Compose框架底层已经处理了这类快速重复点击的场景,不会出现你担心的状态不一致问题。
内容的提问来源于stack exchange,提问作者Lev Leontev
相关产品推荐
相关产品推荐

