微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 如何使用依赖注入在ViewModel中注入构造函数

我试图在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
@Provides
fun provideFactory(dataManager:DataManager): SampleFactory {
    return SampleFactory(dataManager)
}

//Provide actual viewmodel
@Provides
fun provideviewmodel(sampleFactory: SampleFactory): Sampleviewmodel {
    return viewmodelProviders.of(fragment, sampleFactory)[Sampleviewmodel::class]
}

在你的Fragment中没有,你可以像任何其他依赖一样注入你的viewmodel,

@Injetct
lateinit viewmodel:Sampleviewmodel

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐