在kotlin中使用dagger2遇到的一個問題

寫在前面

最近在使用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


而後看控制檯輸出的error

//...
xxadapter cannot be provided without an @Provides- or @Produces-annotated method.
//...複製代碼

猜測

哪裏不對,猜測多是@Named註解的問題,因而把@Named去掉,只保留一個provideHomePagerAdapter方法,發現能夠運行,不報錯了。github

解決

看來確實問題在這裏,猜測難道是@Named註解在kotlin上有問題markdown

  1. 嘗試去自定義了一個Qualifier用來替代@Named,嗯固然仍是不行🚫
  2. 而後想一想網上是否是有會遇到一樣問題的額,結果大多數都在講dagger2集成使用說明什麼的,都是些常規的用法。🚫
  3. 搜了下Stack Overflow 沒有找到,而後在dagger2的issue裏搜了下@Named,沒找到😎(盲人)🚫
  4. 在kotlin交流羣裏問了,零星的幾我的回答,沒效果就沒聲音了。仍是要靠本身。🚫
  5. 因而在github上查看了許多使用Dagger2和kotlin開發的項目,結果都是比較常規的用法,或者各自頁面有本身的component和module,寫成@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語法直接就寫項目的不在少數(雖然說確實轉的快),但多看看文檔也許這個問題就不存在了

因此仍是繼續寫了。見笑了,哈

相關文章
相關標籤/搜索