我已经寻找了很多解决方案,但我发现它作为一个新手非常 复杂的是如何正确解决它而不扔掉我所有的后端 代码。
我想将 RoomDB 中的 Float 值转换为可组合项 UI 值,但据我们所知,通过查询获取 RoomDB 值 需要一个异步作用域。那些不能返回值 因为价值观停留在一个范围内,也会消亡在那里。有我认为 没有办法不使用 Coroutine Scopes 或任何其他不阻止 UI 加载的东西 所以它确实可以工作。
我能做什么?我不想扔掉整个 RoomDB 数据库 我们的 Jetpack Compose 基本 GUI 都不是吗?
我尝试用调用协程作用域的方法替换 0.8f 理想情况下,我们的代码的这一部分应该返回一个 Float 值。
@Composable
fun ChargeScreen(){
val context = LocalContext.current
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.fillMaxSize()
){
Column {
ChargeTopText()
CircularChargeBar(percentage = 0.8f, number =100 )
}
}
}
我也是 Android Jetpack Compose 的新手,但我可以为您的案例提供建议。
看下面的代码
@Composable
fun YourComposable() {
//Use remember for state management
//Read more at https://developer.android.com/jetpack/compose/state
var floatData by remember { mutableStateOf(0F) }
var isLoading by remember { mutableStateOf(true) }
//Side-effects
//Read more at https://developer.android.com/jetpack/compose/side-effects
LaunchedEffect(Unit) {
isLoading = true
floatData = getFloatDataFromDB()
isLoading = false
}
//Just a way to show a progress indicator while we are getting the value from DB.
if(!isLoading) {
Text(text = "FloatData: $floatData")
} else {
CircularProgressIndicator(
modifier = Modifier.size(50.dp),
color = Color.Green,
strokeWidth = 5.dp)
}
}
suspend fun getFloatDataFromDB(): Float {
//Using withContext(Dispatchers.IO) so it will execute in IO Thread.
return withContext(Dispatchers.IO) {
//Pretend this will take 5 seconds to complete
Thread.sleep(5000)
//And return the value
return@withContext 0.9F
}
}
希望这对你有帮助!