Dagger2 inject a presenter into a Kotlin Activity error
我使用dragger2将演示者注入Kotlin活动中,演示者为null,这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class CategoryDetailActivity : MvpActivity<ProductFilterView,ProductFilterPresenter>(), ProductFilterView { private lateinit var presenter: ProductFilterPresenter @Inject set override fun onCreate(savedInstanceState: Bundle?) { initialInjector() super.onCreate(savedInstanceState) setContentView(R.layout.activity_category_detail) initData() initEvent() } private fun initialInjector() { DaggerProductFilterComponent.builder() .applicationComponent(applicationComponent) .productFilterModule(ProductFilterModule()) .build() .inject(this) } override fun getPresenter(): ProductFilterPresenter { return presenter!! } |
} ??
在MvpActivity的onCreate()中调用方法getPresenter(),并且MvpActivity是一个Java类。最初,演示者需要由ProductFilterModule提供的某些实例,也许我应该在组件注入后演示者是初始的。当我运行时,抛出KotlinNullPointerException,演示者为Null。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | time: FATAL EXCEPTION: main Process: com.chiquedoll.chiquedoll, PID: 10617 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chiquedoll.chiquedoll/com.chiquedoll.chiquedoll.view.activity.CategoryDetailActivity}: kotlin.KotlinNullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: kotlin.KotlinNullPointerException at com.chiquedoll.chiquedoll.view.activity.CategoryDetailActivity.getPresenter(CategoryDetailActivity.kt:281) at com.chiquedoll.chiquedoll.view.activity.CategoryDetailActivity.getPresenter(CategoryDetailActivity.kt:36) at com.chiquedoll.chiquedoll.view.activity.MvpActivity.onCreate(MvpActivity.java:19) at com.chiquedoll.chiquedoll.view.activity.CategoryDetailActivity.onCreate(CategoryDetailActivity.kt:65) at android.app.Activity.performCreate(Activity.java:6237) |
如果我使用Java来做,那没问题。
Dagger 2不使用setter来注入字段,而是直接分配值。因此,正确的版本将是:
1 | @Inject internal lateinit var presenter: ProductFilterPresenter |
请注意,Dagger 2要求可注入字段至少为