通过 Kotlin 中的另一个挂起函数发出流

Emit Flow via another suspend function in Kotlin

如何让下面的流量采集器接收到“hello”?收集器正在调用 myFunction1(),后者又调用 myFunction2()。两者都是挂起函数。

目前当我点击 运行 时没有任何反应并且没有收到任何流量。我在这里遗漏了什么吗?

CoroutineScope(IO).launch {
    val flowCollector = repo.myFunction1()
        .onEach { string ->
            Log.d("flow received: ", string)
        }
        .launchIn(GlobalScope)
}

class Repo {

    suspend fun myFunction1(): Flow<String> = flow {
        /*some code*/
        myFunction2()
    }

    suspend fun myFunction2(): Flow<String> = flow {
        /*some code*/
        emit("hello")
    }
}

除非您有非常具体的原因,否则从您的存储库返回 Flow 的函数不应暂停(因为 flow{} 生成器不会暂停)。由于挂起操作正在收集(等待值从中出来)。

根据您提供的代码,您正在寻找 flatMapLatest 函数。 Docs here

class Repo {

  fun function1() = 
    flow {
      val value = doSomething()
      emit(value)
    }
    .flatMapLatest { emittedValue -> function2() }
  fun function2() = flow {...}
}

您可以尝试使用 emitAll 函数来处理您的情况:

fun myFunction1(): Flow<String> = flow {
    /*some code*/
    emitAll(myFunction2())
}

fun myFunction2(): Flow<String> = flow {
    /*some code*/
    emit("hello")
}

emitAll 函数从 Flow 中收集所有值,由 myFunction2() 函数创建并将它们发送到收集器。

并且没有理由在每个函数之前设置一个 suspend 修饰符,flow 生成器不是 suspend