从 RoomDB 获取值到 Jetpack Compose 的 Composable 函数中

问题描述 投票:0回答:1

我已经寻找了很多解决方案,但我发现它作为一个新手非常 复杂的是如何正确解决它而不扔掉我所有的后端 代码。

我想将 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 )
        }
    }
}

kotlin get android-room return-value kotlin-coroutines
1个回答
0
投票

我也是 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
    }
}

希望这对你有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.