@Inject 设置不注入 属性
@Inject set Not Injecting Property
我正在尝试使用 Android Dagger ‡ implementation 并将 DispatchingAndroidInjector
注入我的 Application
class:
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
class:
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 不使用反射,因此它注入的字段必须从 class 外部可见才能运行。
(明确地写出 set
对此没有帮助,因为在这种情况下它只代表私有 setter。请注意,字段对于所有属性和非私有属性都是私有的getters/setters 具有更广泛的可见性。)
您还应该能够只注释 属性 而不是它的 setter,所以这将是最终结果:
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
如果您希望 属性 是私有的,请考虑改用构造函数注入。
不要使用lateinit,而是使用internal。
改变这个
private lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject set
至
private internal var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject set
我正在尝试使用 Android Dagger ‡ implementation 并将 DispatchingAndroidInjector
注入我的 Application
class:
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
class:
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 不使用反射,因此它注入的字段必须从 class 外部可见才能运行。
(明确地写出 set
对此没有帮助,因为在这种情况下它只代表私有 setter。请注意,字段对于所有属性和非私有属性都是私有的getters/setters 具有更广泛的可见性。)
您还应该能够只注释 属性 而不是它的 setter,所以这将是最终结果:
@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
如果您希望 属性 是私有的,请考虑改用构造函数注入。
不要使用lateinit,而是使用internal。
改变这个
private lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject set
至
private internal var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>
@Inject set