科特林匕首不注射
我最近从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 } }