Я пытаюсь реализовать постраничный список в представлении переработчика, используя библиотеку разбиения на страницы andoroid.Я также использую класс ViewModel.Но я получаю странную ошибку
В моей модели представления у меня есть свойство activeDataSource, в котором я хочу сохранить последний объект источника данных (созданный с помощью DataSourceFactory), и вызвать метод источника данных как недействительный, когда я получил уведомление из репозитория о том, чтосписок был обновлен.
Но я получаю ошибку о происхождении, о которой я понятия не имею: e: error: не могу получить доступ к DataSource
Примечательно, что если я не использую свой собственный 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
}