You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:12:33