如何在初始加载时将数据从 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 等。这个函数怎么调用?
您没有具体说明要传递的内容,因此我将尝试简要介绍这两种情况:
- 您需要根据 UI 上下文传递一些动态参数(例如,链接到线程中间):
PagedList.Builder 或其任何变体(LiveData、Rx 等)有一个 initialKey
参数,您可以在实例化时传入该参数,该参数传递给 DataSource
作为LoadParams
中的键。这需要匹配 DataSource
的 Key
类型(Int
代表 PositionalDataSource
,等等)。
- 您有一些依赖项不是基于 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
。
我正在使用 Paging 库从网络服务获取数据并将其显示在回收站视图中。但是,当最初加载数据源时,我无法找到一种加载初始数据的方法 我正在做类似于 this tutorial.
的事情override fun loadInitial(params: LoadInitialParams<String>, callback: LoadInitialCallback<String, RedditPost>) {}
我想传递从 ViewModel 传递的 User.name、User.age 等。这个函数怎么调用?
您没有具体说明要传递的内容,因此我将尝试简要介绍这两种情况:
- 您需要根据 UI 上下文传递一些动态参数(例如,链接到线程中间):
PagedList.Builder 或其任何变体(LiveData、Rx 等)有一个 initialKey
参数,您可以在实例化时传入该参数,该参数传递给 DataSource
作为LoadParams
中的键。这需要匹配 DataSource
的 Key
类型(Int
代表 PositionalDataSource
,等等)。
- 您有一些依赖项不是基于 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
。