【问题标题】:How to generate module consisting @ContributesAndroidInjector in dagger with kotlin?如何用kotlin在匕首中生成包含@ContributesAndroidInjector的模块?
【发布时间】:2020-01-22 07:09:32
【问题描述】:

我正在学习 dagger 2,现在我在 kotlin 上使用 dagger-2.25.4,我为 dagger 创建了一个 BaseApplication 类,如下所示:

package com.example.demomvvm

import com.example.demomvvm.dagger.DaggerAppComponent
import dagger.android.AndroidInjector
import dagger.android.support.DaggerApplication

class MVVMApplication: DaggerApplication() {

    override fun applicationInjector(): AndroidInjector<out DaggerApplication>? {
        return DaggerAppComponent.builder().application(this).build()
    }
}

这是我的 AppComponent 类:

package com.example.demomvvm.dagger

import android.app.Application
import com.example.demomvvm.MVVMApplication
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule

@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        ActivityBuilderModule::class
    ]
)
interface AppComponent: AndroidInjector<MVVMApplication> {

    @Component.Builder
    interface Builder{

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }
}

我的 ActivityBuilderModule 生成不正确,这是我的 ActivityBuilderModule.kt:

package com.example.demomvvm.dagger

import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector

@Module
abstract class ActivityBuilderModule {

    @ContributesAndroidInjector
    abstract fun contributeLoginActivity(): LoginActivity

    @Provides
    fun doSomething(): String = "This is a string"
}

这是我在 Dagger 生成的代码上遇到的错误:

/home/suvodip/AndroidStudioProjects/demoMVVM/app/build/tmp/kapt3/stubs/debug/com/example/demomvvm/dagger/AppComponent.java:7: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.demomvvm.MVVMApplication> {
                ^
      java.lang.String is injected at
          com.example.demomvvm.ui.auth.LoginActivity.dagger
      com.example.demomvvm.ui.auth.LoginActivity is injected at
          dagger.android.AndroidInjector.inject(T) [com.example.demomvvm.dagger.AppComponent → com.example.demomvvm.dagger.ActivityBuilderModule_ContributeLoginActivity.LoginActivitySubcomponent]

我在这里注入这个:

package com.example.demomvvm.ui.auth

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import dagger.android.support.DaggerAppCompatActivity
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject

class LoginActivity : DaggerAppCompatActivity(), AuthListener {

    @Inject
    lateinit var dagger: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("Dagger", "$dagger")

    }
}

【问题讨论】:

    标签: android kotlin dependency-injection dagger-2 dagger


    【解决方案1】:

    @SuvodipMondal 欢迎加入社区。​​p>

    您得到的错误是因为@Binds@ContributesAndroidInjector 方法必须是抽象的,因为它们没有方法体。这意味着它们必须使用接口或抽象类。 @Provides 方法可能是静态的,这意味着它们可以用于抽象类和 Java-8 编译的接口,但非静态(“实例”)@Provides 方法不适用于抽象类。这在 Dagger 常见问题解答中明确列出 "Why can’t @Binds and instance @Provides methods go in the same module?"

    为了实现这一点,您必须在抽象类中使用静态函数注释 @JvmStatic

    你必须添加这个。

    @Module
    companion object{
      @JvmStatic
      @Provides
      fun doSomething(): String = "This is a string"
    }
    

    那么你的班级就会变成这样。

    package com.example.demomvvm.dagger
    
    import com.example.demomvvm.ui.auth.LoginActivity
    import dagger.Module
    import dagger.Provides
    import dagger.android.ContributesAndroidInjector
    
    @Module
    abstract class ActivityBuilderModule {
    
        @ContributesAndroidInjector
        abstract fun contributeLoginActivity(): LoginActivity
    
        @Module
        companion object{
         @JvmStatic
         @Provides
         fun doSomething(): String = "This is a string"
       }
    }
    

    更多参考1 & 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      相关资源
      最近更新 更多