创建新的 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
我应该如何创建新流程? 例如:我有一些代码
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