使用Paging库时如何在DataSource初始加载阶段从ViewModel传递参数
实现参数传递的方案
你不需要手动调用loadInitial方法,该方法由Paging库内部自动触发,参数传递可以通过构造函数注入的方式实现,步骤如下:
- 给自定义DataSource添加构造参数
在你的DataSource子类中增加构造参数,接收需要的用户名、年龄等信息,之后就可以在loadInitial、loadBefore、loadAfter等加载方法里直接使用这些参数调用WebService接口
class CustomDataSource( private val userName: String, private val userAge: Int ) : PageKeyedDataSource<String, RedditPost>() { override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, RedditPost>) { // 此处直接使用userName、userAge发起网络请求即可 } // 其余loadBefore、loadAfter方法实现省略 }
- 自定义DataSource.Factory接收参数
Paging库通过Factory创建DataSource实例,你需要自定义Factory类,将参数透传给DataSource的构造函数
class CustomDataSourceFactory( private val userName: String, private val userAge: Int ) : DataSource.Factory<String, RedditPost>() { override fun create(): DataSource<String, RedditPost> { return CustomDataSource(userName, userAge) } }
- ViewModel中传入参数构建Paging数据源
在ViewModel初始化Pager时,将存储的User对象的属性传入Factory即可:
// ViewModel中示例代码 val pagingData = Pager( config = PagingConfig( pageSize = 20, enablePlaceholders = false ) ) { CustomDataSourceFactory(user.name, user.age).create() }.flow.cachedIn(viewModelScope)
如果后续需要动态修改请求参数,只需要把参数包裹为可观察对象,配合flatMapLatest切换数据源即可,修改参数后会自动重建DataSource重新加载数据。
内容的提问来源于stack exchange,提问作者The_Martian
相关产品推荐
相关产品推荐

