Почему я получил ошибку «e: error: не могу получить доступ к DataSource», если я использую ViewModelFactory? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь реализовать постраничный список в представлении переработчика, используя библиотеку разбиения на страницы 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...