为何同一lifecycleScope.launch块中collectLatest未生效,仅输出‘one’?
问题解答
你的代码为何只打印"one"?
collect 是一个挂起函数,它会持续阻塞当前协程,直到所订阅的Flow完全终止(比如调用了Flow.complete())。
在你的代码中,viewModel.oneItem.collect 会一直占用lifeCycleScope.launch创建的协程资源——只要oneItem这个Flow没有结束,协程就会被这个挂起函数牢牢占据,后面的viewModel.twoItem.collectLatest根本没有机会被执行,自然不会输出"two"。
为何要在不同launch块中使用collect/collectLatest?
每个collect或collectLatest都是对Flow的持续订阅操作,它们都会挂起当前协程直到Flow终止。如果把多个这类订阅放在同一个协程里,只有第一个订阅会生效,后续的订阅会被永远阻塞,无法执行。
要让多个Flow的订阅同时生效,必须为每个订阅单独分配一个独立的协程(也就是用单独的launch块),这样它们才能并行运行,各自监听对应Flow发射的事件。
修正后的代码示例
// 为第一个Flow的订阅单独开协程 lifeCycleScope.launch { viewModel.oneItem.collect { println("one") } } // 为第二个Flow的订阅单独开协程 lifeCycleScope.launch { viewModel.twoItem.collectLatest { println("two") } }
内容的提问来源于stack exchange,提问作者c-an
相关产品推荐
相关产品推荐

