android - Dagger 无法提供 Kotlin 注入(inject)

标签 android kotlin dagger-2

当我尝试使用 Kotlin 和 Dagger 2 时遇到此问题。

“如果没有 @Provides 或 @Produces 注释的方法,则无法提供接口(interface)。”

这是我的模块类:

@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 是接口(interface),Dagger 无法注入(inject)它。在 Activity 模块内我返回 AndroidAudio 实例,它实现了 Audio 接口(interface)。我不确定这里出了什么问题。在Java中,我曾多次进行接口(interface)注入(inject),但以前从未遇到过这个问题。 如果有人能帮助我,我会很高兴。 谢谢!

最佳答案

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

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

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

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

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

一切都应该是 ОК。 尝试一下,如果有问题请告诉我。 谢谢。

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

关于android - Dagger 无法提供 Kotlin 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46505835/

相关文章:

android - 如何在应用程序执行之间保留 webview cookie?

java - 错误 :(18, 0) 无法在 null 对象上调用方法 mavenLocal()

android - 无法使用Gradle构建Android应用(使用Kotlin): “comand ' java.exe'以非零退出值1完成

java - Intellij Idea kotlin 无法自动导入某些运算符函数,例如 +

java - 如何为许多具体类型创建抽象工厂

android - Dagger:如何提供参数化基类型的具体实现?

Android联系人自定义字段

kotlin - LiveData 转换映射功能

Android Dagger 2 与 BaseActivity 可减少样板文件

Android O WifiManager.enableNetwork() 无法工作