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()
但是看起来很麻烦
答案 0 :(得分:1)
没有什么比提供者更直接。如果使用inject
,则将使用惰性委托。如果使用get
,则将创建一个新实例,并用factory
声明了依赖关系。因此,get
是您所需要的。只需让您的MainPresenter
实现KoinComponent
,您就可以直接使用get
:
class MainPresenter : Presenter(), KoinCompontent {
fun onSaveClicked() = get<WriteFileCommand>().run()
}