如何在流中使用来自另一个流数据的数据? (科特林流程)
Posted
技术标签:
【中文标题】如何在流中使用来自另一个流数据的数据? (科特林流程)【英文标题】: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) 调用了两次。
所以我认为我应该使用zip
或combine
之类的运算符。
在使用这些运算符时,第二个流如何使用第一个流的数据?
【问题讨论】:
你怎么知道数据被发射了两次?您是否添加了日志语句?将它们包括在问题中。 在现有代码中,我找不到任何问题。你能发布更多代码吗? 为什么这个函数标记为suspend
?好像getRegion()
只是返回一个Flow,所以它也不应该是一个挂起函数。
【参考方案1】:
使用combine
和zip
运算符,您不能依赖对方的结果。所以一般来说,你使用map
的链接方法是可以的。
您有多种选择:
假设您的存储库方法没有从其他任何地方调用,它被调用两次的原因是区域Flow
发出了两次。所以试着找出为什么会这样。
无论如何,如果您的区域 Flow
方法两次返回相同的区域,您可以通过简单地添加来修复它
.distinctUntilChanged()
在getRegion()
之后点赞:
getRegion().distinctUntilChanged().map region: Region ->
repository.requestDataFromServer(region)
这将确保您的区域Flow
不会以相同的数据重复发射。或者,如果这始终是预期行为,则直接将 distinctUntilChanged()
添加到存储库方法中。
问问自己这个方法是否真的需要返回一个流 (Flow
)。我想您需要一个流,因为该区域可以在运行时更改,并且您希望应用程序中的某些内容自动更新?但如果不是,您可以简单地将流转换为单个结果:
val region = getRegion().first()
repository.requestDataFromServer(region)
【讨论】:
以上是关于如何在流中使用来自另一个流数据的数据? (科特林流程)的主要内容,如果未能解决你的问题,请参考以下文章
java的io流中,啥时候应该在流关闭之前加flush,啥时候不用