结合 Flow 和非 Flow api 响应 Kotlin

Combine a Flow and a non Flow api response Kotlin

我目前有一段逻辑如下:

interface anotherRepository {
      fun getThings():  Flow<List<String>>
}
interface repository {
    suspend fun getSomeThings(): AsyncResult<SomeThings>
}
when (val result = repository.getSomeThings()) {
            is AsyncResult.Success -> {
                anotherRepository.getThings().collectLatest {
                    // update the state
                }
                else -> { }
            }
        }

我遇到的问题是,如果 repository.getSomeThings 之前已被多次触发,anotherRepository.getThings 将因 repository.getSomeThings 中所有预加载值的数量而被触发.我想知道使用这些存储库的正确方法是什么,一个是挂起功能,另一个是一起使用 Flow。 Rx 中 combineLatest{} 的等效行为。

谢谢。

有几种方法可以解决您的问题。一种方法就是打电话 repository.getSomeThings()collectLatest 块中并缓存最后一个结果:

var lastResult: AsyncResult<SomeThings>? = null

anotherRepository.getThings().collectLatest {
    if (lastResult == null) {
        lastResult = repository.getSomeThings()
    }
    // use lastResult and List<String>
}

另一种方法是创建一个 Flow,它将调用 repository.getSomeThings() 函数和 combine 两个流程:

combine(
  anotherRepository.getThings(),
  flow {emit(repository.getSomeThings())}
) { result1: List<String>, result2: AsyncResult<SomeThings>  ->
  ...
}