如何使用 Kotlin Flow 链接 API 请求

Posted

技术标签:

【中文标题】如何使用 Kotlin Flow 链接 API 请求【英文标题】:How to chain API requests using Kotlin Flow 【发布时间】:2021-12-18 05:00:50 【问题描述】:

基于 id 列表,我需要检索包含每个用户详细信息的用户列表。下面是我的模型和 API 的简化;

data class UserDTO(val id: String)
data class PetDTO(val name: String)

interface Api 
  suspend fun users(): List<UserDTO>
  suspend fun pets(userId: String): List<PetDTO>


data class User(
  val id: String,
  val pets: List<Pet>
)

data class Pet(val name: String)

class UsersRepository(api: Api) 
  val users: Flow<List<User>> = TODO()

在 RxJava 中我会这样做:

val users: Observable<List<User>> = api.users()
  .flatMapIterable  it 
  .concatMap  userDto ->
    api.pets(userDto.id)
      .map  petsListDto ->
        User(userDto.id, petsListDto.map  Pet(it.name) )
      
  .toList()

如何使用 Kotlin Flow 实现 UsersRepository 并返回 Users 的列表?

【问题讨论】:

【参考方案1】:
class UsersRepository(api: Api) 
    val users: Flow<List<User>> = flow 
        val usersWithPets = api.users().map  userDto ->
            val pets = api.pets(userDto.id).map  petsListDto ->
                Pet(petsListDto.name)
            
            User(userDto.id, pets)
        
        emit(usersWithPets)
    

【讨论】:

欢迎来到 Stack Overflow,感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地了解正在发生的事情,尤其是那些刚接触该语言并难以理解概念的社区成员。 代码不言自明:)

以上是关于如何使用 Kotlin Flow 链接 API 请求的主要内容,如果未能解决你的问题,请参考以下文章

使用协程和 Flow 简化 API 设计

如何在 Spring 响应式 WebClient 中返回 Kotlin Coroutines Flow

实战 | 使用 Kotlin Flow 构建数据流 "管道"

我如何在 swift Kotlin 多平台上使用 Flow?

Kotlin Flow无缝衔接Retrofit——FlowCallAdapter

深入理解Kotlin协程Google的工程师们是这样理解Flow的?