为什么我们需要在不同的启动块中使用collect/collectLatest?

c-a*_*-an 3 android coroutine kotlin kotlin-coroutines kotlin-flow

lifeCycleScope.launch {
    viewModel.oneItem.collect {
        println("one")
    }

    viewModel.twoItem.collectLatest {
        println("two")
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码,但它只打印“一个”,而且似乎第二个collectLatest不起作用。这是为什么?

Ser*_*gey 6

第一个collect函数是一个suspend函数,它暂停当前的协程,直到收集完所有项目。如果viewModel.oneItem是无穷大,那么它永远不会去执行函数viewModel.twoItem.collectLatest。在这种情况下,要调用这两个函数,必须启动两个协程:

lifeCycleScope.launch {
    launch {
        viewModel.oneItem.collect {
            println("one")
        }
    }
    
    launch {
        viewModel.twoItem.collectLatest {
            println("two")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)