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

4
我正在尝试实现https://developer.android.com/jetpack/docs/guide上的示例。这个示例解释了一个安卓应用程序应该如何构建。
当我使用相同的代码时,我遇到了以下错误。
java.lang.Class<com.example.UserProfileViewModel> has no zero argument constructor

我可以推断出这个错误与IT技术有关。

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

我不知道这个错误的原因以及如何解决它。

你在项目中还做了哪些关于设置Dagger的工作?你所喜欢的页面提供的代码示例不足以正确地设置Dagger。 - Levi Moreira
我对Dagger非常陌生,如果您能提供一些使用Dagger的示例链接,那将非常有帮助。我在Gradle文件中包含了依赖项以设置Dagger-2。 - shashwat
MVVM与架构组件的设置相当复杂,我在这里有一个示例项目,其中使用了ViewModel和Dagger,您可以查看一下。https://github.com/Levi-Moreira/MockAppMVVM - Levi Moreira
如果您有任何问题,可以联系我 :) - Levi Moreira
谢谢。你有Java的例子吗? - shashwat
2个回答

1
如果您想在Fragment中将构造函数作为依赖项提供给ViewModel,那么有一种不同的方法。假设您有一个如下所示的ViewModel类:
class SampleViewmModel(dataManager:DataManager):ViewModel(){
  //some logic
}

那么您需要创建一个工厂类来支持上述视图模型,如下所示:
class SampleFactory @Inject constructor(var dataManager:DataManager): ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    if (modelClass.isAssignableFrom(SampleViewModel::class.java)) {
        return SampleViewModel(dataManager) as T
    }
    throw IllegalStateException()
}

}

现在,在您的模块类中,您可以像下面这样注入上述类(注意: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

modelClass.isAssignableFrom(SampleViewModel::class.java) (.java丢失) - user5959404

0

你可以使用Koin作为Dagger的替代品。 Koin完全支持Android Architecture ViewModel。它非常易于使用。我更喜欢在小型和中型项目中使用它。

// declared ViewModel using the viewModel keyword
val myModule : Module = module {
    viewModel { MyViewModel(get()) } 
    ...
}

// Just get it
class MyActivity() : AppCompatActivity() {

    // lazy inject MyViewModel
    val myViewModel : MyViewModel by viewModel()
}

insert-koin.io


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接