5. 【淺入深出理解 dagger双揪、Hilt】 - Hilt進階之MVVM

該章站在企業(yè)項目角度上如何在MVVM框架上完善并且合理的使用Hilt县耽。

所以如果沒了解MVVM的結構建議可以直接忽略這章句喷。大家知道,MVVM里面View和Model之間有關聯(lián)兔毙,假設一個場景View觸發(fā)一個點擊事件調用Model查詢唾琼,然后Model會調用相關Http類進行查詢,返回數據給Model澎剥,Model再返回數據給View父叙。
當然上述表達的不是嚴格意義的MVVM,但是流程相仿肴裙,主要是講解如何注解Model和相關Http類,讓他們自動生成

讓我們先看看有哪些類


image.png
類名 解釋
MyApplication app的入口
MainActivity 顧名思義就是展示的View
ViewModel MainActivity對應的ViewModel涌乳,也是MVVM中的Model
TestApi 一個仿造Http的類蜻懦,只是單純返回一個數據
NetworkModule 一個制造類,Hilt通過標記自動尋找相關類夕晓,然后會找到該類調用相關函數實例化TestApi

那么讓我們直接快速講解

1. 在Project的build.gradle添加引入
    dependencies {
        ...
        classpath "com.google.dagger:hilt-android-gradle-plugin:2.36"
    }
2. 在module的build.gradle分別兩處地方添加
plugins {
    ...
    id 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}
dependencies {
    ……

    implementation "com.google.dagger:hilt-android:2.37"
    kapt "com.google.dagger:hilt-android-compiler:2.37"
}

好了宛乃!添加相關插件自動下載后,我們繼續(xù)蒸辆!

3. HiltAndroidApp標記Application
@HiltAndroidApp
class MyApplication : Application()

跟dagger有點不一樣的是征炼,必須包含一個帶有 @HiltAndroidApp標記的Application類。
當然躬贡,別忘記修改AndroidManifest.xml

<application
        android:allowBackup="true"
        android:name=".MyApplication"
        ...
</application>
5. Activity
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    private val viewModel: ViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.tvName.append(viewModel.shopBanner.toString())
    }
}

大家看到viewModel就很奇怪谆奥,沒有標記就能自動生成使用了?其實by viewModels()就已經代表Hilt生成處理了拂玻。讓我們往下看

4. 創(chuàng)建一個仿造訪問網絡數據的TestApi 類
class TestApi {
    fun getValue(): Int {
        return 1
    }
}

只是一個簡單的創(chuàng)建返回數據類

5. ViewModel

可以同時看到兩個標記@HiltViewModel@Inject,那么TestApi在哪里實例化呢酸些?Activity也沒有創(chuàng)建TestApi呀,這就是Hilt方便的地方檐蚜,讓我們看下一個NetworkModule

@HiltViewModel
class ViewModel @Inject constructor(
    testApi: TestApi
) : ViewModel() {

    val shopBanner = testApi.getValue()
}
6. NetworkModule

通過@Module魄懂、@InstallIn@Provides闯第、@Singleton等多個標記市栗,讓Hilt尋找TestApi的構造方法的時候,找到這里,并且調用GetApi方法創(chuàng)建實例填帽。

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    @Provides
    @Singleton
    fun GetApi(): TestApi {
        return TestApi()
    }

}
7. End

基本就結束了蛛淋,那么大家很奇怪,其實很簡單兩句話代碼放在MainActivity直接實例化不就行了嗎盲赊,其實不是這樣的铣鹏,當項目越龐大的時候,可能改變構造函數的時候哀蘑,那么我們使用Hilt就能很方便的集中在類似NetworkModule這樣的類處理诚卸,而在Activity這些類中,我們是不需要關心構造函數的绘迁。如果你覺得理解還抽象合溺,那么建議先用平常方式寫Mvvm,最后再用Hilt優(yōu)化這方面缀台,或許會有更深入的理解呢棠赛!

標記符講解表格

標記符 標記是為了什么
@Module 標記一個module,代表提供一些無法用構造@Inject的依賴, 比如接口, 第三方庫類型, Builder模式構造的對象等
@InstallIn 委托Hilt幫我們管理范圍膛腐,以管理對象的生命周期睛约,通過指定 Hilt 組件告訴 Hilt 綁定在哪些容器中可用,有很多種容器具體可以看圖1
@Provides 提供實例哲身,注釋函數辩涝,以告訴 Hilt 如何提供無法注入構造函數的 類型
@ViewModelScoped 當在ViewModel中引入協(xié)程,如果直接使用CoroutineScope勘天,那么需要在onCleared()方法中取消協(xié)程怔揩,如果忘記取消協(xié)程那么會導致出現內存泄漏等各種問題,此時需要使用ViewModel擴展屬性viewModelScope來實現協(xié)程作用域

作用域

圖1

只是簡單介紹依賴注入使用方式的實例源碼如下:
zhongjhATC/HiltAndDaggerDemo: 演示 Hilt脯丝、Dagger 的demo (github.com)

其他相關文章
1. 【淺入深出理解 dagger商膊、Hilt】 - 簡介 - 簡書 (jianshu.com)
2. 【淺入深出理解 dagger、Hilt】 - dagger無參依賴注入 - 簡書 (jianshu.com)
3. 【淺入深出理解 dagger宠进、Hilt】 - dagger有參依賴注入 - 簡書 (jianshu.com)
4. 【淺入深出理解 dagger晕拆、Hilt】 - Hilt - 簡書 (jianshu.com)
在 Android 應用中使用 Hilt | Google Developers

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市材蹬,隨后出現的幾起案子潦匈,更是在濱河造成了極大的恐慌,老刑警劉巖赚导,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茬缩,死亡現場離奇詭異,居然都是意外死亡吼旧,警方通過查閱死者的電腦和手機凰锡,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掂为,你說我怎么就攤上這事裕膀。” “怎么了勇哗?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵昼扛,是天一觀的道長。 經常有香客問我欲诺,道長抄谐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任扰法,我火速辦了婚禮蛹含,結果婚禮上,老公的妹妹穿的比我還像新娘塞颁。我一直安慰自己浦箱,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布祠锣。 她就那樣靜靜地躺著酷窥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伴网。 梳的紋絲不亂的頭發(fā)上竖幔,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音是偷,去河邊找鬼。 笑死募逞,一個胖子當著我的面吹牛蛋铆,可吹牛的內容都是我干的。 我是一名探鬼主播放接,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼刺啦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纠脾?” 一聲冷哼從身側響起玛瘸,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苟蹈,沒想到半個月后糊渊,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡慧脱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年渺绒,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宗兼,死狀恐怖躏鱼,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情殷绍,我是刑警寧澤染苛,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站主到,受9級特大地震影響茶行,放射性物質發(fā)生泄漏。R本人自食惡果不足惜镰烧,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一拢军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怔鳖,春花似錦茉唉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至献幔,卻和暖如春懂傀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜡感。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工蹬蚁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郑兴。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓犀斋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親情连。 傳聞我的和親對象是個殘疾皇子叽粹,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容