使用平面图的科特林流无法调用收集中的方法

kotlin flow using flatmap cannot call method in collect

lifecycleScope.launch {
    adapter?.getData()?.let {
        val flowable = it.asFlow()
        flowable.onEach {
            doCompress(it)
        }.flatMapConcat {
            flow<Unit> {
                updateProgressInMain()
            }.flowOn(Dispachers.Main)
        }.catch {
            dismissLoading()
        }.flowOn(Dispatchers.IO).collect {
            Log.d("Collect", "" + Thread.currentThread())
        }
    }
}

如上代码,我无法在控制台打印 'Collect' 登录,但其他代码可以 运行 很好。但是,当我在 onEach 期间使用 'WithContext()' 而不是 flatMapConcat 来切换线程时,我可以打印日志。谁能描述一下发生了什么?

您生成了一个在 flatMapConcat 中永远不会发出的空 Flow,因此生成的 Flow 也永远不会发出任何东西。

你的代码对我来说不太有意义,但假设你想做的任务是,对于源 LiveData 作为 Flow 发出的每个项目:

  • 将其传递给 IO 调度程序上的 doCompress()。显然 doCompress() 没有 return 任何东西。
  • 在压缩每个项目后在主线程上调用 updateProgressInMain()

然后不管失败与否都调用dismissLoading()

那么这个更简单的代码应该可以做到:

adapter?.getData()?.asFlow()?.onEach {
    runCatching {
        withContext(Dispatchers.IO) {
            doCompress(it)
            Log.d("Collect", "" + Thread.currentThread())
        }
        updateProgressInMain()
    }
    dismissLoading()
}?.launchIn(lifecycleScope)