使用 Jetpack Compose 从 Room 数据库返回值

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

您好,感谢您考虑我的问题!我正在尝试查询数据库的总和并使用 Jetpack Compose UI 显示总计。

我的 DAO 看起来像这样:

@Dao
interface FindDao {


    @Query("SELECT SUM(findAmount) FROM finds")
    suspend fun getFindTotal(): Double

}

我的存储库如下所示:


class FindRepository (private val findDao: FindDao) {

 private val coroutineScope = CoroutineScope(Dispatchers.Main)


suspend fun getFindTotal():Double {
        return findDao.getFindTotal()

    }

    }

我的视图模型如下所示:

class MainViewModel(application: Application): ViewModel() {

suspend fun getFindTotal(): Double {
        return repository.getFindTotal()
    }


}

最后我的用户界面如下所示:

@Composable
fun BottomBar(viewModel: MainViewModel) {
    val scope_Find_Total = rememberCoroutineScope()
    var retrievedFindTotal by remember { mutableStateOf<Double?>(null) }

    scope_Find_Total.launch {
        retrievedFindTotal = viewModel.getFindTotal()
    }


   Text("Find Total = $retrievedFindTotal")
}

所以,这段代码可以工作,但我认为我做错了,我收到一条警告“启动调用应该发生在 LaunchedEffect 内部,而不是组合内部”。此外,我想也许我不应该从我的用户界面启动协同例程?不确定我是否正确处理这件事?

sqlite kotlin android-jetpack-compose android-room kotlin-coroutines
1个回答
0
投票

警告实际上给出了相当好的提示。尝试将您的代码更改为

@Composable
fun BottomBar(viewModel: MainViewModel) {
    val scope_Find_Total = rememberCoroutineScope()
    var retrievedFindTotal by remember { mutableStateOf<Double?>(null) }

    LaunchedEffect(Unit) {
        retrievedFindTotal = viewModel.getFindTotal()
    }

    Text("Find Total = $retrievedFindTotal")
} 
© www.soinside.com 2019 - 2024. All rights reserved.