为什么 Kotlin 可组合项仅在 for 循环结束后才更新?

Why does Kotlin composable only update after for loop is over?

我正在尝试在循环内使用 mutableState 更新可组合项,但它仅在循环结束后更新为最后一个值:

在Main.kt

@Composable
fun App() {
    var myClass = remember { MyClass() }
    MaterialTheme {
        Column() {
            Text(text="${myClass.myInt.value}")
            Button(onClick = myClass::run){ Text(text = "RUN") }
        }
    }
}

哪里

class MyClass {
    val myInt = mutableStateOf(0)
    fun run(){
        for (i in 0..10){
            myInt.value = i
            Thread.sleep(500)
        }
    }
}

我错过了什么? (我正在使用 Compose Desktop)

Thread.sleep() 在给定的时间内暂停线程的执行。由于您是在 UI 线程上调用它,因此它会暂停整个应用程序中任何视图的所有呈现和更新,直到它完成,因此在整个循环完成之前您永远不会看到任何更改。由于它会冻结 UI,因此会使您的应用面临因无响应(ANR 错误)而被关闭的风险。

您可以使用协程和 delay() 来完成此操作,但您需要将其设为挂起函数。如果下面有任何错误,我深表歉意,因为我没有任何 Compose 经验。

class MyClass {
    val myInt = mutableStateOf(0)
    suspend fun run(){
        for (i in 0..10){
            myInt.value = i
            delay(500)
        }
    }
}

// Main.kt:
@Composable
fun App() {
    var myClass = remember { MyClass() }
    val scope = rememberCoroutineScope()
    MaterialTheme {
        Column() {
            Text(text="${myClass.myInt.value}")
            Button(onClick = { scope.launch { myClass.run() }) { 
                Text(text = "RUN") 
            }
        }
    }
}