我正在尝试使用Andoroid分页库在回收者视图中实现分页列表。我也使用ViewModel类。但是我收到一个奇怪的错误
在我的视图模型中,我有一个属性activeDataSource,其中我想保留最后一个数据源对象(该对象是通过DataSourceFactory创建的),并且当我从存储库中收到通知列表已更新时,调用datasource方法无效。
但是我收到一个关于其起源的错误信息,我对此一无所知: e:错误:无法访问数据源
值得注意的是,如果我不使用自己的ViewModelFactory创建新的viewmodel对象,那么我不会得到此错误。
什么原因导致此错误?
我的viewmodel类:
class ArticleDetailsViewModel @Inject constructor(
private val repository: NewsRepository
) : ViewModel(), LifecycleObserver {
private var activeDataSource: DataSource<Int, Article>? = null
val articlesLiveList: LiveData<PagedList<Article>>
get() {
val dataSourceFactory = ArticleDataSourceFactory(repository)
val config = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPageSize(5)
.build()
Log.e("asd", "=== Create list live data ===")
return LivePagedListBuilder(dataSourceFactory, config)
.setFetchExecutor(Executors.newSingleThreadExecutor())
.build()
}
fun onResetClick() {
repository.onIvalidate()
}
fun setDataSource(data: DataSource<Int, Article>) {
activeDataSource = data
}
}
和默认的viewmodel工厂:
class DaggerViewModelFactory @Inject constructor(private val viewModelsMap: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) :
ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val creator = viewModelsMap[modelClass] ?: viewModelsMap.asIterable().firstOrNull {
modelClass.isAssignableFrom(it.key)
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
return try {
creator.get() as T
} catch (e: Exception) {
throw RuntimeException(e)
}
}
}
这是我的viewmodel模块。它看起来也很默认:
@NewsScope
@Module
interface NewsViewModelModule {
@Binds
@IntoMap
@ViewModelKey(ArticleDetailsViewModel::class)
fun testViewModel(viewModel: ArticleDetailsViewModel): ViewModel
}