Dagger无法提供Kotlin注射剂

时间:2017-09-30 18:31:06

标签: android kotlin dagger-2

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

如果没有@ Provide-或@ 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是界面,Dagger注入它有问题。在活动模块中,我正在返回AndroidAudio 实例,它实现了Audio接口。我不知道这里有什么问题。在Java中,我已经多次注入接口,之前我从未遇到过这个问题。 如果有人可以帮助我,我会很开心。 谢谢!

1 个答案:

答案 0 :(得分:4)

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

因为Kotlin不需要在方法返回时指定类型,所以你可以轻松地写出这样的东西:

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

编译器不会抱怨,但在这种情况下,Dagger将提供AndroidAudio对象进行注入。在您的Activity中,您正在寻找用于注射的Audio对象。因此,如果您将此代码更改为:

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

一切都应该是ОК。 尝试告诉我,如果某些东西不起作用。 感谢。

BTW :当我使用Dagger和Kotlin时,我会指定返回值的类型,因为通常这将是注入变量的类型或变量的类型在你的匕首模块中使用。