当我发现这种非常奇怪的行为时,我刚刚对我的一个可组合项进行了一些测试。
这段代码:-
{ //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/