首页 > 解决方案 > Dagger2 + Kotlin:lateinit 属性 appComponent 尚未初始化

问题描述

我正在使用 Dagger2 注入类依赖,如下所示。

这是 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)
}

这是应用程序类扩展应用程序类,我在其中构建了我的组件,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()
    }
}

首先,我将 TranslateFragment 注入 MainActivity,MainActivity.kt

class MainActivity : AppCompatActivity {

    constructor(){
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateFragment: TranslateFragment
}

其次,我将TranslateViewModel注入TranslateFragment,TranslateFragment.kt

class TranslateFragment : Fragment {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateViewModel: TranslateViewModel
}

第三,我将TranslateProvider注入TranslateViewModel,TranslateViewModel.kt

class TranslateViewModel : BaseObservable {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateProvider: TranslateProvider
}

最后,我将 RetrofitProvider 注入 TranslateProvider,TranslateProvider.kt

class TranslateProvider {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var retrofitProvider: RetrofitProvider
}

但我在 TranslateProvider.kt 收到错误:

kotlin.UninitializedPropertyAccessException:lateinit 属性 appComponent 尚未初始化

我不明白,请帮助我。

谢谢!

标签: androidkotlindagger-2dagger

解决方案


我创建了一个实例TranslateProvider.translateModule(TranslateModule(TranslateProvider()))

TranslateProvider调用的构造函数时appComponent,但 appComponent 没有被初始化。只需将其移出 TranslateModule 构造函数,如下所示:

前:

@Module
class TranslateModule(private val translateProvider: TranslateProvider) {

    @Provides
    fun getTranslateProvider(): TranslateProvider {
        return translateProvider
    }

}

后:

@Module
class TranslateModule {

    @Provides
    fun getTranslateProvider(): TranslateProvider {
        return TranslateProvider()
    }

}

推荐阅读