【问题标题】:Dagger2 Provider in koinDagger2 Provider in koin
【发布时间】:2019-09-18 08:38:16
【问题描述】:

在 koin 中有没有 javax.inject.Provider 的替代品?

为了对操作做出反应,我将命令注入到我的活动中。 Command 是单次运行的对象,例如 WriteToFile。

用匕首我可以这样:

class MainPresenter : Presenter() {

  @Inject
  lateinit var writeFile: Provider<WriteFileCommand>

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

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

但是看起来很麻烦

【问题讨论】:

  • 请添加您迄今为止尝试过的内容以及您的设置和简化模块。到目前为止,这个问题太宽泛了。注射本身有问题吗?您对依赖项的定义有疑问吗?

标签: android dependency-injection dagger-2 koin


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多