科特林匕首不注射

我最近从java移动到kotlin,并尝试实施匕首2dependency injection。

我已经添加到我的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中工作,任何想法如何解决这个?

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

 fun inject(application: Application) 

…没有注射性能 你必须在你的组件中为特定的类创建一个inject方法:

 fun inject(application: MyApplication) 

下面是一个答案,解释如何更详细地使用Dagger和层次结构。

这不是匕首的问题。 这个错误清楚地表明你已经声明了一个属性,但是没有在Kotlin中初始化它。

你必须像下面这样做。 尝试这个,

应用程序类应如下所示。

 class MyApplication : Application() { @Inject lateinit var context : Context companion object { @JvmStatic lateinit var appComponent: AppComponent } override fun onCreate() { super.onCreate() appComponent = DaggerAppComponent.builder() .appModule(AppModule(this.applicationContext)) .build() appComponent.inject(this) } } 

和你的MainActivity像下面。

 class SplashActivity : AppCompatActivity() { @Inject lateinit var context: AppComponent override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) context = (applicationContext as KMDIApplication).context } }