首页 > 解决方案 > 有没有办法将 Flow 传递给 Room DAO Query 方法?

问题描述

我正在一个 android 应用程序中实现 Room,我有一个用例,我收到一个带有当前用户 ID 的流,其功能类似于切换哪个登录的谷歌用户来查看服务。我想将该流传递给我的 DAO 中的 @Query 注释方法以获取用户小部件,以便如果当前选择的用户更改或存储的小部件列表发生更改,输出 Flow<List> 也会更改。

就像是

WidgetRepo.kt

val widgets: Flow<List<Widget>> = widgetDAO.getWidgetsByUser(currentUserID)

WidgetDao.kt

@Query("select * from widget where userID = :userID")
fun getWidgetsByUser(userID: Flow<Int>): Flow<List<Widget>>

标签: androidkotlinandroid-roomkotlin-coroutines

解决方案


我认为这不是一个好习惯。我宁愿在特定用例中执行以下逻辑,例如:

class GetWidgetsByUserUseCase(
    private val userRepo: UserRepository,
    private val widgetLocalSource: WidgetRepository
){

    suspend operator fun invoke() = userRepo.flatMapLatest { user ->
            widgetLocalSource.getWidgetsByUser(user.id)
        }

}

使用此实现,每次发出新用户时,widgetLocalSource.getWidgetsByUser()都会触发并取消先前的流程。

有关运算符的更多信息,请参阅flatMapLatest


推荐阅读