【问题标题】:Dagger can not provide injection with KotlinDagger 无法使用 Kotlin 提供注入
【发布时间】:2017-09-30 18:31:06
【问题描述】:

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

“没有@Provides-或@Produces-注解的方法就不能提供接口。”

这是我的模块类:

@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 实例,它实现了音频接口。我不确定这里有什么问题。在 Java 中,我曾多次注入接口,但以前从未遇到过这个问题。 如果有人可以帮助我,我会很高兴。 谢谢!

【问题讨论】:

    标签: android kotlin dagger-2


    【解决方案1】:

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

    因为 Kotlin 不需要在方法返回时指定类型,所以您可以轻松编写如下内容:

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

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

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

    一切都应该是ОК。 试一试,告诉我是否有问题。 谢谢。

    顺便说一句:当我将 Dagger 与 Kotlin 一起使用时,我会指定返回值的类型,因为通常这将是注入变量的类型或您将要使用的变量的类型在你的匕首模块中使用。

    【讨论】:

    • 在我的情况下生成的匕首组件没有它。我试过了。 build import com.test.home.di.HomeModule_ProvideHomePresenterFactory 后无法识别此导入;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多