Кинжал не может обеспечить инъекцию Kotlin

У меня есть эта проблема, когда я пытаюсь использовать Kotlin и Dagger 2.

«интерфейс не может быть предоставлен без метода @ Provides- или @ Produces-annotated».

Это мой класс модуля:

@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 – это интерфейс, и у кинжала есть проблема с его введением. Внутри модуля активности я возвращаю экземпляр AndroidAudio, который реализует интерфейс Audio. Я не знаю, в чем проблема. В Java у меня было много раз инъекций интерфейсов, и у меня никогда не было этой проблемы раньше. Если кто-то может мне помочь, я буду так счастлив. Благодаря!

Я думаю, что решение вашей проблемы очень простое и также не столь очевидное, к сожалению.

Поскольку Kotlin не требует указания типа для возвращаемых методов, вы можете легко написать что-то вроде этого:

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

И компилятор не будет жаловаться на это, но в этом случае Кинжал предоставит объект AndroidAudio для инъекций. В вашей деятельности вы ищете объект Audio для инъекций. Поэтому, если вы измените этот код:

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

Все должно быть ОК. Попробуйте и скажите, если что-то не сработает. Благодарю.

BTW : Когда я использую Кинжал с Kotlin, я всегда указываю тип возвращаемого значения, потому что обычно это будет тип введенных переменных или тип переменной, которую вы собираетесь использовать в своем кинжальном модуле.