Android Hilt 高级用法

发布于:2025-03-01 ⋅ 阅读:(109) ⋅ 点赞:(0)

在这里插入图片描述

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 应用。希望你可以将这些高级用法应用到你的项目中,提高开发效率!


网站公告

今日签到

点亮在社区的每一天
去签到