Android Hilt 高级用法
Hilt 是 Android 官方推荐的依赖注入框架,虽然它提供了简单易用的 API,但在复杂项目中,我们可能需要用到更高级的特性,比如自定义作用域、多模块 DI、绑定接口、多构造函数注入等。
本文将介绍 Hilt 的一些高级用法,并结合实际场景进行讲解。
1. 自定义作用域(Custom Scope)
Hilt 默认提供了一些作用域,如 @SingletonComponent
、@ActivityRetainedComponent
、@ViewModelComponent
等。但是,在某些情况下,我们可能需要自定义作用域。
(1)创建自定义作用域
@Scope
@Retention(AnnotationRetention.RUNTIME)
annotation class CustomScope
(2)创建带有自定义作用域的组件
@Module
@InstallIn(SingletonComponent::class)
object CustomModule {
@CustomScope
@Provides
fun provideCustomService(): CustomService {
return CustomService()
}
}
(3)在类中使用依赖注入
class CustomRepository @Inject constructor(
private val customService: CustomService
) {
fun fetchData() = customService.getData()
}
2. Hilt 多模块依赖注入
在大型项目中,通常会拆分多个模块。Hilt 允许我们在不同的模块中管理依赖关系。
(1)在 Library Module 添加 Hilt 支持
plugins {
id("com.google.dagger.hilt.android")
}
(2)在 Library Module 中定义 Hilt Module
@Module
@InstallIn(SingletonComponent::class)
object LibraryModule {
@Provides
fun provideLibraryDependency(): LibraryDependency {
return LibraryDependency()
}
}
(3)在 App Module 中使用 Library Module 的依赖
class AppRepository @Inject constructor(
private val libraryDependency: LibraryDependency
) {
fun doSomething() = libraryDependency.performAction()
}
3. 绑定接口(@Binds)
在实际开发中,我们通常会使用接口进行面向接口编程,而不是直接注入实现类。Hilt 允许我们使用 @Binds
绑定接口到具体实现。
(1)定义接口和实现类
interface AnalyticsService {
fun trackEvent(event: String)
}
class FirebaseAnalyticsService @Inject constructor(): AnalyticsService {
override fun trackEvent(event: String) {
println("Tracking event: $event")
}
}
(2)使用 @Binds
进行绑定
@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {
@Binds
abstract fun bindAnalyticsService(
firebaseAnalyticsService: FirebaseAnalyticsService
): AnalyticsService
}
(3)在 ViewModel 中使用绑定的接口
@HiltViewModel
class AnalyticsViewModel @Inject constructor(
private val analyticsService: AnalyticsService
) : ViewModel() {
fun logEvent() {
analyticsService.trackEvent("User Logged In")
}
}
4. 多构造函数注入
在某些情况下,一个类可能有多个构造函数,我们可以使用 @AssistedInject
进行灵活的依赖注入。
(1)添加 Assisted Injection 依赖
dependencies {
implementation("com.squareup.inject:assisted-inject-annotations-dagger2:0.6.0")
kapt("com.squareup.inject:assisted-inject-processor-dagger2:0.6.0")
}
(2)创建使用 AssistedInject 的类
@AssistedInject
class MyAssistedClass @AssistedInject constructor(
@Assisted private val param: String,
private val someDependency: SomeDependency
) {
fun doWork() = "Processing $param with ${someDependency.getData()}"
}
(3)创建工厂类
@AssistedFactory
interface MyAssistedFactory {
fun create(param: String): MyAssistedClass
}
(4)在 ViewModel 中使用 Assisted Injection
@HiltViewModel
class MyViewModel @Inject constructor(
private val myAssistedFactory: MyAssistedFactory
) : ViewModel() {
fun getProcessedData(param: String): String {
return myAssistedFactory.create(param).doWork()
}
}
5. 结论
本文介绍了 Hilt 的一些高级用法,包括自定义作用域、多模块依赖注入、接口绑定和多构造函数注入。这些技术可以帮助我们更好地管理依赖,构建灵活、可维护的 Android 应用。希望你可以将这些高级用法应用到你的项目中,提高开发效率!