第一 第二步骤添加依赖和配置
参考官网:
https://developer.android.com/codelabs/android-hilt?hl=zh-cn#0
第三步:Hilt 基础使用
1. 创建 Application 类
kotlin
// MyApp.kt
@HiltAndroidApp
class MyApp : Application()
2. 定义 Hilt 模块
kotlin
// AppModule.kt
@Module
@InstallIn(SingletonComponent::class) // 作用域为整个应用
object AppModule {
@Provides
@Singleton // 单例
fun provideAnalyticsService(): AnalyticsService {
return RetrofitAnalyticsService()
}
}
3. 在 Activity 中注入
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var analytics: AnalyticsService // 自动注入
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
analytics.logEvent("ActivityCreated")
}
}
第四步:Hilt 与 ViewModel 集成
1. 定义 ViewModel
kotlin
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
fun getUser() = repository.getUser()
}
// 依赖的 Repository
class UserRepository @Inject constructor() {
fun getUser() = "User123"
}
2. 在 Activity/Fragment 中使用
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
println(viewModel.getUser()) // 输出 "User123"
}
}
第五步:Hilt 核心注解详解
注解 | 作用域 | 使用场景 |
---|---|---|
@HiltAndroidApp |
Application 类 | 标记应用的入口点,生成 Hilt 的依赖容器 |
@AndroidEntryPoint |
Activity/Fragment 等 | 标记需要依赖注入的 Android 组件 |
@Inject |
构造函数/属性 | 标记需要注入的依赖项(需配合构造函数或字段) |
@Module |
类 | 定义提供依赖的模块 |
@Provides |
模块中的方法 | 在模块中标记具体依赖的创建方法 |
@InstallIn |
模块类 | 指定模块的作用域(如 SingletonComponent 、ActivityComponent 等) |
@HiltViewModel |
ViewModel 类 | 标记支持依赖注入的 ViewModel |
@Binds |
模块中的抽象方法 | 用于接口与实现类的绑定(需配合 @Module ) |
@Singleton |
类/方法 | 声明单例作用域,确保全局唯一实例 |
关键注解对比
@Provides
vs @Binds
@Provides |
@Binds |
|
---|---|---|
实现方式 | 需具体实现对象 | 需抽象方法(接口绑定) |
适用场景 | 需要复杂构造逻辑的依赖(如 Retrofit) | 接口与实现类的直接绑定 |
代码示例 | kotlin<br>@Provides<br>fun provideOkHttp(): OkHttpClient { ... } |
kotlin<br>@Binds<br>abstract fun bindRepo(impl: UserRepoImpl): UserRepo |
@InstallIn
作用域选项
作用域组件 | 生命周期 |
---|---|
SingletonComponent |
应用级别(单例) |
ActivityComponent |
关联 Activity 的生命周期 |
ViewModelComponent |
关联 ViewModel 的生命周期 |
FragmentComponent |
关联 Fragment 的生命周期 |
完整项目结构示例
project-root/
├── gradle/
│ └── libs.versions.toml # 版本管理
├── app/
│ ├── build.gradle.kts # 模块配置
│ └── src/main/
│ ├── MyApp.kt # Hilt 入口
│ ├── di/ # 依赖注入模块
│ │ └── AppModule.kt
│ └── ui/
│ ├── MainActivity.kt
│ └── MainViewModel.kt
└── settings.gradle.kts
常见问题解决
-
编译错误:找不到 Hilt 注解处理器
• 确保在模块级
build.gradle.kts
中正确配置了kapt
:kotlinplugins { id("kotlin-kapt") // 添加 kapt 插件 } dependencies { kapt(libs.hilt.compiler) }
-
@Inject
无法注入接口• 使用
@Binds
或@Provides
在模块中明确绑定接口与实现类。 -
Hilt 与 Compose 集成
• 添加 Navigation 依赖:
implementation(libs.hilt.navigation)
• 在 Compose 中使用
hiltViewModel()
获取 ViewModel。