android-@Inject设置为不注入属性

android-@Inject设置为不注入属性,第1张

概述我正在尝试使用AndroidDagger‡implementation并将DispatchingAndroidInjector注入到我的Application类中:classMyApp:Application(),HasActivityInjector{privatelateinitvardispatchingAndroidInjector:DispatchingAndroidInjector<Activity>@Inject

我正在尝试使用Android Dagger ‡ implementation并将dispatchingAndroIDInjector注入到我的Application类中:

class MyApp : Application(), HasActivityInjector {    private lateinit var dispatchingAndroIDInjector: dispatchingAndroIDInjector<Activity>        @Inject set        overrIDe fun onCreate() {        super.onCreate()        AppInjector.init(this)    }    overrIDe fun activityInjector(): ActivityInjector<Activity> {        return dispatchingAndroIDInjector    }}

但是我得到一个IllegalArgumentExecption,指出“ lateinit属性尚未初始化”:

06-19 10:57:30.773 10797-10797/com.example.app E/AndroIDRuntime: FATAL EXCEPTION: main        Process: com.example.app, PID: 10797        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.ui.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property dispatchingAndroIDInjector has not been initialized            at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2666)            at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)            at androID.app.ActivityThread.-wrap12(ActivityThread.java)            at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)            at androID.os.Handler.dispatchMessage(Handler.java:102)            at androID.os.Looper.loop(Looper.java:154)            at androID.app.ActivityThread.main(ActivityThread.java:6121)            at java.lang.reflect.Method.invoke(Native Method)            at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)            at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:779)         Caused by: kotlin.UninitializedPropertyAccessException: lateinit property dispatchingAndroIDInjector has not been initialized            at com.example.app.MyApp.activityInjector(MyApp.kt:28)            at dagger.androID.AndroIDInjection.inject(AndroIDInjection.java:55)            at com.example.app.injection.AppInjector.handleActivity(AppInjector.kt:41)            at com.example.app.injection.AppInjector.access$handleActivity(AppInjector.kt:14)            at com.example.app.injection.AppInjector$init.onActivityCreated(AppInjector.kt:21)            at androID.app.Application.dispatchActivityCreated(Application.java:197)            at androID.app.Activity.onCreate(Activity.java:961)            at androID.support.v4.app.BaseFragmentActivityGingerbread.onCreate(BaseFragmentActivityGingerbread.java:54)            at androID.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:319)            at com.example.app.ui.MainActivity.onCreate(MainActivity.kt:20)            at androID.app.Activity.performCreate(Activity.java:6682)            at androID.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)            at androID.app.ActivityThread.performlaunchActivity(ActivityThread.java:2619)            at androID.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)             at androID.app.ActivityThread.-wrap12(ActivityThread.java)             at androID.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)             at androID.os.Handler.dispatchMessage(Handler.java:102)             at androID.os.Looper.loop(Looper.java:154)             at androID.app.ActivityThread.main(ActivityThread.java:6121)             at java.lang.reflect.Method.invoke(Native Method)             at com.androID.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)             at com.androID.internal.os.ZygoteInit.main(ZygoteInit.java:779)

这是用于创建AppComponent和注入MyApp依赖项的AppInjector类:

object AppInjector {    fun init(app: MyApp) {        DaggerAppComponent.builder().application(app).build().inject(app)        // ...    }}

和AppComponent接口:

@Singleton@Component(modules = arrayOf(    AndroIDInjectionModule::class,    AppModule::class,    MainActivityModule::class)) interface AppComponent {    @Component.Builder interface Builder {        @BindsInstance fun application(app: Application): Builder        fun build(): AppComponent    }    fun inject(app: MyApp)}

我在属性访问器上使用@Inject注释,如the documentation中所述,但似乎无法正常工作.我究竟做错了什么?

解决方法:

我目前无法对其进行测试,但是我认为这是因为您的财产是私有的. Dagger不使用反射,因此必须在类外部从其可见的位置才能使其运行.

(显式写出set对此无济于事,因为在这种情况下,它仅表示一个私有的setter.请注意,字段对于所有属性都是私有的,而非private属性则具有适当的可见性的getter / setter.)

您还应该能够仅注释属性而不是其设置方法,因此这将是最终结果:

@Injectlateinit var dispatchingAndroIDInjector: dispatchingAndroIDInjector<Activity>

如果您希望属性为私有,请考虑使用构造函数注入.

总结

以上是内存溢出为你收集整理的android-@Inject设置为不注入属性全部内容,希望文章能够帮你解决android-@Inject设置为不注入属性所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存