簡體   English   中英

Android: 收集一個 Kotlin 流在另一個不發出

[英]Android: collecting a Kotlin Flow inside another not emitting

我有以下方法:

    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<List<JobEntity>>search方法的存儲庫中搜索。 然后,對於流程中的每個JobEntity ,我需要從數據庫中獲取該作業所屬的類別。 獲得該類別和作業后,我可以將作業轉換為域 model object ( JobDomainModel ) 並將其添加到列表中,該列表將作為方法的返回值 object 在流中返回。

我遇到的問題是什么都沒有發出。 我不確定在 Kotlin 中處理流程時是否遺漏了某些內容,但我沒有通過 ID ( categoriesRepository.getCategoryById(jobEntity.categoryId) ) 獲取類別,然后它工作正常並發出列表。

非常感謝!

我認為問題在於您正在收集無限長度的流,因此collect永遠不會返回。 您應該在收集之前使用.take(1)來獲得有限的 Flow,或者使用first()

你的 DAO 返回的流是無限長的。 第一個值是第一個查詢,但 Flow 將永遠持續下去,直到被取消。 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 function 版本的getCategoryById() ,它只返回列表。

如果您的 Kotlin 協程流因連續近似峰值分配異常而丟失,請從下面的代碼中獲取靈感

fun test(obj1: Object,obj2: Object) = flow {
    emit(if (obj1 != null) repository.postObj(obj1).first() else IgnoreObjResponse)
}.map { Pair(it, repository.postObj(obj2).first()) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM