如何声明Flow<PagingData<Data>>变量并解决Paging3 API重复调用问题
问题分析与解决
问题原因
你当前的getBreakingNews()方法每次被调用时,都会通过getNews()创建一个全新的Pager.Flow实例。即便调用了cachedIn,但Compose每次重组时都会重新调用getBreakingNews()获取新Flow,导致Paging3重复触发API请求。
解决方案
按照你期望的方式,在ViewModel中将Flow<PagingData<Data>>声明为持久化的属性,避免每次调用都生成新Flow:
修改后的ViewModel代码
private val _breakingNewsFlow: Flow<PagingData<Data>> = getNews().cachedIn(viewModelScope) val breakingNewsFlow = _breakingNewsFlow private fun getNews() = Pager( config = PagingConfig(pageSize = 10) ) { DocPagingSource(arkeliyaApiService) }.flow
Compose中调用方式
val documentList = dashboardViewModel.breakingNewsFlow.collectAsLazyPagingItems()
原理说明
- 将Flow作为ViewModel的成员属性初始化后,只会在ViewModel创建时生成一次Flow实例,
cachedIn(viewModelScope)会将分页数据缓存到ViewModel作用域内,避免重复发起请求。 - Compose直接订阅这个持久化的Flow,重组时不会重新创建Flow,也就不会触发不必要的API调用。
内容的提问来源于stack exchange,提问作者Shivpal Singh
相关产品推荐
相关产品推荐

