我正在尝试在提供
的类中注入应用程序上下文“ lateinit属性应用程序尚未初始化”
例外。
CoreModule.kt
@Module
open class CoreModule {
@Singleton
@Provides
fun provideRealmHelper(): RealmHelper {
return RealmHelper()
}
}
MyApplication.kt
open class MyApplication : MultiDexApplication(), HasActivityInjector {
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
val log = LoggerFactory.getLogger(this.javaClass)!!
companion object {
var application: MyApplication? = null
fun getInstance(): MyApplication {
return application!!
}
}
override fun onCreate() {
try {
super.onCreate()
application = this
DaggerAppComponent.builder().application(this).build().inject(this)
} catch (e: Exception) {
log.error("Exception in Application", e)
Thread.setDefaultUncaughtExceptionHandler(GlobalExceptionHandler())
}
}
override fun activityInjector() = dispatchingAndroidInjector
}
AppComponent.kt
@Singleton
@Component(modules = [AndroidSupportInjectionModule::class,CoreModule::class])
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: MyApplication): Builder
fun build(): AppComponent
}
fun inject(myApplication: MyApplication)
fun inject(realmHelper: RealmHelper)
}
///我需要在此类中的应用程序上下文。我在这里注入applicationContext。 注入是正确的方法还是应该使用构造函数注入?
RealmHelper.kt
class RealmHelper @Inject constructor() {
//need application context here but getting "lateinit property application has not been initialized
@Inject
lateinit var application: MyApplication
init {
Realm.init(application) // null application
}
}
注意:MyApplication已添加到AndoridManifest.xml
答案 0 :(得分:1)
问题是您注释了字段但未注入。您可以像在应用程序类中一样注入字段:DaggerAppComponent.builder().application(this).build().inject(this)
或者您可以将应用程序字段移至RealmHelper构造函数,并且在核心模块中,您需要编写一个Provide函数以返回应用程序。如果您想查看示例,我有一个应用程序。 https://github.com/volkansahin45/Moneycim
答案 1 :(得分:0)
我在此类中需要应用程序上下文。我注射 这里的applicationContext。是注射是正确的方法还是我应该 使用构造函数注入?
如果可能的话,总是赞成构造函数注入而不是字段注入。
不需要您的CoreModule
。下面的代码就足够了。
@Singleton
class RealmHelper @Inject constructor(private val application: MyApplication) {
//Your implementation
}
组件中的 fun inject(realmHelper: RealmHelper)
也是不必要的。
删除这些行应该解决它,我迅速将一个演示项目放在一起,只是为了对其进行测试以确保。 Here是代码的快速入门。
答案 2 :(得分:0)
这可能为时已晚,但这可能会对其他开发人员有所帮助。
@set:Inject
internal var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>? = null
使用它代替
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
,以防万一您在其他地方遇到相同的错误,请执行相同的操作。使用 @set:Inject 代替 @Inject ,并使用内部代替 lateinit 。
这对我来说就像魅力一样。