2017-09-30 4 views
1

コトリンとダガー2を使用しようとするとこの問題が発生します。 「。インターフェースはProvides-または@注釈付き生産する方法@なしで提供することができません」ダガーはコトリンで注射できません

これは私の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はインタフェースであり、ダガーを注入する問題を抱えていますそれは私が何度もインターフェイスを注入していたことがありましたが、以前にこの問題が起きたことはありません。 誰かができる場合は私は私がとても幸せになるのを助けてください。 よりks!

答えて

4

私はあなたの問題に対する解決策は非常に簡単で、残念なことにあまり明らかではないと思います。

Kotlinは返すメソッドで指定するタイプを必要としないので、簡単にこのような何か書くことができます。

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

を、コンパイラがそれについて文句を言うことはありませんが、この場合にはダガーはAndroidAudioオブジェクトを提供します注射用。あなたのアクティビティでは、注入のためのオーディオオブジェクトを探しています。このコードを次のように変更した場合:

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

すべてがОКである必要があります。 何かがうまくいかない場合は試してみてください。おかげさまで

ところで:私はKotlinとダガーを使用する場合、通常はそのつもりが注入された変数の型や、あなたの短剣で使用しようとしている変数の型であるので、私は遠かった、戻り値の型を指定しますモジュール。

関連する問題