2017-08-10 42 views
0

我用dragger2注入演示成科特林活動,主持人爲null,這裏是我的代碼:Dagger2注入主持人成科特林活動錯誤

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!! 
} 

}

的方法getPresenter( )在MvpActivity的onCreate()中被調用,並且MvpActivity是一個java類。初始的演示者需要一些由ProductFilterModule提供的實例,也許演示者應該在組件注入後初始化,我猜。當我運行時,它拋出KotlinNullPointerException,主講人爲空。

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來做到這一點,它沒有問題。

回答

2

Dagger 2不使用setter來注入字段,它直接賦值。因此,正確的版本是:

@Inject internal lateinit var presenter: ProductFilterPresenter 

注意,匕首2需要注射場至少爲internalprivate將無法​​正常工作。

+0

太好了,沒錯,謝謝! –

+0

不客氣!如果您能接受答案,我將不勝感激。 – Egor