【问题标题】:Dagger2 + Kotlin: lateinit property appComponent has not been initializedDagger2 + Kotlin:lateinit 属性 appComponent 尚未初始化
【发布时间】:2019-12-15 12:08:21
【问题描述】:

我正在使用 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 尚未初始化

我不明白,请帮帮我。

谢谢!

【问题讨论】:

    标签: android kotlin dagger-2 dagger


    【解决方案1】:

    我在.translateModule(TranslateModule(TranslateProvider())) 中创建了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()
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 2023-03-25
      • 1970-01-01
      • 2019-12-02
      • 2021-06-21
      相关资源
      最近更新 更多