正确的方法来注入匕首2 + Kotlin + ViewModel

class SlideshowViewModel : ViewModel(){ @Inject lateinit var mediaItemRepository : MediaItemRepository fun init() { What goes here? } 

所以我想学习Dagger2,这样我可以让我的应用程序更易于测试。 问题是,我已经集成了Kotlin,并且正在开发Android架构组件。 我明白,构造函数注入是可取的,但这是ViewModel不可能的。 相反,我可以使用lateinit为了注入,但我不知道如何注入。

我是否需要为SlideshowViewModel创建一个组件,然后注入它? 还是我使用应用程序组件?

gradle这个:

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' kapt { generateStubs = true } dependencies { compile "com.google.dagger:dagger:2.8" annotationProcessor "com.google.dagger:dagger-compiler:2.8" provided 'javax.annotation:jsr250-api:1.0' compile 'javax.inject:javax.inject:1' 

应用组件

 @ApplicationScope @Component (modules = PersistenceModule.class) public interface ApplicationComponent { void injectBaseApplication(BaseApplication baseApplication); } 

BaseApplication

  private static ApplicationComponent component; @Override public void onCreate() { super.onCreate(); component = DaggerApplicationComponent .builder() .contextModule(new ContextModule(this)) .build(); component.injectBaseApplication(this); } public static ApplicationComponent getComponent() { return component; } 

不,你创建一个你正在声明(使用)你的viewModel的组件。 它通常是一个活动/片段。 viewModel具有依赖关系(mediaitemrepository),所以你需要一个工厂。 像这样的东西:

  class MainViewModelFactory ( val repository: IExerciseRepository): ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T : ViewModel?> create(p0: Class<T>?): T { return MainViewModel(repository) as T } } 

然后匕首部分(活动模块)

  @Provides @ActivityScope fun providesViewModelFactory( exerciseRepos: IExerciseRepository ) = MainViewModelFactory(exerciseRepos) @Provides @ActivityScope fun provideViewModel( viewModelFactory: MainViewModelFactory ): MainViewModel { return ViewModelProviders .of(act, viewModelFactory) .get(MainViewModel::class.java) }