android - 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 尚未初始化
我不明白,请帮助我。
谢谢!
解决方案
我创建了一个实例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()
}
}
推荐阅读
- python-3.x - 使用 python 抓取特定的维基百科表格
- ruby-on-rails - 如何隐藏 Rails 活动存储 blob URL?
- c - 如何列出目录而不包括包含dirent.h的文件?
- python - 在 setUp() 中创建异步事件是 aiounittest 的一个陷阱
- html - 防止元素改变附近元素的位置
- haskell - 如何使用 Haskell/Aeson 中的类型函数解析多态值?
- vb.net - 如何将命令行开关添加到 VB.NET WinForms 应用程序(从 CMD 运行时)?
- node.js - 如何从管理员 ui 中删除 Keystonejs 5 github repo url?
- android - 向 Firebase 中的所有用户推送通知
- python - 为什么这个 ML 模型的准确率为零?