我有以下方法:
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)
}
}
它在存储库中搜索,调用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 }
}
}
或者,在你的 DAO 中你可以做一个suspend
的函数版本getCategoryById()
它只是返回列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)