是科特林流量';s Collect是唯一的内部kotlinx.coroutines API?
直接从 当我添加是科特林流量';s Collect是唯一的内部kotlinx.coroutines API?,kotlin,kotlin-flow,Kotlin,Kotlin Flow,直接从 当我添加@InternalCoroutinesApi @InternalCoroutinesApi fun main() = runBlocking<Unit> { println("Calling simple function...") val flow = simple() println("Calling collect...") flow.collect { value -> printl
@InternalCoroutinesApi
@InternalCoroutinesApi
fun main() = runBlocking<Unit> {
println("Calling simple function...")
val flow = simple()
println("Calling collect...")
flow.collect { value -> println(value) }
println("Calling collect again...")
flow.collect { value -> println(value) }
}
我使用的是Kotlin版本1.4.21
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'
我是否做错了什么,以致无法在Android Studio中编译示例代码?用
collectLatest
替换collect
。答案是,不,collect
不仅仅是内部kotlinx.coroutines API。错误消息具有误导性
根据@ir42的评论,添加import kotlinx.coroutines.flow.collect
解决问题
其他信息,为什么我没有选择collectedlatest
作为答案
collect
和collectLatest
是不同的
使用这个例子
fun simple(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Launch a concurrent coroutine to check if the main thread is blocked
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
// Collect the flow
simple().collect { value -> println(value) }
}
依照
但是收集最新的
fun simple(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Launch a concurrent coroutine to check if the main thread is blocked
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
// Collect the flow
simple().collectLatest { value -> println(value) }
}
添加import kotlinx.coroutines.flow.collect
@quetzalcatl,这个标题很有意义,因为显然Kotlincollect
不仅仅是内部的kotlinx.collection.API。是错误信息误导了一个人,使他认为这是错误的,并采取了错误的解决方案。嗯。。有趣。谢谢你的澄清。我想知道为什么会生成这样一个“这是一个内部kotlinx.coroutines API,不应该从kotlinx.coroutines外部使用”。是否有另一个“collect”功能已经可用(但不适合),或者这个错误是完全不同的原因造成的?
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.2"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
testImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'
fun simple(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Launch a concurrent coroutine to check if the main thread is blocked
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
// Collect the flow
simple().collect { value -> println(value) }
}
I'm not blocked 1
1
I'm not blocked 2
2
I'm not blocked 3
3
fun simple(): Flow<Int> = flow { // flow builder
for (i in 1..3) {
delay(100) // pretend we are doing something useful here
emit(i) // emit next value
}
}
fun main() = runBlocking<Unit> {
// Launch a concurrent coroutine to check if the main thread is blocked
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
// Collect the flow
simple().collectLatest { value -> println(value) }
}
I'm not blocked 1
I'm not blocked 2
1
I'm not blocked 3
2