为什么 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")
}
}
}
}
我正在尝试在循环内使用 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")
}
}
}
}