Koin的Dagger2提供程序

时间:2019-09-18 08:38:16

标签: android dependency-injection dagger-2 koin

koin中的javax.inject.Provider是否有其他替代方法?

为了对动作做出反应,我向活动中注入了Commands。 Command是单次运行对象,例如WriteToFile。

在匕首中,我可以这样:

class MainPresenter : Presenter() {

  @Inject
  lateinit var writeFile: Provider<WriteFileCommand>

  fun onSaveClicked() {
    writeFile.get().run()
  }
}

koin,当我尝试使用时:

class MainPresenter : Presenter() {

  lateinit var writeFile: Provider<WriteFileCommand> by inject()

  fun onSaveClicked() {
    writeFile.get().run()
  }
}

我的koin模块:

val appModule = module {
  factory { WriteFileCommand(get(), get()) }
  factory { FileProvider() }
  single { DataStore() }
}

比我说错了

  

由于错误,无法为'Factory [name ='WriteFileCommand',class ='com.test.WriteFileCommand']'创建定义:           找不到兼容的定义。检查您的模块定义

我知道我可以打电话给

var command: WriteFileCommand = StandAloneContext.getKoin().koinContext.get()
command.run()

但是看起来很麻烦

1 个答案:

答案 0 :(得分:1)

没有什么比提供者更直接。如果使用inject,则将使用惰性委托。如果使用get,则将创建一个新实例,并用factory声明了依赖关系。因此,get是您所需要的。只需让您的MainPresenter实现KoinComponent,您就可以直接使用get

class MainPresenter : Presenter(), KoinCompontent {
  fun onSaveClicked() = get<WriteFileCommand>().run()
}