首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dagger-2“延迟属性应用程序尚未初始化”

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

Stack Overflow用户
提问于 2018-12-07 05:57:43
回答 3查看 2.8K关注 0票数 4

我正在尝试将应用程序上下文注入给

“延迟属性应用程序尚未初始化”

异常。

CoreModule.kt

代码语言:javascript
复制
@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。注入是正确的方式,还是我应该使用构造函数注入?

代码语言:javascript
复制
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中

EN

回答 3

Stack Overflow用户

发布于 2018-12-07 07:15:53

问题是你注释了你的字段,但没有注入。您可以像在应用程序类中那样注入字段:DaggerAppComponent.builder().application(this).build().inject(this)

或者,您可以将应用程序字段移到RealmHelper构造函数中,在核心模块中,需要编写一个提供函数来返回应用程序。如果你想看一个例子,我有一个应用程序。https://github.com/volkansahin45/Moneycim

票数 3
EN

Stack Overflow用户

发布于 2018-12-11 03:10:15

我需要这个类中的应用程序上下文。我在这里注射applicationContext。注入是正确的方式,还是我应该使用构造函数注入?

如果可能的话,总是倾向于构造函数注入而不是字段注入。

不需要您的CoreModule。下面的代码就足够了。

代码语言:javascript
复制
@Singleton
class RealmHelper @Inject constructor(private val application: MyApplication) {
//Your implementation 
}

组件中的fun inject(realmHelper: RealmHelper)也是不必要的。

删除这些行应该修复它,我很快就推出了一个演示项目,只是为了确保测试它。这里是一个快速的代码要点。

票数 2
EN

Stack Overflow用户

发布于 2019-07-08 12:57:17

这可能太迟了,但这可能对其他开发人员有帮助。

代码语言:javascript
复制
@set:Inject
internal var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>? = null

用这个代替

代码语言:javascript
复制
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

如果你在其他地方也有同样的错误,也要做同样的事情。使用@set:注入而不是@Inject,使用内部而不是lateinit

这对我来说很有魅力。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53664063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档