2017-06-19 64 views
3

我试图使用Android Dagger ‡ implementation和注入DispatchingAndroidInjector到我Application类:@Inject设置不注入特性

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$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注释的属性访问器,如the documentation概括,但它似乎并不奏效。我究竟做错了什么?

回答

2

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

(写出set明确无助于此,因为它在这种情况下仅代表私人设置器。请注意,字段对于所有属性都是私有的,非私有属性具有适当更广泛的可见性的获取器/设置器。)

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

@Inject 
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity> 

如果你想你的财产是私有的,可以考虑使用构造器注入,而不是。