好的,我已经将 StateFlow 与 Room 数据库一起使用了一段时间。现在我有一个常见的案例。在我的应用程序开始时,我有一个逻辑,如果 ROOM 数据库为空,我应该显示一个 EmptyContent(),否则我将显示 ROOM 数据库中的 ListContent()。
现在每次我启动应用程序时,我总是让 EmptyContent() 显示半秒钟,然后显示 ListContent()。之后,当我使用该应用程序时,一切正常。但是在那个应用程序启动时,我猜在 ROOM 数据库工作时, EmptyContent() 只显示了一小段时间(因为我的 StateFlow 默认值是一个空列表),然后显示来自数据库的实际 LIST .
现在我有一个解决方案,只需在协程中使用 delay() 函数,等待例如 200MS,然后触发读取 DATABASE 的函数,因为这 200MS 足以让 ROOM 数据库实际获取值并更新我的使用实际数据的状态流变量,而不是在开始时使用状态流默认值半秒。
我必须问,这是一个好的解决方案吗?因为我使用的是协程,所以线程没有被阻塞,我只是在等待 ROOM 数据库第二次更新我的 STATE FLOW 变量。
@Composable
fun displayContent(
tasks: List<ToDoTask>,
ListContent: @Composable () -> Unit
) {
val scope = rememberCoroutineScope()
var counter by remember { mutableStateOf(0)}
LaunchedEffect(Unit){
scope.launch {
delay(200)
counter = 1
}
}
if(counter == 1){
if (tasks.isNotEmpty()) {
ListContent()
} else {
EmptyContent()
}
}
}