[英]Dagger2 + Kotlin: lateinit property appComponent has not been initialized
I'm using Dagger2 to inject class dependent like bellow. 我正在使用Dagger2注入像下面这样的类依赖。
This is a component for Dagger2, AppComponent.kt: 这是Dagger2 AppComponent.kt的组件:
@Component(modules = [ContextModule::class, SuggestModule::class, RetrofitModule::class,
TranslateModule::class, DatabaseModule::class, ViewModelModule::class, FragmentModule::class])
interface AppComponent {
@Singleton
fun inject(fragment: TranslateFragment)
@Singleton
fun inject(fragment: FavouriteFragment)
@Singleton fun inject(fragment: TensesFragment)
@Singleton
fun inject(activity: TensesActivity)
@Singleton
fun inject(activity: MainActivity)
@Singleton
fun inject(translateViewModel: TranslateViewModel)
@Singleton
fun inject(favouriteViewModel: FavouriteViewModel)
@Singleton
fun inject(translateProvider: TranslateProvider)
}
This is App class extended Application class, where i built my component , App.kt 这是App类的扩展Application类,我在其中构建了组件App.kt
class App : Application() {
companion object{
lateinit var appComponent: AppComponent
}
override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.builder()
.contextModule(ContextModule(this))
.suggestModule(SuggestModule(this))
.retrofitModule(RetrofitModule())
.translateModule(TranslateModule(TranslateProvider()))
.databaseModule(DatabaseModule(DatabaseManager(this)))
.viewModelModule(ViewModelModule())
.fragmentModule(FragmentModule())
.build()
}
}
First, i injected TranslateFragment into MainActivity, MainActivity.kt 首先,我将TranslateFragment注入MainActivity,MainActivity.kt
class MainActivity : AppCompatActivity {
constructor(){
App.appComponent.inject(this)
}
@Inject
lateinit var translateFragment: TranslateFragment
}
Second, i injected TranslateViewModel into TranslateFragment, TranslateFragment.kt 其次,我将TranslateViewModel注入TranslateFragment,TranslateFragment.kt
class TranslateFragment : Fragment {
@Inject
constructor() {
App.appComponent.inject(this)
}
@Inject
lateinit var translateViewModel: TranslateViewModel
}
Third, i injected TranslateProvider into TranslateViewModel, TranslateViewModel.kt 第三,我将TranslateProvider注入TranslateViewModel,TranslateViewModel.kt
class TranslateViewModel : BaseObservable {
@Inject
constructor() {
App.appComponent.inject(this)
}
@Inject
lateinit var translateProvider: TranslateProvider
}
End, i injected RetrofitProvider into TranslateProvider, TranslateProvider.kt 最后,我将RetrofitProvider注入了TranslateProvider,TranslateProvider.kt
class TranslateProvider {
@Inject
constructor() {
App.appComponent.inject(this)
}
@Inject
lateinit var retrofitProvider: RetrofitProvider
}
But i received a error at TranslateProvider.kt: 但是我在TranslateProvider.kt上收到一个错误:
kotlin.UninitializedPropertyAccessException: lateinit property appComponent has not been initialized
kotlin.UninitializedPropertyAccessException:lateinit属性appComponent尚未初始化
I'm not understand, please help me. 我不明白,请帮助我。
Thanks! 谢谢!
I created a instance of TranslateProvider
in: .translateModule(TranslateModule(TranslateProvider()))
我在以下位置创建了
TranslateProvider
的实例: .translateModule(TranslateModule(TranslateProvider()))
When constructor of TranslateProvider
called appComponent
, but appComponent was not initialized that time. 当
TranslateProvider
构造函数调用appComponent
,但那时appComponent尚未初始化。 Just move it go to out of TranslateModule constructor look like: 只需将其移出TranslateModule构造函数即可,如下所示:
Before: 之前:
@Module
class TranslateModule(private val translateProvider: TranslateProvider) {
@Provides
fun getTranslateProvider(): TranslateProvider {
return translateProvider
}
}
After: 后:
@Module
class TranslateModule {
@Provides
fun getTranslateProvider(): TranslateProvider {
return TranslateProvider()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.