正确的方法来注入匕首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; } 

One Solution collect form web for “正确的方法来注入匕首2 + Kotlin + ViewModel”

不,你创建一个你正在声明(使用)你的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) } 
  • 是否有可能在Kotlin的while条件体中初始化一个变量?
  • 春季启动休息api:如何支持json和表单urlencoded请求?
  • 使用Spring HATEOAS ControllerLinkBuilder和Kotlin抛出IllegalArgumentException
  • Kotlin arrayList - 不能重写列表
  • 是一个实例val更昂贵,然后伴侣对象VAL?
  • Kotlin工具栏菜单图标问题
  • 使用java lambda调用kotlin函数时,Kotlin无法访问kotlin.jvm.functions.Function1
  • Kotlin功能返回值正在保存在firebase中
  • Kotlin范围函数与扩展运行
  • 如何通过自定义的webView取代webView?
  • 在Kotlin中处理可空或空列表的习惯方式
  • Kotlin language will be the best programming language for Android.