android–Dagger 2,在模块中提供应用程序上下文

android–Dagger 2,在模块中提供应用程序上下文,第1张

概述我是Android开发中的新手,也是DI中的新手.我在个人项目中使用Kotlin,我正在尝试使用Dagger2.我设法将它设置为一个util类,但是我需要有一个上下文来使用它来注入一个需要上下文的类(一个sharedprefmanager)我失败了.这是我的代码,这是我得到的错误(NPE).先感谢您.我的模块类pa

我是Android开发中的新手,也是DI中的新手.我在个人项目中使用Kotlin,我正在尝试使用Dagger 2.我设法将它设置为一个util类,但是我需要有一个上下文来使用它来注入一个需要上下文的类(一个sharedpref manager)我失败了.这是我的代码,这是我得到的错误(NPE).先感谢您.

我的模块类

package com.androID.pineimport androID.content.Contextimport com.androID.pine.utils.SharedPreferencesManagerimport dagger.Moduleimport dagger.ProvIDesimport javax.inject.Singleton@Moduleclass AppModule {    @ProvIDes    @Singleton    fun context(pineApplication: PineApplication): Context = pineApplication.applicationContext    @ProvIDes    @Singleton    fun provIDeSharedPrefManager(context: Context): SharedPreferencesManager = SharedPreferencesManager(context)}

我的组件类:

package com.androID.pineimport com.androID.pine.home.HomePresenterimport com.androID.pine.home.categorIEs.categoryAdapterimport dagger.Componentimport javax.inject.Singleton@Singleton@Component(modules = arrayOf(AppModule::class))interface AppComponent {    fun inject(categoryAdapter: categoryAdapter)    fun inject(homePresenter: HomePresenter)}

编辑:添加以下信息,
我如何调用sharedPreferencesManager的注入:

class HomePresenter : BasePresenter<HomeVIEw>() {    @Inject    lateinit var sharedPreferencesManager: SharedPreferencesManager...

同样在我的HomePresenter类中,在onAttached方法覆盖:

 DaggerAppComponent.create().inject(this)

我的pineApplication类和SharedPrefManager类看起来像这样:

class PineApplication @Inject constructor(): Application()

SharedPref:

class SharedPreferencesManager @Inject constructor(context: Context) {...

崩溃,无法获取pineApplication.getContext()(编辑,添加了完整的堆栈跟踪)

     06-02 11:57:01.028 14840-14840/com.androID.pine.deBUG E/AndroIDRuntime: FATAL EXCEPTION: mainProcess: com.androID.pine.deBUG, PID: 14840java.lang.RuntimeException: Unable to resume activity {com.androID.pine.deBUG/com.androID.pine.home.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'androID.content.Context androID.content.Context.getApplicationContext()' on a null object reference    at androID.app.ActivityThread.performResumeActivity(ActivityThread.java:3429)    at androID.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469)    at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732)    at androID.app.ActivityThread.-wrap12(ActivityThread.java)    at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)    at androID.os.Handler.dispatchMessage(Handler.java:102)    at androID.os.Looper.loop(Looper.java:154)    at androID.app.ActivityThread.main(ActivityThread.java:6119)    at java.lang.reflect.Method.invoke(Native Method)    at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)    at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:776) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androID.content.Context androID.content.Context.getApplicationContext()' on a null object reference    at androID.content.Contextwrapper.getApplicationContext(Contextwrapper.java:106)    at com.androID.pine.AppModule.context(AppModule.kt:12)    at com.androID.pine.AppModule_ContextFactory.proxyContext(AppModule_ContextFactory.java:34)    at com.androID.pine.DaggerAppComponent.getContext(DaggerAppComponent.java:29)    at com.androID.pine.DaggerAppComponent.getSharedPreferencesManager(DaggerAppComponent.java:34)    at com.androID.pine.DaggerAppComponent.injectHomePresenter(DaggerAppComponent.java:59)    at com.androID.pine.DaggerAppComponent.inject(DaggerAppComponent.java:49)    at com.androID.pine.home.HomePresenter.onAttached(HomePresenter.kt:31)    at com.androID.pine.home.HomePresenter.onAttached(HomePresenter.kt:10)    at com.androID.pine.core.BaseActivity.onResume(BaseActivity.kt:34)    at androID.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269)    at androID.app.Activity.performResume(Activity.java:6783)    at androID.app.ActivityThread.performResumeActivity(ActivityThread.java:3406)    at androID.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469)     at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732)     at androID.app.ActivityThread.-wrap12(ActivityThread.java)     at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)     at androID.os.Handler.dispatchMessage(Handler.java:102)     at androID.os.Looper.loop(Looper.java:154)     at androID.app.ActivityThread.main(ActivityThread.java:6119)     at java.lang.reflect.Method.invoke(Native Method)     at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)     at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

解决方法:

您不能使用类PineApplication @Inject构造函数():Application()来创建PineApplication.它是一个框架类,必须由AndroID Framework创建.

这样做Dagger将创建PineApplication,但applicationContext将返回null,因为它从未被初始化(由系统).

不要对框架类使用构造函数注入,也不要自己创建.使用@Bindsintance将对象添加到组件及其构建器,或使用模块提供它.

总结

以上是内存溢出为你收集整理的android – Dagger 2,在模块中提供应用程序上下文全部内容,希望文章能够帮你解决android – Dagger 2,在模块中提供应用程序上下文所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1104887.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存