创建新的 Kotlin Flow

Creating a new Kotlin Flow

我应该如何创建新流程? 例如:我有一些代码

viewModelScope.launch(dispatchers.io) {
      method1().collect {
           method2().collect{} 
       }        
}
fun method1(): Flow
fun method2(): Flow

从我的角度来看,从 collect 操作开始新流程是不正确的,但我无法证实这一点。

澄清一下:“创建”流程与“executing/starting”流程不同。

您 create/build 通过使用 Flow Builder 创建 Flow。由于你的两个方法 return 流,这是你构建它们的地方。

流量生成器的一些例子是:

  • flowOf():从一组给定的项目创建流程。

  • asFlow(): 集合转流的扩展函数

  • flow{}: 自定义流程构建器块来实现任何自定义 通过使用 emit().

    发出项目来创建流程的业务逻辑

对于像 flowOf(1, 2, 3) 这样简单的 'static' 流构建器,您可以将 Flow 定义为属性以减少开销,而对于更复杂的带有参数的构建器函数,即在使用 flow{} 时,方法是要走的路,就像你的例子一样。

Flow 是一个 流,这意味着您的构建器代码在收集之前不会执行。

collect{} 是“开始”流程执行的正确方式。您实际上是在一个接一个地收集它的项目,执行它的构建器代码。

您的示例嵌套了 collect{} 调用,这在某些情况下很好,但在许多情况下并不是最佳做法。我建议阅读 Vasya Drobushkov's blog post Nesting vs. Chaining 以了解何时使用哪种方法。简而言之,链接意味着更好的可读性、错误处理和测试。首选方法是使用 Flow 方法 combine()zip() 将您的操作链接到多个流上,并使用 flatMap{} 操作在需要时应用嵌套,最后使用单个收集。

这是一个例子:

CoroutineScope(Dispatchers.Main).launch {
    flow1.zip(flow2) { intValue, stringValue ->
        "$intValue$stringValue"
    }.collect {
        Log.d(TAG, it)
    }
}

val flow1: Flow = flowOf(1, 2, 3)
val flow2: Flow = flowOf("A", "B", "C")

结果:

1A
2B
3C