Android Hilt 学习指南-代码部分

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应用程序级别,对象在整个应用程序生命周期中存在。
  • @ActivityScopedActivity 级别,对象在同一个 Activity 内共享。
  • @ViewModelScopedViewModel 级别,对象绑定到 ViewModel 的生命周期。
  • @FragmentScopedFragment 级别,对象在同一个 Fragment 内共享。

例如,如果 SomeOtherClass 只在 Activity 级别存在:

@Module
@InstallIn(ActivityComponent::class)
object ActivityModule {
    
    
    @Provides
    @ActivityScoped
    fun provideSomeOtherClass(): SomeOtherClass {
    
    
        return SomeOtherClass()
    }
}

4. 总结:为什么选择 Hilt?

简化代码:与 Dagger 相比,需要的样板代码更少。
易于学习和使用:依赖注入通过注解完成。
自动生命周期管理:减少了手动管理实例的需求。
官方支持:推荐用于 Android 开发。

通过遵循本指南,已经学习了如何在 ActivityViewModel普通类 中使用 Hilt 进行依赖注入。


5. 其他 Hilt 注解

@HiltAndroidApp

标记 Application 类以初始化 Hilt。

@AndroidEntryPoint

标记 ActivityFragmentService 等,以支持 Hilt 依赖注入。

@Inject

用于构造函数注入和字段注入。

@Module + @InstallIn

提供无法直接注入的依赖项。

@Provides

直接提供实例(例如,第三方库)。

@Binds

绑定接口实现(比 @Provides 更高效)。

@Singleton

管理对象的作用域(全局单例)。

@HiltViewModel

在 ViewModel 中支持 Hilt 注入。

@EntryPoint

用于不能直接使用 @AndroidEntryPoint 的类(例如 ContentProviderBroadcastReceiver)。


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. 构建和清理项目

为确保一切设置正确,请执行以下步骤:

  1. 构建 → 清理项目
  2. 构建 → 重新构建项目

本指南全面概述了在 Android 项目中使用 Hilt 的方法。通过遵循这些步骤,可以轻松管理依赖项并提高代码的模块化和可维护性。