如果我使用ViewModelFactory,为什么会出现错误“ e:错误:无法访问数据源”?

时间:2019-02-12 15:29:48

标签: android android-viewmodel android-mvvm android-paging

我正在尝试使用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
}

0 个答案:

没有答案