Android Hilt 入门教程_实战
一 Android Hilt 入门教程实战
Hilt 是 Android 官方推荐的 依赖注入框架,它基于 Dagger,简化了依赖管理,适用于 MVVM 架构,提高了代码的可维护性。
1️⃣ 为什么要用 Hilt?
在 Android 开发中,们通常需要手动创建和管理对象,例如 ViewModel、Repository、Retrofit 等。Hilt 可以自动管理这些对象的创建和生命周期,让们专注于业务逻辑,而不是手动实例化对象。
✅ Hilt 的优点:
✔️ 自动管理依赖,避免手动创建实例
✔️ ViewModel 支持,与 Jetpack 组件无缝集成
✔️ 作用域管理,不同组件(Activity、Fragment)能获得合适的对象
✔️ 简化 Dagger 依赖注入,代码更简洁
2️⃣ Hilt 的基本使用
📌(1)添加 Hilt 依赖
与第一点相同
plugins {id("com.android.application")id("kotlin-android")id("kotlin-kapt")id("com.google.dagger.hilt.android")
}android {namespace 'com.test.hiltstudy'compileSdk 35defaultConfig {applicationId "com.test.hiltstudy"minSdk 24targetSdk 35versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}kotlinOptions {jvmTarget = '1.8'}
}//// Allow references to generated code
//kapt {
// correctErrorTypes true
//}dependencies {implementation libs.androidx.core.ktximplementation libs.androidx.appcompatimplementation libs.materialimplementation libs.androidx.activityimplementation libs.androidx.constraintlayouttestImplementation libs.junitandroidTestImplementation libs.androidx.junitandroidTestImplementation libs.androidx.espresso.core// Hilt Dependenciesimplementation("com.google.dagger:hilt-android:2.51.1")kapt("com.google.dagger:hilt-android-compiler:2.51.1")// Fragment KTX for viewModels() delegateimplementation("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")
//retrofitimplementation("com.squareup.retrofit2:converter-gson:2.9.0")}
📌(2)初始化 Hilt
在 AndroidManifest.xml:
<applicationandroid:name=".MyApplication"...>
</application>
然后创建 MyApplication.kt:
@HiltAndroidApp
class MyApplication : Application()
🔹 @HiltAndroidApp 用于初始化 Hilt,它会在 App 启动时配置依赖注入。
📌(3)在 Activity/Fragment 使用 Hilt
在 Activity 里启用 Hilt
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {@Injectlateinit var someClass: SomeClass // 自动注入
}
🔹 @AndroidEntryPoint 标记 Activity 以支持 Hilt
🔹 @Inject lateinit var someClass: SomeClass 直接注入对象
在 Fragment 里启用 Hilt
@AndroidEntryPoint
class MainFragment : Fragment() {@Injectlateinit var someRepository: SomeRepository
}
💡 Activity 和 Fragment 都必须加 @AndroidEntryPoint 才能使用 Hilt 注入的对象!
📌(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 自动创建 MainViewModel,不用 ViewModelProvider 手动实例化。
📌(5)创建 Hilt 模块(Module)
如果 SomeRepository 不能用 @Inject 直接构造,比如 Retrofit,们需要 使用 Module 提供实例:
@Module
@InstallIn(SingletonComponent::class) // 作用于整个应用生命周期
object AppModule {@Provides@Singletonfun provideRetrofit(): Retrofit {return Retrofit.Builder().baseUrl("https://api.example.com/").addConverterFactory(GsonConverterFactory.create()).build()}@Provides@Singletonfun provideApiService(retrofit: Retrofit): ApiService {return retrofit.create(ApiService::class.java)}
}
🔹 @Module 标记为 Hilt 模块
🔹 @Provides 提供依赖
🔹 @Singleton 表示单例
3️⃣ Hilt 作用域
| 作用域 | 说明 | 示例 |
|---|---|---|
@Singleton | 全局单例,应用级共享 | Retrofit、数据库 |
@ActivityScoped | 只在 Activity 里共享 | 共享 ViewModel |
@ViewModelScoped | 只在 ViewModel 里共享 | Repository |
4️⃣ Hilt 实战示例
1️⃣ 创建一个 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 里获取数据
@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()}
}
✅ 运行后,TextView 显示 "Hello from Repository" 🎉
5️⃣ 总结
🔹 @HiltAndroidApp 让应用支持 Hilt
🔹 @AndroidEntryPoint 用于 Activity/Fragment
🔹 @HiltViewModel 用于 ViewModel
🔹 @Inject 直接注入类实例
🔹 @Module + @Provides 提供无法直接注入的对象(如 Retrofit)
🔹 @Singleton、@ActivityScoped 控制对象生命周期
Hilt 让 依赖注入变得简单高效,可以自动管理对象,提升代码的可维护性。
参考
google Hilt 教程
