【问题标题】:How can I use data from another flow data in flow? (Kotlin Flow)如何在流中使用来自另一个流数据的数据? (科特林流程)
【发布时间】:2021-12-28 05:24:39
【问题描述】:

我写的代码如下。

suspend fun getDataByRegion(): Flow<Result?> {
    // getRegion() return Flow<Region>
    return getRegion().map { region: Region ->
        repository.requestDataFromServer(region)
    }
}

问题是 repository.requestDataFromServer(region) 调用了两次。

所以我认为我应该使用zipcombine 之类的运算符。

在使用这些运算符时,第二个流如何使用第一个流的数据?

【问题讨论】:

  • 你怎么知道数据被发射了两次?您是否添加了日志语句?将它们包括在问题中。
  • 在现有代码中,我找不到任何问题。你能发布更多代码吗?
  • 为什么这个函数标记为suspend?好像getRegion() 只是返回一个Flow,所以它也不应该是一个挂起函数。

标签: android kotlin kotlin-coroutines flow


【解决方案1】:

使用combinezip 运算符,您不能依赖对方的结果。所以一般来说,你使用map 的链接方法是可以的。

您有多种选择:

  • 假设您的存储库方法没有从其他任何地方调用,它被调用两次的原因是区域Flow 发出了两次。所以试着找出为什么会这样。

    无论如何,如果您的区域 Flow 方法两次返回相同的区域,您可以通过简单地添加来修复它 .distinctUntilChanged()getRegion() 之后点赞:

    getRegion().distinctUntilChanged().map { region: Region ->
       repository.requestDataFromServer(region)
    }
    

    这将确保您的区域Flow 不会以相同的数据重复发射。或者,如果这始终是预期行为,则直接将 distinctUntilChanged() 添加到存储库方法中。

  • 问问自己这个方法是否真的需要返回一个流 (Flow)。我想您需要一个流,因为该区域可以在运行时更改,并且您希望应用程序中的某些内容自动更新?但如果不是,您可以简单地将流转换为单个结果:

    val region = getRegion().first()
    repository.requestDataFromServer(region)
    

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 2019-09-05
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多