匕首不能提供注射Kotlin

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

“接口不能提供@提供或@产生注释的方法”。

这是我的Module类:

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

Audio.kt是界面和Dagger注入它的问题。 在活动模块内部,我正在返回实现Audio接口的AndroidAudio实例。 我不知道这里有什么问题。 在Java中,我曾经多次注入过接口,之前从未遇到过这个问题。 如果有人能帮助我,我会如此快乐。 谢谢!

我认为你的问题的解决方案是非常简单的,也不是很明显,不幸的是。

因为Kotlin不需要在方法返回时指定types,所以可以很容易地写出如下所示的内容:

 @Provides @MenuActivityScope fun provideAudio() = AndroidAudio(menuActivity) 

编译器不会抱怨,但在这种情况下,Dagger将提供AndroidAudio对象进行注入。 在你的活动你正在寻找注射音频对象。 所以如果你改变这个代码是:

 @Provides @MenuActivityScope fun provideAudio(): Audio = AndroidAudio(menuActivity) 

一切都应该是ОК。 试试看,如果有什么不行的话。 谢谢。

顺便说一句 :当我用Kotlin使用Dagger的时候,我总是指定返回值的types,因为通常这将是注入variables的types,或者你要在匕首模块中使用的variables的types。