nol*_*man 6 android kotlin kotlin-flow
我有以下方法:
operator fun invoke(query: String): Flow<MutableList<JobDomainModel>> = flow {
val jobDomainModelList = mutableListOf<JobDomainModel>()
jobListingRepository.searchJobs(sanitizeSearchQuery(query))
.collect { jobEntityList: List<JobEntity> ->
for (jobEntity in jobEntityList) {
categoriesRepository.getCategoryById(jobEntity.categoryId)
.collect { categoryEntity ->
if (categoryEntity.categoryId == jobEntity.categoryId) {
jobDomainModelList.add(jobEntity.toDomainModel(categoryEntity))
}
}
}
emit(jobDomainModelList)
}
}
Run Code Online (Sandbox Code Playgroud)
它在存储库中搜索,调用search返回Flow<List<JobEntity>>. 然后,对于流程中的每个JobEntity任务,我需要从数据库中获取该作业所属的类别。一旦有了该类别和作业,我就可以将该作业转换为域模型对象 ( JobDomainModel) 并将其添加到列表中,该列表将作为方法的返回对象在流中返回。
我遇到的问题是没有任何东西被发射。我不确定在 Kotlin 中处理流程时是否遗漏了某些内容,但我没有通过 ID ( categoriesRepository.getCategoryById(jobEntity.categoryId)) 获取类别,然后它就可以正常工作并发出列表。
预先非常感谢!
我认为问题在于您正在收集无限长度的流,因此collect永远不会返回。您应该.take(1)在收集之前使用 来获取有限流,或者使用first().
您的 DAO 返回的流是无限长度的。第一个值是第一个查询,但流程将永远继续,直到取消。Flow 中的每一项都是数据库内容更改时进行的新查询。
像这样的东西:
operator fun invoke(query: String): Flow<MutableList<JobDomainModel>> =
jobListingRepository.searchJobs(sanitizeSearchQuery(query))
.map { jobEntityList: List<JobEntity> ->
jobEntityList.mapNotNull { jobEntity ->
categoriesRepository.getCategoryById(jobEntity.categoryId)
.first()
.takeIf { it.categoryId == jobEntity.categoryId }
}
}
Run Code Online (Sandbox Code Playgroud)
或者,在您的 DAO 中,您可以创建一个仅返回列表suspend的函数版本。getCategoryById()
| 归档时间: |
|
| 查看次数: |
5035 次 |
| 最近记录: |