有什么方法可以将 Flow 传递给 Room DAO 查询方法吗?

Is there any way to pass a Flow into a Room DAO Query method?

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

类似

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>>

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

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

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

}

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

有关运算符的详细信息,请参阅 flatMapLatest

Room Database 之前已经支持 Flow。将此添加到 gradle:

 // Kotlin Extensions and Coroutines support for Room - latest Room version 2.3.0
 implementation("androidx.room:room-ktx:$room_version")

在此处查看更多内容Write observable queries with Room