如何在初始加载时将数据从 ViewModel 传递到 DataSource

How to pass data to DataSource from a ViewModel when it is initially loaded

我正在使用 Paging 库从网络服务获取数据并将其显示在回收站视图中。但是,当最初加载数据源时,我无法找到一种加载初始数据的方法 我正在做类似于 this tutorial.

的事情
override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, RedditPost>) {}

我想传递从 ViewModel 传递的 User.name、User.age 等。这个函数怎么调用?

您没有具体说明要传递的内容,因此我将尝试简要介绍这两种情况:

  1. 您需要根据 UI 上下文传递一些动态参数(例如,链接到线程中间):

PagedList.Builder 或其任何变体(LiveData、Rx 等)有一个 initialKey 参数,您可以在实例化时传入该参数,该参数传递给 DataSource 作为LoadParams 中的键。这需要匹配 DataSourceKey 类型(Int 代表 PositionalDataSource,等等)。

  1. 您有一些依赖项不是基于 UI 上下文的动态依赖项。

您想通过 DataSource 的构造函数传递任何依赖项,在 .create() 期间通过 DataSource.Factory 传递它。

编辑:通常,如果您尝试从 UI 上游发送事件并对此做出反应,您需要执行 .switchMap。您没有提到什么架构或 post 任何代码,但假设您使用的是 LiveData,它可能看起来像:

ViewModel.kt

val queryFlow = MutableLiveData<String>("initialQuery")
val pagingDataFlow = queryFlow
  .switchMap { query ->
     LivePagedListBuilder(
       dataSourceFactory = MyDataSourceFactory(query),
       config = ...
     )
       ...
       .build()
  }
  .cachedIn(viewModelScope)

这允许您在每个新查询上启动/取消新流并将查询传递到您的 DataSource.Factory