【问题标题】:Jetpack Compose: "remember" inside if statement?Jetpack Compose:在 if 语句中“记住”?
【发布时间】:2021-08-11 06:31:26
【问题描述】:

如果您将 remember 语句放在某个条件分支中,Jetpack Compose 会做什么?

以如下代码为例:

@Composable
fun MyScreen(repository: Repository?) {
    if (repository != null) {
        val myState by remember(repository) { repository.myFlow }.collectAsState()
        /* ... */
    }
}

假设第一个合成有一些有效的repository 参数,但是我们有一个带有repository = null 的重新合成。然后不会调用remember 语句;记住的值会被清除吗? (否则这将是一个内存泄漏,不是吗?)

【问题讨论】:

    标签: android-jetpack-compose


    【解决方案1】:

    我认为它会丢失。我相信是这样,因为您作为参数传递给remember 的内容基本上是key,如果密钥发生变化,请记住将再次调用。但是,由于在您的情况下,当密钥更改时,即当存储库为空时,remember 块将不会被执行,所以它就像第一次创建可组合项一样。什么都不记得了,也没有数据因为没有执行而被存储

    这是您的确认:

    一些参考,

    【讨论】:

    • 是的,有人可能会争辩说,由于 remember 本身就是一个 Composable,一旦它离开组合,它的所有状态都会丢失。我只是有点不确定,因为我认为文档中没有明确说明这一点(我觉得你的参考也不是很明确,是吗?)
    • 我指出了您的具体用例。您将变量作为键传递。这是肯定的,当变量从非空变为空时,值肯定会丢失。这将解释您在问题中提到的特定代码。如果您的问题更笼统,请考虑对其进行修改。谢谢!
    • 啊,新的参考更明确了。尽管如此,它并没有确切说明当称为“记住”的组合留在组合中但不再称为“记住”时会发生什么。但我现在确信存储的数据确实会被清除。
    • 我很高兴你是
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2023-02-21
    • 2022-08-19
    • 2016-02-07
    • 2022-11-26
    • 2020-03-13
    • 2018-05-06
    • 2022-09-29
    相关资源
    最近更新 更多