Dagger-2“ lateinit属性应用程序尚未初始化”

时间:2018-12-07 05:57:44

标签: android dagger-2

我正在尝试在提供

的类中注入应用程序上下文
  

“ 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

3 个答案:

答案 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

这对我来说就像魅力一样。