Dagger 无法提供 Kotlin 注入

MeL*_*ine 2 android kotlin dagger-2

当我尝试使用 Kotlin 和 Dagger 2 时遇到这个问题。

\n\n

“如果没有@Provides-或@Produces-注释的方法,则无法提供接口。\xe2\x80\x9d

\n\n

这是我的模块类:

\n\n
@Module\nclass MenuActivityModule(@NonNull private val menuActivity: MenuActivity) {\n\n    @Provides\n    @MenuActivityScope\n    fun provideGameScreenDimensions(application: Application) =\n            GameScreenDimension(application.resources)\n\n    @Provides\n    @MenuActivityScope\n    fun provideAudio() =\n            AndroidAudio(menuActivity)\n\n    @Provides\n    @MenuActivityScope\n    fun providePowerManager() =\n            menuActivity.getSystemService(Context.POWER_SERVICE) as PowerManager\n\n    @Provides\n    @MenuActivityScope\n    fun provideWakeLock(@NonNull powerManager: PowerManager) =\n        powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Preferences.APPLICATION_TAG)\n}\n\nThis is a part of my Activity class, where I inject some variables with Dagger:\n\nclass MenuActivity : BaseActivity {\n\n    @Inject\n    lateinit var myAudio: Audio\n    @Inject\n    lateinit var wakeLock: PowerManager.WakeLock\n    @Inject\n    lateinit var apiService : ApiService\n    @Inject\n    lateinit var sharedPref : SharedPreferences\n    @Inject\n    lateinit var gameDimension : GameScreenDimension\n\n    init {\n        DaggerMenuActivityComponent.builder()\n                .menuActivityModule(MenuActivityModule(this))\n                .build()\n                .inject(this)\n    }\n    //more code\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Audio.kt 是接口,Dagger 在注入它时遇到问题。在活动模块内,我返回 AndroidAudio\instance,它实现了 Audio 接口。我不确定这里出了什么问题。在Java中,我已经进行过多次接口注入,但以前从未遇到过这个问题。\n如果有人可以帮助我,我会很高兴。\n谢谢!

\n

Sto*_*eev 5

我认为您的问题的解决方案非常简单,但不幸的是也不那么明显。

\n\n

因为 Kotlin 不要求在方法返回时指定类型,所以您可以轻松编写如下内容:

\n\n
@Provides\n@MenuActivityScope\nfun provideAudio() =\n        AndroidAudio(menuActivity)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编译器不会抱怨这一点,但在这种情况下,Dagger 将提供 AndroidAudio 对象进行注入。在您的活动中,您正在寻找用于注入的音频对象。因此,如果您将此代码更改为:

\n\n
@Provides\n@MenuActivityScope\nfun provideAudio(): Audio =\n        AndroidAudio(menuActivity)\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切都应该是\xd0\x9e\xd0\x9a。\n尝试一下,如果有问题请告诉我。\n谢谢。

\n\n

顺便说一句:当我将 Dagger 与 Kotlin 一起使用时,我会指定返回值的类型,因为通常这将是注入变量的类型或您将在 dagger 模块中使用的变量的类型。

\n