android - koin 中的 Dagger2 Provider

标签 android dependency-injection dagger-2 koin

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

为了对操作使用react,我将命令注入(inject)到我的 Activity 中。 Command 是单次运行对象,例如 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,您将使用惰性委托(delegate)。如果您使用 get,您将创建一个使用 factory 声明依赖项的新实例。所以 get 就是您的情况所需要的。只需让您的 MainPresenter 实现 KoinComponent,您就可以直接使用 get:

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

关于android - koin 中的 Dagger2 Provider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988484/

相关文章:

java - @+id/android :list and @+id/list 有什么区别

android - Jetpack Compose 导航组件可以使用多少个 ViewModel?

java - spring:一个接收类列表的bean

design-patterns - 谁应该实例化和分配运行时策略实现?

java - Dagger 2 如何解决构造函数依赖

android - 使用 dagger2 在多个 fragment 中使用相同的 View 模型实例

android - Android 中的处理程序与异步调用

View.getLeft() 与 View.getScrollX() 之间的区别

go - 如何使用接口(interface)在 Golang 中为数据库实现依赖注入(inject)

java - Dagger2 子注入(inject)项为空