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

Android Compose修改一个remember状态为何意外影响另一个remember状态

异常出现的核心原因

1. 循环渲染无唯一key导致组件实例被销毁重建

你在WalletDetailsView中遍历subWallets生成SubWalletView时,没有为每个子组件指定唯一key。Compose 重组时默认按位置匹配组件实例,当你修改domainsVisible触发父组件重组时,如果你用这个参数控制了域名列表的显示/隐藏(代码中未贴出这部分逻辑),会导致Column的组件树结构变化,SubWalletView的位置索引发生偏移,Compose 会错误销毁旧的SubWalletView实例,创建新的实例。新实例中的copyToClipboardClicked会被初始化为默认值false,表现出来就是状态被意外修改。

2. 硬编码的remember key无法区分多实例

你给copyToClipboardClicked设置的key是固定字符串"copy_btn",如果存在多个SubWalletView实例,所有实例的状态key完全相同,一旦组件位置发生变化,不同子钱包的状态会出现错位。

3. 参数不稳定导致不必要的全量重组

如果SubWallet类没有添加@Stable注解,且每次重组时都会生成新的实例,会触发SubWalletView全量重组,状态留存逻辑失效。


修复方案

  1. 为循环渲染的SubWalletView添加唯一key,用子钱包的唯一标识作为key参数:
wallet.subWallets.forEach { subWallet ->
    key(subWallet.id) { // 替换为你子钱包的唯一ID字段
        SubWalletView(snackbarController = snackbarController, subWallet = subWallet)
    }
}
  1. 修改SubWalletView中状态的key,加入子钱包唯一标识区分不同实例:
val copyToClipboardClicked = rememberMutableStateOf(
    key = "copy_btn_${subWallet.id}", 
    value = false
)
  1. 如果需要状态在组件被临时移出组件树时不丢失,可以将remember替换为rememberSaveable。

内容的提问来源于stack exchange,提问作者Alex Zaitsev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 01:51:01