Koin 中的 Dagger2 提供程序

Dagger2 Provider in koin

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

为了对操作做出反应,我正在向我的 activity 注入命令。 命令是单个 运行 对象,例如 WriteToFile.

在 dagger 中我可以这样做:

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() }
}

然后我收到错误提示:

Can't create definition for 'Factory [name='WriteFileCommand',class='com.test.WriteFileCommand']' due to error : No compatible definition found. Check your module definition

我知道我可以打电话:

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

但是看起来好笨重

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

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