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上收到一个错误:

科特林。UninitializedPropertyAccessException: lateinit property appComponent 尚未初始化

我不明白,请帮帮我。

谢谢!

我在以下位置创建了一个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()
}
}

最新更新