@Inject设置不注入属性

我正在尝试使用Android Dagger‡实现,并将一个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 } } 

但是我得到一个lateinit说明,说明“ 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$1.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注释,但似乎没有工作。 我究竟做错了什么?

我现在不能测试,但是我认为这是因为你的财产是私人的。 匕首不使用反射,所以它注入的字段必须从课堂外可见,才能运行。

(明确写出set对此没有帮助,因为在这种情况下它只是一个私有的setter。请注意,字段对于所有属性是私有的,非私有属性具有适当的更广泛的可见性的getter / setter。

你也应该能够注释属性而不是setter,所以这将是最终的结果:

 @Inject lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity> 

如果你想要你的财产是私人的,请考虑使用构造函数注入。