简体   繁体   English

如何使用kotlin在匕首中生成包含@ContributesAndroidInjector的模块?

[英]How to generate module consisting @ContributesAndroidInjector in dagger with kotlin?

I am learning dagger 2, right now I am using dagger-2.25.4 on kotlin, I made a BaseApplication class for dagger given below :我正在学习匕首 2,现在我在 kotlin 上使用 dagger-2.25.4,我为下面给出的匕首创建了一个 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()
    }
}

And here is my AppComponent class:这是我的 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
    }
}

My ActivityBuilderModule is not being genrated correctly, here is my ActivityBuilderModule.kt:我的 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"
}

This is the error I am getting on Dagger generated code:这是我在 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]

I am Injecting this here:我在这里注入这个:

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")

    }
}

@SuvodipMondal welcome to the community. @SuvodipMondal 欢迎来到社区。

The error you are getting is because @Binds and @ContributesAndroidInjector methods must be abstract because they don't have method bodies.您收到的错误是因为@Binds@ContributesAndroidInjector方法必须是抽象的,因为它们没有方法主体。 That means that they must go on an interface or abstract class.这意味着它们必须在接口或抽象类上。 @Provides methods may be static, which means they can go on abstract classes and Java-8-compiled interfaces, but non-static ("instance") @Provides methods don't work on abstract classes. @Provides方法可能是静态的,这意味着它们可以用于抽象类和 Java-8 编译接口,但非静态(“实例”) @Provides方法不适用于抽象类。 This is explicitly listed in the Dagger FAQ "Why can't @Binds and instance @Provides methods go in the same module?"这在 Dagger 常见问题解答中明确列出“为什么@Binds和实例@Provides方法不能进入同一个模块?”

For achieving this you must have a static function in your abstract class Annotated with @JvmStatic为了实现这一点,你必须在你的抽象类中有一个静态函数用@JvmStatic注释

You must add this.你必须添加这个。

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

Then your class will become like this.那么你的班级就会变成这个样子。

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"
   }
}

For more reference 1 & 2更多参考1 & 2

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM