Kotlin Dagger没有注射

时间:2018-01-22 04:24:01

标签: android kotlin dagger

我最近从java转到kotlin,并试图实现dagger 2的依赖注入。

我已将此添加到我的gradle

apply plugin: 'kotlin-kapt'

implementation "com.google.dagger:dagger:2.11"
kapt "com.google.dagger:dagger-compiler:2.11"
compileOnly 'javax.annotation:jsr250-api:1.0'

这是我的模块

@Module
class AppModule(val context : Context) {
    @Provides
    @Singleton
    fun provideContext() = context
}

这是我的组件

@Singleton
@Component(modules = arrayOf(AppModule::class))
interface AppComponent {
    fun inject(application: Application)
}

这是我的申请

class MyApplication : Application() {
    @Inject
    lateinit var context : Context

    lateinit var appComponent : AppComponent

    override fun onCreate() {
        super.onCreate()

        appComponent = DaggerAppComponent.builder()
                .appModule(AppModule(this.applicationContext))
                .build()
        appComponent.inject(this)
    }
}

这是我的活动

class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        val context = (applicationContext as MyApplication).context
    }
}

我收到此错误

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property context has not been initialized

这段代码是用Java编写的,任何想法如何解决?

2 个答案:

答案 0 :(得分:2)

context属性是在MyApplication类中声明的,但是你在这里注入了Application基类:

fun inject(application: Application)

...没有可注射的属性。您必须在组件中为特定类创建inject方法:

fun inject(application: MyApplication)

Here's一个答案,解释了如何更详细地使用Dagger与层次结构。

答案 1 :(得分:0)

Dagger不是问题。该错误清楚地表明您已声明了一个lateinit的属性,但尚未在Kotlin中初始化它。