
我是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,在模块中提供应用程序上下文所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)