寫在前面
最近在使用kotlin和Dagger2來開發(fā)項目。需要在dagger2 的module返回兩個相同的對象彭沼,因此使用到@Named注解。
如下圖所示
@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]
}
}
}
然后各自的頁面里
@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代碼是這樣)
但是卻遇到了編譯上的問題
然后看控制臺輸出的error
//...
xxadapter cannot be provided without an @Provides- or @Produces-annotated method.
//...
猜想
哪里不對姓惑,猜想可能是@Named注解的問題,于是把@Named去掉按脚,只保留一個provideHomePagerAdapter
方法于毙,發(fā)現(xiàn)可以運行,不報錯了乘寒。
解決
看來確實問題在這里,猜想難道是@Named
注解在kotlin上有問題
- 嘗試去自定義了一個
Qualifier
用來替代@Named
望众,嗯當然還是不行?? - 然后想想網(wǎng)上是不是有會遇到同樣問題的額,結(jié)果大多數(shù)都在講dagger2集成使用說明什么的,都是些常規(guī)的用法伞辛。??
- 搜了下Stack Overflow 沒有找到烂翰,然后在dagger2的issue里搜了下@Named,沒找到??(盲人)??
- 在kotlin交流群里問了蚤氏,零星的幾個人回答甘耿,沒效果就沒聲音了。還是要靠自己竿滨。??
- 于是在github上查看了許多使用Dagger2和kotlin開發(fā)的項目佳恬,結(jié)果都是比較常規(guī)的用法捏境,或者各自頁面有自己的component和module,寫成@Named注解的還沒看到毁葱。
難道kotlin有這么大的缺陷嗎垫言??不應該扒憬恕筷频!難道是我代碼有問題。
然后創(chuàng)建了一個java Demo 項目前痘,使用Dagger2進行了@Named嘗試 ------> pass?
6 . 于是就先放著吧凛捏,不用@Named ,先在fragment里用了by lazy 來實例化∏鄣蓿——>pass ?
現(xiàn)在項目開發(fā)的差不多了坯癣,回過頭再來處理它了。
7 . 首先當然還是百度最欠,google示罗,沒答案就準備去github 的dagger2項目看看,在issue里搜了一下kotlin
沒什么相關(guān)的問題窒所,倒是看到了一個問題
然后看到了這樣的寫法
嗯??好像有點不一樣鹉勒,難道要這么寫?
這個@field是什么吵取,看過@JvmName @jvmfield 沒見過這一個禽额,那就看下文檔:地址
??????,試了試———>pass ???
結(jié)語
在寫本文時皮官,我又搜了下dagger2的issue脯倒,這次搜的是kotlin,然后在closed的問題里看到了
然后大神回答了這個問題
??
本來想刪了不發(fā)捺氢,但是寫本文的初衷
一來是想分享一下這個問題的答案藻丢,避免有更多的人踩坑
二來想分享一下自己踩坑時解決的思路和方法(如果夠運的話,第三步就應該解決了)
三來是覺得多看看文檔是有好處的摄乒,想來如我這樣看了一下kotlin語法直接就寫項目的不在少數(shù)(雖說確實轉(zhuǎn)的快)悠反,但多看看文檔也許這個問題就不存在了
所以還是繼續(xù)寫了。見笑了馍佑,哈