android - `remember` 是否仅适用于 `MutableState` 变量?

标签 android android-jetpack-compose

当我发现这种非常奇怪的行为时,我刚刚对我的一个可组合项进行了一些测试。

这段代码:-

{ //Composable-Scope
 var fired = remember { false }
 if(!fired) { Fire(); fired = true }
}

在每次重组时调用方法Fire()

然而,另一方面,

{ //Composable Scope
 var fired by remember { mutableStateOf(false) }
 if(!fired) { Fire(); fired = true }
}

仅在第一个组合上调用Fire()

如果这是预期的行为,是否有一个很好的解释为什么 remember 没有变得通用?如果这不是预期的行为,我可能只会提交一个错误。

最佳答案

这是预期的行为。

remember 的第一个组合值期间,计算并缓存 lambda。在每次重新组合时,调用 remember { ... } 将返回缓存的值。

在第一个代码块中,您将创建一个变量,该变量在每次重组时都会获得相同的初始值。您可以在组合代码期间修改它,但在重新组合时它将被重置,就像您根本没有使用 remember 一样。

对于可变状态,remember 会做同样的事情:它会记住 lambda 的内容。但在本例中,结果是一个包装类实例。该实例在重组之间是相同的,但您可以修改该对象的 value 属性,这就是它在重组中存在的原因。

关于android - `remember` 是否仅适用于 `MutableState` 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69867249/

相关文章:

android - 无法打开句柄来诊断驱动程序,错误 = 13,为什么?

java - 从 asynctask 获取结果并处理它

javascript - webview的onDownloadStart参数没有设置?如何检索文件名?

android - 如何在 Jetpack Compose 中为按钮的宽度设置动画

java - 如何从 JSONObject 填充字符串数组以在 ListView 中使用

android - 2 条重叠线上的二维线反射

android - 在 Jetpack Compose 中重置可拖动项目的偏移动画

android - 如何在 Jetpack Compose 中按基线对齐行元素

android - 防止 LaunchedEffect 在配置更改时重新运行

android - Jetpack Compose 1.0.0-alpha11如何手动导入扩展函数?