我试图在https://developer.android.com/jetpack/docs/guide上实现这个例子.这解释了如何构建tan androID应用程序.
当我使用相同的代码时,我得到以下错误.
java.lang.class<com.example.UserProfileviewmodel> has no zero argument constructor
我可以弄清楚这个错误与之有关
viewmodel = viewmodelProvIDers.of(this).get(UserProfileviewmodel.class);
当我为viewmodel编写默认的零输入构造函数时,我收到以下错误.
Attempt to invoke virtual method 'voID androID.arch.lifecycle.liveData.observe(androID.arch.lifecycle.lifecycleOwner, androID.arch.lifecycle.Observer)' on a null object reference
我无法弄清楚这个错误的原因以及如何解决它.
解决方法:
如果你想在你的Fragment中提供带有构造函数的viewmodel作为依赖项,那么有一种不同的方法,
让我们假设您有一个viewmodel类,如下所示,
class SampleVIEwmModel(dataManager:DataManager):viewmodel(){ //some logic}
然后你需要创建一个工厂类来支持上面的viewmodel,如下所示,
class SampleFactory @Inject constructor(var dataManager:DataManager): viewmodelProvIDer.Factory {overrIDe fun <T : viewmodel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(Sampleviewmodel::class)) { return Sampleviewmodel(dataManager) as T } throw IllegalStateException()}
}
现在在你的模块类中,你可以按如下方式注入上面的类,(Note-Datamanager类是可注入的)
//ProvIDe Factory@ProvIDesfun provIDeFactory(dataManager:DataManager): SampleFactory { return SampleFactory(dataManager)}//ProvIDe actual viewmodel@ProvIDesfun provIDeviewmodel(sampleFactory: SampleFactory): Sampleviewmodel { return viewmodelProvIDers.of(fragment, sampleFactory)[Sampleviewmodel::class]}
在你的Fragment中没有,你可以像任何其他依赖一样注入你的viewmodel,
@Injetctlateinit viewmodel:Sampleviewmodel
总结 以上是内存溢出为你收集整理的android – 如何使用依赖注入在ViewModel中注入构造函数全部内容,希望文章能够帮你解决android – 如何使用依赖注入在ViewModel中注入构造函数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)