Android Hilt 入門使用實(shí)戰(zhàn)
一 Android Hilt 入門教程實(shí)戰(zhàn)
Hilt 是 Android 官方推薦的 依賴注入框架,它基于 Dagger,簡(jiǎn)化了依賴管理,適用于 MVVM 架構(gòu),提高了代碼的可維護(hù)性。
1?? 為什么要用 Hilt?
在 Android 開(kāi)發(fā)中,們通常需要手動(dòng)創(chuàng)建和管理對(duì)象,例如 ViewModel、Repository、Retrofit 等。Hilt 可以自動(dòng)管理這些對(duì)象的創(chuàng)建和生命周期,讓們專注于業(yè)務(wù)邏輯,而不是手動(dòng)實(shí)例化對(duì)象。
? Hilt 的優(yōu)點(diǎn):
?? 自動(dòng)管理依賴,避免手動(dòng)創(chuàng)建實(shí)例
?? ViewModel 支持,與 Jetpack 組件無(wú)縫集成
?? 作用域管理,不同組件(Activity、Fragment)能獲得合適的對(duì)象
?? 簡(jiǎn)化 Dagger 依賴注入,代碼更簡(jiǎn)潔
2?? Hilt 的基本使用
??(1)添加 Hilt 依賴
與第一點(diǎn)相同
plugins {
id("com.android.application")
id("kotlin-android")
id("kotlin-kapt")
id("com.google.dagger.hilt.android")
}
android {
namespace 'com.test.hiltstudy'
compileSdk 35
defaultConfig {
applicationId "com.test.hiltstudy"
minSdk 24
targetSdk 35
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
//// Allow references to generated code
//kapt {
// correctErrorTypes true
//}
dependencies {
implementation libs.androidx.core.ktx
implementation libs.androidx.appcompat
implementation libs.material
implementation libs.androidx.activity
implementation libs.androidx.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.androidx.junit
androidTestImplementation libs.androidx.espresso.core
// Hilt Dependencies
implementation("com.google.dagger:hilt-android:2.51.1")
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
// Fragment KTX for viewModels() delegate
implementation("androidx.fragment:fragment-ktx:1.6.2")
// ViewModel
// implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
// implementation("androidx.activity:activity-ktx:1.8.1")
//retrofit
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}??(2)初始化 Hilt
在 AndroidManifest.xml:
<application
android:name=".MyApplication"
...>
</application>然后創(chuàng)建 MyApplication.kt:
@HiltAndroidApp class MyApplication : Application()
?? @HiltAndroidApp 用于初始化 Hilt,它會(huì)在 App 啟動(dòng)時(shí)配置依賴注入。
??(3)在 Activity/Fragment 使用 Hilt
在 Activity 里啟用 Hilt
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass // 自動(dòng)注入
}?? @AndroidEntryPoint 標(biāo)記 Activity 以支持 Hilt
?? @Inject lateinit var someClass: SomeClass 直接注入對(duì)象
在 Fragment 里啟用 Hilt
@AndroidEntryPoint
class MainFragment : Fragment() {
@Inject
lateinit var someRepository: SomeRepository
}?? Activity 和 Fragment 都必須加 @AndroidEntryPoint 才能使用 Hilt 注入的對(duì)象!
??(4)在 ViewModel 里使用 Hilt
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: SomeRepository
) : ViewModel() {
fun fetchData() = repository.getData()
}在 Activity 或 Fragment 里:
private val viewModel: MainViewModel by viewModels()
?? Hilt 自動(dòng)創(chuàng)建 MainViewModel,不用 ViewModelProvider 手動(dòng)實(shí)例化。
??(5)創(chuàng)建 Hilt 模塊(Module)
如果 SomeRepository 不能用 @Inject 直接構(gòu)造,比如 Retrofit,們需要 使用 Module 提供實(shí)例:
@Module
@InstallIn(SingletonComponent::class) // 作用于整個(gè)應(yīng)用生命周期
object AppModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
}
@Provides
@Singleton
fun provideApiService(retrofit: Retrofit): ApiService {
return retrofit.create(ApiService::class.java)
}
}?? @Module 標(biāo)記為 Hilt 模塊
?? @Provides 提供依賴
?? @Singleton 表示單例
3?? Hilt 作用域
| 作用域 | 說(shuō)明 | 示例 |
|---|---|---|
@Singleton | 全局單例,應(yīng)用級(jí)共享 | Retrofit、數(shù)據(jù)庫(kù) |
@ActivityScoped | 只在 Activity 里共享 | 共享 ViewModel |
@ViewModelScoped | 只在 ViewModel 里共享 | Repository |
4?? Hilt 實(shí)戰(zhàn)示例
1?? 創(chuàng)建一個(gè) Repository
class SomeRepository @Inject constructor() {
fun getData(): String = "Hello from Repository"
}2?? 在 ViewModel 里注入
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: SomeRepository
) : ViewModel() {
fun fetchData(): String = repository.getData()
}3?? 在 Activity 里獲取數(shù)據(jù)
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<TextView>(R.id.textView).text = viewModel.fetchData()
}
}? 運(yùn)行后,TextView 顯示 "Hello from Repository" ??
5?? 總結(jié)
?? @HiltAndroidApp 讓?xiě)?yīng)用支持 Hilt
?? @AndroidEntryPoint 用于 Activity/Fragment
?? @HiltViewModel 用于 ViewModel
?? @Inject 直接注入類實(shí)例
?? @Module + @Provides 提供無(wú)法直接注入的對(duì)象(如 Retrofit)
?? @Singleton、@ActivityScoped 控制對(duì)象生命周期
Hilt 讓 依賴注入變得簡(jiǎn)單高效,可以自動(dòng)管理對(duì)象,提升代碼的可維護(hù)性。
參考
到此這篇關(guān)于Android Hilt 入門教程_實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Android Hilt 入門內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Kotlin開(kāi)發(fā)實(shí)例(Hello World!)及語(yǔ)法詳解
這篇文章主要介紹了Android Kotlin開(kāi)發(fā)實(shí)例及語(yǔ)法詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android studio 下的APK打包失敗問(wèn)題解決辦法
這篇文章主要介紹了Android studio 下的APK打包失敗問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05
一文詳解Android無(wú)需權(quán)限調(diào)用系統(tǒng)相機(jī)拍照
這篇文章主要為大家介紹了Android無(wú)需權(quán)限調(diào)用系統(tǒng)相機(jī)拍照詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Android左滑返回功能的實(shí)現(xiàn)示例代碼
本篇文章主要介紹了Android左滑返回的實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
使用ViewPager實(shí)現(xiàn)高仿launcher左右拖動(dòng)效果
今天用ViewPager這個(gè)類實(shí)現(xiàn)了同樣的左右拖動(dòng)效果,這樣代碼更少,但是效果是一樣的,ViewPager是實(shí)現(xiàn)左右兩個(gè)屏幕平滑地切換的一個(gè)類,它是Google提供的,有需要的朋友可以了解下2013-01-01
Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

