问题很简单。我该怎么做,或者更好地说,我如何解决在 Jetpack Compose 中对用户输入调用异步函数的问题??
我的代码:
@Composable
fun board = Row() {
var gameboard: MutableState<Array<IntArray>> = mutableStateOf(/* some value here */)
Column(Modifier.onKeyEvent(myOnKeyPressedFunction(gameboard)){
/* some stuff here */
}
}
private fun myOnKeyPressedFunction(gameboard: MutableState<Array<IntArray>>): (KeyEvent) -> Boolean = {
when (it.key) {
Key.directionUp -> {
val res: Boolean = asyncMethodUpdatingGameboard(gameboard)
res //so the gameboard should be updated by the time it gets here and
//return true and then see the changes
}
else -> false
}
}
private fun asyncMethodUpdatingGameboard(gameboard: MutableState<Array<IntArray>>) {
val res: Boolean = /* perform some async calls here */
res
}
问题是我不能使用 withContext 或 async/await,因为 onKeyEvent 没有挂起功能。 如果我使用 CoroutineScope.launch 调用异步任务,布尔值会在异步任务完成之前返回,因此面板不会重新渲染。
有什么想法吗?我应该尝试不同的架构吗?或者不同的修饰符?
我不认为你可以在没有一些
Effect
或CoroutineScope.launch
的情况下使用延迟功能,我能够实现同样的事情但不同的是在更新gameboard
可变后重新渲染组成桌面项目状态。
@Composable
fun Board() {
val gameboard: MutableState<Array<IntArray>> = mutableStateOf(arrayOf(intArrayOf(1,2)))
val scope = rememberCoroutineScope()
Row {
Column {
Text("Value is ${gameboard.value}")
}
TextField("", {}, modifier = Modifier.onKeyEvent {
when (it.key) {
Key.DirectionUp -> {
scope.launch{
asyncMethodUpdatingGameboard(gameboard)
}
true
}
else -> false
}
})
}
}
private suspend fun asyncMethodUpdatingGameboard(gameboard: MutableState<Array<IntArray>>) : Boolean {
delay(1000)
gameboard.value = arrayOf(intArrayOf(1,2,3))
return false
}
onKeyEvent
;我能够在普通的 TextField 上获得事件asyncMethodUpdatingGameboard
中的那个游戏板,在用suspend
关键字暂停它之后;如您所见,我使用了 1 秒的延迟。我希望你可以使用示例代码在你的代码中尝试这个想法。