最近在使用kotlin和Dagger2來開發項目。須要在dagger2 的module返回兩個相同的對象,所以使用到@Named註解。html
以下圖所示java
@Provides @Named(Constants.Qualifier_HOME) fun provideHomePagerAdapter(): FragmentStatePagerAdapter { return object : AbstractPagerAdapter(fragment.childFragmentManager, arrayOf("android","ios")) { override fun getItem(pos: Int): Fragment? { //...省略 return list[pos] } } } @Provides @Named(Constants.Qualifier_COLLECT) fun provideCollectPagerAdapter(): FragmentStatePagerAdapter { return object : AbstractPagerAdapter(fragment.childFragmentManager, arrayOf("code","article")) { override fun getItem(pos: Int): Fragment? { //...省略 return list[pos] } } }複製代碼
而後各自的頁面裏android
@FragmentScope class HomeFragment : BaseFragment<ViewPagerFragmentBinding>() { @Inject @Named("home") lateinit var adapter: FragmentStatePagerAdapter //...省略 } @FragmentScope class MyCollectFragment : BaseFragment<ViewPagerFragmentBinding>() { @Inject @Named("collect") lateinit var adapter: FragmentStatePagerAdapter //...省略 }複製代碼
照理說這樣是沒問題的(嗯,java代碼是這樣)ios
可是卻遇到了編譯上的問題git
//... xxadapter cannot be provided without an @Provides- or @Produces-annotated method. //...複製代碼
哪裏不對,猜測多是@Named註解的問題,因而把@Named去掉,只保留一個provideHomePagerAdapter
方法,發現能夠運行,不報錯了。github
看來確實問題在這裏,猜測難道是@Named
註解在kotlin上有問題markdown
Qualifier
用來替代@Named
,嗯固然仍是不行🚫難道kotlin有這麼大的缺陷嗎??不該該啊!難道是我代碼有問題。jvm
而後建立了一個java Demo 項目,使用Dagger2進行了@Named嘗試 ------> pass✅ide
6 . 因而就先放着吧,不用@Named ,先在fragment裏用了by lazy 來實例化。——>pass ✅oop
如今項目開發的差很少了,回過頭再來處理它了。
7 . 首先固然仍是百度,google,沒答案就準備去github 的dagger2項目看看,在issue裏搜了一下kotlin
沒什麼相關的問題,卻是看到了一個問題
而後看到了這樣的寫法
嗯🤔好像有點不同,難道要這麼寫?
這個@field是什麼,看過@JvmName @jvmfield 沒見過這一個,那就看下文檔:地址
🤔🤔🤔,試了試———>pass ✅😊
在寫本文時,我又搜了下dagger2的issue,此次搜的是kotlin,而後在closed的問題裏看到了
而後大神回答了這個問題
😂
原本想刪了不發,可是寫本文的初衷
一來是想分享一下這個問題的答案,避免有更多的人踩坑
二來想分享一下本身踩坑時解決的思路和方法(若是夠運的話,第三步就應該解決了)
三來是以爲多看看文檔是有好處的,想來如我這樣看了一下kotlin語法直接就寫項目的不在少數(雖然說確實轉的快),但多看看文檔也許這個問題就不存在了
因此仍是繼續寫了。見笑了,哈