Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:在另一个系统中收集Kotlin流,而不是_Android_Kotlin_Kotlin Flow - Fatal编程技术网

Android:在另一个系统中收集Kotlin流,而不是

Android:在另一个系统中收集Kotlin流,而不是,android,kotlin,kotlin-flow,Android,Kotlin,Kotlin Flow,我有以下方法: operator fun invoke(query: String): Flow<MutableList<JobDomainModel>> = flow { val jobDomainModelList = mutableListOf<JobDomainModel>() jobListingRepository.searchJobs(sanitizeSearchQuery(query))

我有以下方法:

    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)
            }
    }
运算符调用(查询:字符串):Flow=Flow{
val jobDomainModelList=mutableListOf()
jobListingRepository.searchJobs(sanitizeSearchQuery(查询))
.collect{jobEntityList:List->
for(jobEntityList中的jobEntity){
categoriesRepository.getCategoryById(jobEntity.categoryId)
.收集{类别实体->
if(categoryEntity.categoryId==jobEntity.categoryId){
jobDomainModelList.add(jobEntity.toDomainModel(categoryEntity))
}
}
}
发出(jobDomainModelList)
}
}
它在存储库中搜索,调用返回
流的
search
方法。然后,对于流中的每个
JobEntity
,我需要从DB中获取该作业所属的类别。一旦有了该类别和作业,我就可以将作业转换为域模型对象(
JobDomainModel
),并将其添加到列表中,列表将作为方法的返回对象在流中返回

我遇到的问题是,没有任何东西被释放出来。我不确定在使用Kotlin中的流时是否遗漏了一些内容,但我不会按ID获取类别(
categoriesRepository.getCategoryById(jobEntity.categoryId)
),然后它会正常工作并发出列表


提前多谢

我认为问题在于您正在收集无限长的流,因此
collect
永远不会返回。您应该使用
.take(1)
在收集之前获得有限的流,或者使用
first()

DAO返回的流是无限长的。第一个值是进行的第一个查询,但该流将永远继续,直到被取消。流中的每个项都是在数据库内容更改时进行的新查询

大概是这样的:

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 }
            }
        }
运算符调用(查询:字符串):流=
jobListingRepository.searchJobs(sanitizeSearchQuery(查询))
.map{jobEntityList:List->
jobEntityList.mapNotNull{jobEntity->
categoriesRepository.getCategoryById(jobEntity.categoryId)
.first()
.takeIf{it.categoryId==jobEntity.categoryId}
}
}

或者,在DAO中,您可以创建一个
suspend
函数版本的
getCategoryById()
,该函数只返回列表。

我认为问题在于您收集的是无限长的流,因此
收集
永远不会返回。您应该使用
.take(1)
在收集之前获得有限的流,或者使用
first()

DAO返回的流是无限长的。第一个值是进行的第一个查询,但该流将永远继续,直到被取消。流中的每个项都是在数据库内容更改时进行的新查询

大概是这样的:

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 }
            }
        }
运算符调用(查询:字符串):流=
jobListingRepository.searchJobs(sanitizeSearchQuery(查询))
.map{jobEntityList:List->
jobEntityList.mapNotNull{jobEntity->
categoriesRepository.getCategoryById(jobEntity.categoryId)
.first()
.takeIf{it.categoryId==jobEntity.categoryId}
}
}

或者,在DAO中,您可以创建一个
suspend
函数版本的
getCategoryById()
,它只返回列表。

只是为了确保:
searchJobs()
实际上是一个值流(例如WebSocket)还是一个单次请求?它也是一个流,当它通过DAO在数据库中使用Room进行搜索时,我也尝试了map而不是collect(在获取作业类别时),但它仍然无法确保:
searchJobs()
实际上是一个值流(例如WebSocket)还是一个单次请求?它也是一个流,当它通过dao在数据库中使用Room进行搜索时,我也尝试了map而不是collect(在获取作业的类别时),但仍然不起作用