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

寫在前面

最近在使用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代碼是這樣)

但是卻遇到了編譯上的問題

image.png

然后看控制臺輸出的error

//...
xxadapter cannot be provided without an @Provides- or @Produces-annotated method.
//...  

猜想

哪里不對,猜想可能是@Named注解的問題,于是把@Named去掉,只保留一個provideHomePagerAdapter方法,發(fā)現(xiàn)可以運行,不報錯了。

解決

看來確實問題在這里,猜想難道是@Named注解在kotlin上有問題

  1. 嘗試去自定義了一個Qualifier用來替代@Named,嗯當然還是不行??
  2. 然后想想網(wǎng)上是不是有會遇到同樣問題的額,結(jié)果大多數(shù)都在講dagger2集成使用說明什么的,都是些常規(guī)的用法。??
  3. 搜了下Stack Overflow 沒有找到,然后在dagger2的issue里搜了下@Named,沒找到??(盲人)??
  4. 在kotlin交流群里問了,零星的幾個人回答,沒效果就沒聲音了。還是要靠自己。??
  5. 于是在github上查看了許多使用Dagger2和kotlin開發(fā)的項目,結(jié)果都是比較常規(guī)的用法,或者各自頁面有自己的component和module,寫成@Named注解的還沒看到。

難道kotlin有這么大的缺陷嗎??不應該啊!難道是我代碼有問題。

然后創(chuàng)建了一個java Demo 項目,使用Dagger2進行了@Named嘗試 ------> pass?

6 . 于是就先放著吧,不用@Named ,先在fragment里用了by lazy 來實例化?!?gt;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ù)寫了。見笑了,哈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評論 25 709
  • 部分內(nèi)容參考自:[Android]使用Dagger 2依賴注入 - DI介紹(翻譯)[Android]使用Dagg...
    AItsuki閱讀 48,126評論 66 356
  • 最近在項目中使用了 Dagger2 這個依賴注入的框架,在這里記錄一下。第一次寫技術(shù)文章,不足之處請多指教。不過真...
    lshilll閱讀 1,586評論 0 0
  • 前言 人生苦多,快來 Kotlin ,快速學習Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,681評論 9 118
  • 什么事情是你想做而沒有做到的呢?如果將“我沒有做到。。?!备某伞拔也灰龅?。。?!保賹偛诺木渥又匦聦懗鰜?。如果...
    棒棒糖Emma閱讀 898評論 0 4

友情鏈接更多精彩內(nèi)容