一、Hilt核心概念快速理解
1. 什么是Hilt?
-
基于Dagger的Android专属DI框架
-
Google官方推荐,简化了Dagger的配置
-
自动生成大量模板代码
2. 核心注解(先掌握这几个关键的):
@HiltAndroidApp // Application类上使用
@AndroidEntryPoint // Activity/Fragment/View/Service等
@Inject // 依赖注入
@Module // 提供依赖的模块
@InstallIn // 指定模块作用范围
二、紧急上手的实战步骤
步骤1:基础配置
在项目级 build.gradle:
buildscript {
dependencies {
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48'
}
}
在app模块的 build.gradle:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
}
dependencies {
implementation "com.google.dagger:hilt-android:2.48"
kapt "com.google.dagger:hilt-compiler:2.48"
}
步骤2:初始化Hilt
创建/修改Application类:
@HiltAndroidApp
class MyApplication : Application()
在 AndroidManifest.xml中配置:
<application
android:name=".MyApplication"
...>
步骤3:第一个依赖注入实例
场景:在Activity中注入一个Repository
-
定义要注入的类:
class UserRepository @Inject constructor() {
fun getUsers() = listOf("User1", "User2")
}
2.在Activity中注入:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var userRepository: UserRepository
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 直接使用,无需手动初始化
val users = userRepository.getUsers()
}
}
三、项目实战模式
模式1:接口绑定(最常用)
// 定义接口
interface ApiService {
fun fetchData()
}
// 实现类
class RealApiService @Inject constructor() : ApiService {
override fun fetchData() { /* 实现 */ }
}
// 提供依赖的Module
@Module
@InstallIn(ActivityComponent::class)
object AppModule {
@Provides
fun provideApiService(service: RealApiService): ApiService = service
}
// 在Activity中使用
@AndroidEntryPoint
class MyActivity : AppCompatActivity() {
@Inject
lateinit var apiService: ApiService
}
模式2:带参数的依赖
class UserRepository @Inject constructor(
private val apiService: ApiService,
private val localData: LocalDataSource
) {
// 自动注入两个依赖
}
模式3:ViewModel注入(重要!)
@HiltViewModel
class MainViewModel @Inject constructor(
private val repository: UserRepository
) : ViewModel() {
// ViewModel逻辑
}
// 在Activity/Fragment中获取
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
}
四、快速排查技巧
常见错误及解决:
-
编译错误:缺少依赖
> 确保使用了 kapt 而不是 annotationProcessor
> 确认所有 @Module 都有 @InstallIn
2. 运行时:lateinit property未初始化
> 检查类是否添加了 @AndroidEntryPoint
> 父类也需要支持Hilt(Fragment->FragmentActivity)
3. 作用域问题
// 单例应用级别
@Module
@InstallIn(SingletonComponent::class)
object AppModule
// Activity级别
@Module
@InstallIn(ActivityComponent::class)
object ActivityModule
五、项目中的最佳实践
分层结构建议:
com.example.app
├── di/
│ ├── AppModule.kt # 全局单例
│ ├── NetworkModule.kt # 网络相关
│ └── DatabaseModule.kt # 数据库相关
├── data/
│ ├── repositories/ # 仓库层
│ └── datasources/ # 数据源
└── presentation/
├── viewmodels/ # ViewModel
└── ui/ # Activity/Fragment
实用代码片段:
// 1. 提供Retrofit实例
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
@Provides
fun provideApiService(retrofit: Retrofit): ApiService =
retrofit.create(ApiService::class.java)
}
1604

被折叠的 条评论
为什么被折叠?



