当前位置: 代码迷 >> 综合 >> Android: ViewModel> has no zero argument constructor
  详细解决方案

Android: ViewModel> has no zero argument constructor

热度:88   发布时间:2024-02-23 22:03:28.0
        viewModel = ViewModelProvider(this,ViewModelProvider.AndroidViewModelFactory.getInstance(application)).get(PDFBookDocumentViewModel::class.java)

使用上述方法加载viewModel报上述错误。如果您想为ViewModel类提供一个非零参数的构造函数,则可能必须创建一个自定义ViewModelFactory类来初始化ViewModel实例,该实例将实现ViewModelProvider.Factory接口

解决方案:https://stackoverflow.com/questions/44194579/android-viewmodel-has-no-zero-argument-constructor

 

1. 创建一个自定义ViewModelFactory类:

class ViewModelFactory constructor(private val sharePref: SharedPreferences,private val topRepository: ITopRepository,
) : ViewModelProvider.NewInstanceFactory() {override fun <T : ViewModel> create(modelClass: Class<T>) =with(modelClass) {when {isAssignableFrom(PDFBookDocumentViewModel::class.java) ->PDFBookDocumentViewModel(PDFBookDocumentUseCase(topRepository))else ->throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")}} as Tcompanion object {@Volatilevar INSTANCE: ViewModelFactory? = nullfun getInstance(sharePref: SharedPreferences,iTopRepository: ITopRepository,): ViewModelFactory {if (INSTANCE == null) {synchronized(ViewModelFactory::class) {if (INSTANCE == null) {INSTANCE =ViewModelFactory(sharePref,iTopRepository)RetrofitManager.sharedPreferences = sharePref}}}return INSTANCE!!}}
}

 

2: 获取用于在Activity中创建ViewMode的Factory:

/**** 获取用于在Activity中创建ViewMode的Factory** @return ViewModelFactory*/
fun Activity.getViewModelFactory(): ViewModelFactory {val sharePref = SharedPreferences(applicationContext)val topRepository = (applicationContext as MyApplication).topRepositoryreturn ViewModelFactory.getInstance(sharePref,topRepository,)
}

 

3: Activity中绑定viewModel的代码用如下替换:

 viewModel = viewModels<PDFBookDocumentViewModel> { getViewModelFactory() }.value

 

 

 

  相关解决方案