代码A是基于文章的。
我被告知,如果函数写入局部变量,这段代码将不是线程安全的或正确的,我将得到错误的结果。
他说:我用代码A测试它,但我总是得到正确的结果,为什么?
2: B码正确吗?
码A
@Composable
fun ListWithBug(myList: List<String>) {
var items = 0
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Column {
for (item in myList) {
Text("Item: $item")
items++ // Avoid! Side-effect of the column recomposing.
}
}
Text("Count: $items")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApp {
ListWithBug(mutableListOf("a","b","c","d","e","f","g","h","k","j"))
}
}
}
}码B
@Composable
fun ListWithBug(myList: List<String>) {
var items by remember { mutableStateOf(0) }
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Column {
for (item in myList) {
Text("Item: $item")
items++ // Avoid! Side-effect of the column recomposing.
}
}
Text("Count: $items")
}
}发布于 2021-10-06 09:34:59
在实际情况下,它将不像预期的那样工作。它可能对您有用,因为您正在隔离地测试它。每当可组合重新组合时,它将重新初始化在其中声明的所有变量。因此,如果s=triggers是可组合变量的重新组合,它将将items变量重新初始化为0.我说它不会在实际应用程序中工作,因为在那个地方,有一个用户正在与之交互的可组合性池。按下按钮可能会导致多个重新组合,因此在本地可组合的情况下维护此状态是不安全的。
第二种方法可能很好,但根本不推荐,因为它会导致其他可组合性之间的状态不一致,因为理想情况下,您应该将所有UI状态存储在viewmodel中。它是真理的单一来源,所有的合成材料都可以从一个地方这样解读状态。
您可以学习状态提升,以便使用与撰写一致的视图模型。只要看看这码标。
也许是专门的这页面,但肯定会给出一个整体的代码。
https://stackoverflow.com/questions/69463101
复制相似问题