Dagger2基礎(chǔ)使用

本篇文章將介紹如下內(nèi)容
相關(guān)代碼在這里DaggerDemo

  • Dagger2 兩種基本使用方式

    • 通過(guò)@Inject注解
    • 通過(guò)@Module注解
  • @Provides注解方法參數(shù)(遞歸注入)

Dagger2眾所周知是一個(gè)依賴注入庫(kù)篓叶,簡(jiǎn)單粗暴的說(shuō)法就是幫助完成一個(gè)類初始化/實(shí)例化捂掰。

Dagger2 配置

  • 需要在Module中build.gradle
apply plugin: 'kotlin-kapt'
  • 再引入dagger庫(kù)和注解處理器
implementation 'com.google.dagger:dagger:2.16'
kapt 'com.google.dagger:dagger-compiler:2.16'

Dagger2 兩種基本使用方式

通過(guò)@Inject注解

  • 因?yàn)槟阋跏蓟粋€(gè)對(duì)象毛好,肯定一個(gè)構(gòu)造方法靠柑,所以在構(gòu)造方法加一個(gè)@inject
class Person @Inject constructor() {
    var name = ""
    fun test(context:Context){
        Toast.makeText(context,"名字:$name",Toast.LENGTH_SHORT).show()
    }
}
  • 然后通過(guò)一個(gè)@Component來(lái)將這個(gè)對(duì)象跟你注入的地方聯(lián)系起來(lái)(Component類還有另外一種定義方法,會(huì)在下篇文章說(shuō)明)
@Component
interface MainComponent {
    fun inject(activity: MainActivity)
}
  • 點(diǎn)擊一個(gè)綠色的錘子草慧,會(huì)自動(dòng)生成一個(gè)DaggerMainComponent文件(如下圖)蹬碧,然后你在想要的地方通過(guò)這個(gè)文件完成注入


    DaggerMainComponent.png
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var person: Person

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        DaggerMainComponent.builder().build().inject(this)
        person.name = "測(cè)試"
        btn_inject.setOnClickListener{
            person.test(this)
        }
    }
}

這種情況適用于你知道構(gòu)造方法或者你可以為構(gòu)造方法增加@Inject注解色鸳。但是如果是第三方的類或者是接口就需要下面這種方式

通過(guò)@Module注解

  • 創(chuàng)建一個(gè)接口和它的實(shí)現(xiàn)類()

接口類

interface IJob {
    fun work(context: Context)
}

實(shí)現(xiàn)接口類

class Programmer : IJob {
    override fun work(context: Context) {
        Toast.makeText(context, "敲代碼", Toast.LENGTH_SHORT).show()
    }
}
  • @Module這個(gè)注解類來(lái)給Dagger提供之后需要注入的初始化方法(由@Provides標(biāo)識(shí))
@Module
class MainModule {
    /**
     * 初始化接口
     */
    @Provides
    fun provideIJob():IJob{
        return Programmer()
    }
    /**
     * 初始化第三方
     */
    @Provides
    fun provideGson():Gson{
        return Gson()
    }
}
  • 在@Component注解中與@Module注解的類聯(lián)系起來(lái),賦值給modules的是一個(gè)class的數(shù)組(從 Kotlin 1.2 開始, 注解中的數(shù)組類型參數(shù), 可以通過(guò)新的字面值語(yǔ)法來(lái)指定, 而不必使用 arrayOf 函數(shù))
@Component(modules = [(MainModule::class)])
interface MainComponent {
    fun inject(activity: MainActivity)
}
  • 在Activity中识脆,方式二適用于需要對(duì)@Module注解類做一些相關(guān)操作
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var job:IJob
    
    @Inject
    lateinit var gson:Gson
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //方式一
        DaggerMainComponent.builder().build().inject(this)
        //方式二
        DaggerMainComponent.builder().mainModule(MainModule()).build().inject(this)

        btn_module.setOnClickListener{
            job.work(this)
            val json = gson.toJson(person)
            Log.d("==",json)
        }
    }
}

@Provides注解方法參數(shù)(遞歸注入)

比如我們更改Programmer的構(gòu)造方法為多參

class Programmer(val content:String) : IJob {
    override fun work(context: Context) {
        Toast.makeText(context, "工作內(nèi)容:$content", Toast.LENGTH_SHORT).show()
    }
}

把之前@Provides注解的方法改為

    @Provides
    fun provideIJob(content:String):IJob{
        return Programmer(content)
    }

編譯之后就會(huì)發(fā)現(xiàn)報(bào)錯(cuò)

錯(cuò)誤: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.

這句話意思String類沒(méi)有提供@Inject注解的構(gòu)造方法或者@Provides注解的方法设联。
也就是說(shuō)如果發(fā)現(xiàn)@Provides注解的方法有參數(shù),便會(huì)遞歸尋找這個(gè)參數(shù)的類的@Inject注解的構(gòu)造方法或者@Provides注解的方法灼捂。
如果要改為正確應(yīng)該這樣子离例,增加返回String的方法

    @Provides
    fun provideContent():String{
        return "敲代碼"
    }

最后一點(diǎn),如果一個(gè)類同時(shí)使用了@Provides和@Inject悉稠,@Provides優(yōu)先級(jí)是高于@Inject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宫蛆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子的猛,更是在濱河造成了極大的恐慌耀盗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卦尊,死亡現(xiàn)場(chǎng)離奇詭異叛拷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岂却,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門忿薇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)裙椭,“玉大人,你說(shuō)我怎么就攤上這事署浩∪嗳迹” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵筋栋,是天一觀的道長(zhǎng)炊汤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弊攘,這世上最難降的妖魔是什么抢腐? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮襟交,結(jié)果婚禮上氓栈,老公的妹妹穿的比我還像新娘。我一直安慰自己婿着,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布醋界。 她就那樣靜靜地躺著竟宋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪形纺。 梳的紋絲不亂的頭發(fā)上丘侠,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音逐样,去河邊找鬼蜗字。 笑死,一個(gè)胖子當(dāng)著我的面吹牛脂新,可吹牛的內(nèi)容都是我干的挪捕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼争便,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼级零!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起滞乙,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奏纪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后斩启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體序调,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年兔簇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了发绢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硬耍。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朴摊,靈堂內(nèi)的尸體忽然破棺而出默垄,到底是詐尸還是另有隱情,我是刑警寧澤甚纲,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布口锭,位于F島的核電站,受9級(jí)特大地震影響介杆,放射性物質(zhì)發(fā)生泄漏鹃操。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一春哨、第九天 我趴在偏房一處隱蔽的房頂上張望荆隘。 院中可真熱鬧,春花似錦赴背、人聲如沸椰拒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)燃观。三九已至,卻和暖如春便瑟,著一層夾襖步出監(jiān)牢的瞬間缆毁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工到涂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脊框,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓践啄,卻偏偏與公主長(zhǎng)得像浇雹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屿讽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容