以www.example.com为例https://kotlinlang.org/docs/reference/coroutines/flow.html#flows-are-cold
fun simple(): Flow<Int> = flow {
println("Flow started")
for (i in 1..3) {
delay(100)
emit(i)
}
}
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) }
}
我在collect
上得到了错误。
This is an internal kotlinx.coroutines API that should not be used from outside of kotlinx.coroutines. No compatibility guarantees are provided.It is recommended to report your use-case of internal API to kotlinx.coroutines issue tracker, so stable API could be provided instead
当我添加@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) }
}
我在collect
的lambda(value -> println(value
的函数)中得到一个错误,如下所示。
Type mismatch.
Required:
FlowCollector<Int>
Found:
([ERROR : ]) → Unit
Cannot infer a type for this parameter. Please specify it explicitly.
我使用的是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中编译示例代码?
7条答案
按热度按时间rjee0c151#
答案是,否,
collect
不仅仅是内部的kotlinx.coroutines API。错误信息具有误导性。根据@ir42的评论,
add import kotlinx.coroutines.flow.collect
解决问题。附加信息,为什么我没有选择
collectLatest
作为答案collect
和collectLatest
不同。用这个例子
收集将产生
根据https://kotlinlang.org/docs/reference/coroutines/flow.html
但是
collectLatest
将产生
xienkqul2#
添加以下导入:
fgw7neuy3#
我终于找到了解决它的方法,在它几乎把我逼疯了。由于这里没有一个解决方案对我有效,我有一个特殊的情况,我正在处理一个多模块项目,collect()总是在到处抛出这个错误,甚至手动导入它也没有修复它。
解决这个问题的方法是显式地将协程依赖添加到我项目的所有模块build.gradle文件中,而不仅仅是应用程序的一个,甚至那些不使用协程的模块。
axzmvihb4#
对于
1.6.0-RC3
和更高版本:@InternalCoroutinesApi
注解已从所有collect()
函数中删除(参见this PR)。这意味着我们不会再看到错误,也不需要导入
因为(连同another PR的更改)我们现在可以直接使用
collect()
成员函数了。bkhjykvo5#
API在kotlinx协同程序的更新版本中发生了变化,不再是collect函数中的lambda,而是作为链中的最终调用。文档示例:
z5btuh9x6#
我只是将转换为同一个对象(这里是
StateFlow
),如下所示:yhxst69z7#
将
collect
替换为collectLatest
。