Android Hilt 学习指南
1. 什么是 Hilt?为什么使用 Hilt?
Hilt 是一个基于 Dagger 的官方 Android 依赖注入(DI)框架,它简化了依赖注入的使用。
为什么使用 Hilt?
- 简化依赖注入:无需编写复杂的 Dagger 代码,Hilt 提供了简单易懂的注解。
- 管理对象生命周期:Hilt 会根据不同的组件(例如 Activity、ViewModel、Application)自动管理依赖对象的创建和销毁。
- 提高代码模块化:使用 Hilt 提供的
@Module
注解使代码更清晰,更易于维护和测试。
2. 使用 Hilt 的基本步骤
步骤 1:添加 Hilt 依赖项
在 build.gradle (Project)
中:
buildscript {
ext.hilt_version = '2.28-alpha'
dependencies {
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}
// 新版本android studio 写法
plugins {
id 'com.google.dagger.hilt.android' version '2.51.1' apply false
}
在 app/build.gradle
中:
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
...
}
dependencies {
implementation("com.google.dagger:hilt-android:2.51.1")
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
}
注意:Hilt 需要 kotlin-kapt
来处理注解。
步骤 2:在应用程序级别启用 Hilt
创建一个继承自 Application
的类,并添加 @HiltAndroidApp
注解。
@HiltAndroidApp
class MyApplication : Application()
目的:允许 Hilt 初始化全局依赖注入。
步骤 3:在 Activity 中使用 Hilt 进行依赖注入
在 MainActivity
中,使用 @AndroidEntryPoint
让 Hilt 自动提供对象:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass // 直接注入对象
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
步骤 4:在 ViewModel 中使用 Hilt 进行依赖注入
ViewModel 不能直接使用 @Inject
,它需要 @HiltViewModel
注解:
@HiltViewModel
class MainViewModel @Inject constructor(
private val someClass: SomeClass,
private val someOtherClass: SomeOtherClass
) : ViewModel() {
fun doWork(callback: (String) -> Unit) {
val result1 = someClass.doSomething()
val result2 = someOtherClass.doSomething()
callback("$result1, $result2")
}
}
步骤 5:创建普通类并让 Hilt 提供实例
方法 1:直接使用 @Inject
注解(适用于简单对象)
如果类 没有构造函数参数,可以直接用 @Inject
标记构造函数:
class SomeClass @Inject constructor() {
fun doSomething() = "Hello Hilt!"
}
Hilt 会自动创建 SomeClass
的实例并在需要的地方注入它。
方法 2:使用 @Module
提供实例(适用于可配置对象)
如果类 不能直接使用 @Inject
(例如,构造函数需要参数),需要在 @Module
中提供它:
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideSomeOtherClass(): SomeOtherClass {
return SomeOtherClass()
}
}
然后创建 SomeOtherClass
:
class SomeOtherClass {
fun doSomething() = "Hello from SomeOtherClass!"
}
3. Hilt 生命周期管理
Hilt 提供了不同的作用域来确定对象的生命周期:
@Singleton
— 应用程序级别,对象在整个应用程序生命周期中存在。@ActivityScoped
— Activity 级别,对象在同一个 Activity 内共享。@ViewModelScoped
— ViewModel 级别,对象绑定到ViewModel
的生命周期。@FragmentScoped
— Fragment 级别,对象在同一个 Fragment 内共享。
例如,如果 SomeOtherClass
只在 Activity
级别存在:
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
@Provides
@ActivityScoped
fun provideSomeOtherClass(): SomeOtherClass {
return SomeOtherClass()
}
}
4. 总结:为什么选择 Hilt?
✅ 简化代码:与 Dagger 相比,需要的样板代码更少。
✅ 易于学习和使用:依赖注入通过注解完成。
✅ 自动生命周期管理:减少了手动管理实例的需求。
✅ 官方支持:推荐用于 Android 开发。
通过遵循本指南,已经学习了如何在 Activity、ViewModel 和 普通类 中使用 Hilt 进行依赖注入。
5. 其他 Hilt 注解
@HiltAndroidApp
标记 Application
类以初始化 Hilt。
@AndroidEntryPoint
标记 Activity
、Fragment
、Service
等,以支持 Hilt 依赖注入。
@Inject
用于构造函数注入和字段注入。
@Module
+ @InstallIn
提供无法直接注入的依赖项。
@Provides
直接提供实例(例如,第三方库)。
@Binds
绑定接口实现(比 @Provides
更高效)。
@Singleton
管理对象的作用域(全局单例)。
@HiltViewModel
在 ViewModel 中支持 Hilt 注入。
@EntryPoint
用于不能直接使用 @AndroidEntryPoint
的类(例如 ContentProvider
、BroadcastReceiver
)。
6. 示例代码
应用程序类
@HiltAndroidApp
class ExampleApplication : Application()
MainActivity
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var someClass: SomeClass
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
MainFragment
@AndroidEntryPoint
class MainFragment : Fragment() {
private val viewModel: MainViewModel by viewModels()
@Inject
lateinit var someRepository: SomeRepository
}
MainViewModel
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: SomeRepository
) : ViewModel() {
fun fetchData() = repository.getData()
}
SomeRepository
class SomeRepository @Inject constructor() {
fun getData(): String = "Hello from Repository"
}
AppModule
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
@Singleton
fun provideSomeOtherClass(): SomeOtherClass {
return SomeOtherClass()
}
}
ApiService
interface ApiService {
@GET("users")
suspend fun getUsers(): List<User>
}
7. 构建和清理项目
为确保一切设置正确,请执行以下步骤:
- 构建 → 清理项目
- 构建 → 重新构建项目
本指南全面概述了在 Android 项目中使用 Hilt 的方法。通过遵循这些步骤,可以轻松管理依赖项并提高代码的模块化和可维护性。