首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android组合记忆影响其他记忆更改

Android组合记忆影响其他记忆更改
EN

Stack Overflow用户
提问于 2021-07-29 16:18:36
回答 1查看 674关注 0票数 0

我有下一个等级:

  • WalletDetailsScreen
    • WalletDetailsView
      • SubWalletView
      • DefaultOutlinedButton

1 domainsVisible是在WalletDetailsScreen中声明的。回调被传播到DefaultOutlinedButton的onClick。

2 copyToClipboardClicked是在SubWalletView中声明的。

发生了什么:

  1. 用户打开屏幕。
  2. 用户首先点击“复制”按钮(SubWalletView)。(2 remember)
  3. User按DefaultOutlinedButton。第一次记忆更改为WELL!

,第二次更改为

代码:

代码语言:javascript
复制
@Composable
fun WalletDetailsScreen(
    snackbarController: SnackbarController,
    wallet: Wallet,
    onNavIconClicked: () -> Unit
) {
    // CHANGING THIS REMEMBER CHANGES 2ND ONE (BUT ONLY IF 2ND WAS FIRED AT LEAST ONCE)
    val domainsVisible = rememberMutableStateOf(key = "domains_visible_btn", value = false)

        WalletDetailsView(
            snackbarController = snackbarController,
            wallet = wallet,
            domainsVisible = domainsVisible.value,
            domainsCount = 0
        ) {
            domainsVisible.toggle()
        }
}

@Composable
private fun WalletDetailsView(
    snackbarController: SnackbarController,
    wallet: Wallet,
    domainsVisible: Boolean,
    domainsCount: Int,
    onDomainsVisibilityClicked: () -> Unit
) {
        Column {
            wallet.subWallets.forEach { subWallet ->
                SubWalletView(snackbarController = snackbarController, subWallet = subWallet)
            }
            
            // 1st REMEMBER IS CHANGED HERE 
            DefaultOutlinedButton(text = text, onClick = onDomainsVisibilityClicked) 
        }
}

@Composable
private fun SubWalletView(
    snackbarController: SnackbarController,
    subWallet: SubWallet
) {
    // 2ND REMEMBER
    val copyToClipboardClicked = rememberMutableStateOf(key = "copy_btn", value = false)
    if (copyToClipboardClicked.value) {
        CopyToClipboard(text = subWallet.address)
    }

            // 2ND REMEMBER IS CHANGED HERE
            Box(
                modifier = Modifier
                    .clickable { copyToClipboardClicked.toggle() } 
                    .padding(start = 15.dp, top = 5.dp, bottom = 5.dp, end = 5.dp)
            ) {
                // just icon here
            }
}

帮手:

代码语言:javascript
复制
@Composable
fun <T> rememberMutableStateOf(
    key: String,
    value: T,
    policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy()
) = remember(key) { mutableStateOf(value, policy) }

fun MutableState<Boolean>.toggle() {
    value = !value
}

我试过加钥匙来记住,但没什么用。为什么改变一个记忆会影响另一个记忆呢?这不应该发生的。

EN

回答 1

Stack Overflow用户

发布于 2021-07-30 03:40:38

最后,我弄明白了到底是怎么回事。

第二,remember实际上并没有改变。

但我依靠它来展示枷锁:

代码语言:javascript
复制
    if (copyToClipboardClicked.value) {
        CopyToClipboard(text = subWallet.address)
        ShowSnackbar(...)
        copyToClipboardClicked.toggle() // <--- WE NEED THIS
    }

遗漏的部分是我需要关掉旗子。我没有这么做,这就是为什么在每一次重组时都会触发if。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68579566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档