2017-09-30 85 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:當我用匕首科特林我跳投指定返回值的類型,因爲通常是會是注入的變量的類型或可變的,你要在你的匕首所用的類型模塊。