2017-09-30 44 views
1

我有这个问题,当我尝试使用Kotlin和匕首2。匕首不能提供注射与Kotlin

“接口不能没有@规定外或@产生注解方法提供。”

这是我的模块类:

@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中,我有很多次接口注入,我从来没有遇到过这个问题 如果有人可以帮助我,我会很开心。 比KS!

回答

4

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

因为科特林不需要类型要在方法中指定的回报,你可以很容易地编写这样的事:

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

,编译器不会抱怨说,但在这种情况下,匕首将提供AndroidAudio对象用于注射。在你的活动你正在寻找注射音频对象。因此,如果您将此代码更改为:

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

一切应该是ОК。 试一试,告诉我有什么不起作用。 谢谢。

BTW:当我用匕首科特林我跳投指定返回值的类型,因为通常是会是注入的变量的类型或可变的,你要在你的匕首所用的类型模块。