I am using paging3
and I have two different paging source. The problem is Coroutine Scope
only emit first paging flow
In ViewModel
I have two paging flow
val pagingFlow1 = Pager(PagingConfig(pageSize = 50, prefetchDistance = 1)) {
pagingSource
}.flow.cachedIn(viewModelScope)
val pagingFlow2 = Pager(PagingConfig(pageSize = 50, prefetchDistance = 1)) {
pagingSource2
}.flow.cachedIn(viewModelScope)
Collect them in activity
lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow1.collectLatest { pagingData ->
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow2.collectLatest { pagingData ->
pagingAdapter2.submitData(pagingData)
}
}
But lifecycleScope
only emit pagingFlow1
in other words paging works only first recyclerView.
When I change the order this time only works for pagingFlow2
lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow2.collectLatest { pagingData ->
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow1.collectLatest { pagingData ->
pagingAdapter2.submitData(pagingData)
}
}
In order to make sure I tested it with basic flows and works normally
// Flows in ViewModel
val testFlow1 = flowOf(1,2,3)
val testFlow2 = flowOf(4,5,6)
// Activity
lifecycleScope.launch(Dispatchers.IO) {
viewModel.testFlow1.collectLatest { item ->
Log.d(item)
}
viewModel.testFlow2.collectLatest { item ->
Log.d(item)
}
}
I can not figure out why only first flow emitted while using Paging? Anyone give me a clue?
While trying different things, I found some interesting behaviour. We can not collect anything if first collect pagingFlow
val flow3 = flowOf(1,2,3)
lifecycleScope.launch(Dispatchers.IO) {
flow3.collectLatest { pagingData ->
LogUtils.d("PagingFlow3 $pagingData")
}
viewModel.pagingFlow1.collectLatest { pagingData ->
LogUtils.d("PagingFlow1 $pagingData")
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow2.collectLatest { pagingData ->
LogUtils.d("PagingFlow2 $pagingData")
pagingAdapter2.submitData(pagingData)
}
}
First flow3
collected than pagingFlow1
collected but pagingFlow2
not collected
If we put flow3 below pagingFlow1
it will not collected
val flow3 = flowOf(1,2,3)
lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow1.collectLatest { pagingData ->
LogUtils.d("PagingFlow1 $pagingData")
pagingAdapter.submitData(pagingData)
}
flow3.collectLatest { pagingData ->
LogUtils.d("PagingFlow3 $pagingData")
}
viewModel.pagingFlow2.collectLatest { pagingData ->
LogUtils.d("PagingFlow2 $pagingData")
pagingAdapter2.submitData(pagingData)
}
}
Only pagingFlow1
collected