在 kotlin 中,如果没有 @Provides- 或 @Produces- 注解的方法,则无法提供上下文

Deb*_*ebu 3 android dependency-injection kotlin dagger-2

我在 Kotlin 中使用 Dagger 进行依赖注入。现在这里是必要的课程

活动模块

@Module class ActivityModule (val activity : Activity){
    @Provides
    @ActivityContext
    fun provideContext() : Context{
        return activity
    }
}
Run Code Online (Sandbox Code Playgroud)

活动组件

@PerActivity
@Component(dependencies = arrayOf(ApplicationComponent::class), modules = arrayOf(ActivityModule::class))
interface ActivityComponent {
    fun inject(activity: MainActivity)
}
Run Code Online (Sandbox Code Playgroud)

主要活动

@Inject @ActivityContext lateinit var context:Context
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DaggerActivityComponent.builder()
.applicationComponent(MainApplication.getInstance().getApplicationComponent()).activityModule(ActivityModule(this)).build()
.inject(this);
Run Code Online (Sandbox Code Playgroud)

现在我收到以下错误

error: android.content.Context cannot be provided without an @Provides- or @Produces-annotated method.
e: 

e:     public abstract void inject(@org.jetbrains.annotations.NotNull()
e:                          ^
e:       android.content.Context is injected at
e:           app.feed.com.ui.MainActivity.context
e:       app.feed.com.ui.MainActivity is injected at
e:           app.feed.com.injection.component.ActivityComponent.inject(p0)
Run Code Online (Sandbox Code Playgroud)

我在 java 中使用相同的代码,它工作正常,但在 kotlin 中它给出错误,ApplicaionComponent依赖项也工作正常。同时我正在使用以下版本的 gradle 和 kotlin

buildscript {
    ext.kotlin_version = '1.1.2-3'
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮助我弄清楚我做错了什么

tyn*_*ynn 5

您注入了财产

@Inject @ActivityContext lateinit var context: Context
Run Code Online (Sandbox Code Playgroud)

仅用 注释该属性@ActivityContext。因此,Dagger正在寻找一个Context没有任何限定符的简单提供程序。相反,你必须用它来注释该字段

@Inject @field:ActivityContext lateinit var context: Context
Run Code Online (Sandbox Code Playgroud)