Android Hilt 入门教程_注解汇总

一 @Inject注解

@Inject 是 Hilt 依赖注入的核心注解,它的作用是 让 Hilt 知道如何创建和提供一个类的实例 ,从而 自动管理对象的依赖关系 。提到的两种使用方式(构造函数注入字段注入 )确实是 @Inject 的两个关键用途,下面详细解释。


📌 1. @Inject 作用之一:构造函数注入

构造函数注入(Constructor Injection)用于 告诉 Hilt 如何创建一个类的实例 。当一个类的构造函数上加上 @Inject,Hilt 就会自动知道如何实例化它。

✅ 示例

kotlin 复制代码
class SomeClass @Inject constructor() {
    fun doSomething() = "Hello Hilt!"
}
  • @Inject constructor() 告诉 Hilt 这个类可以被自动创建 ,无需手动 new SomeClass()
  • 任何需要 SomeClass 的地方,Hilt 都可以自动提供它
  • 适用于 无状态类(即不需要复杂的初始化)

🚀 使用 @Inject 的优势

无需手动 new 对象 ,Hilt 负责实例化

减少样板代码 ,避免工厂模式(Factory)或手写依赖注入

保证依赖一致性 ,不会意外创建多个 SomeClass 实例


📌 2. @Inject 作用之二:字段注入

字段注入(Field Injection)用于 在类内部自动注入依赖对象 ,通常用于 ActivityFragmentViewModel,因为它们的实例是由 Android 框架创建的,不能使用构造函数注入。

✅ 示例

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject
    lateinit var someClass: SomeClass  // 自动注入

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 使用被 Hilt 自动注入的对象
        Log.d("HiltExample", someClass.doSomething()) // 输出 "Hello Hilt!"
    }
}

📌 关键点

  1. @Inject lateinit var someClass: SomeClass
    • 让 Hilt 自动创建 SomeClass 实例,并注入到 someClass 变量中
    • 不需要 new SomeClass()
  2. @AndroidEntryPoint 必须加在 ActivityFragment ,否则 Hilt 无法注入
    • 这是因为 ActivityFragment 由 Android 框架管理,Hilt 需要特殊处理它们的依赖注入

🚀 使用 @Inject 的优势

Hilt 自动创建并注入实例 ,无需手动初始化

避免 lateinit 为空的问题 ,Hilt 负责对象生命周期

简化依赖管理,代码更清晰、可维护性更强


📌 3. @Inject 与 Hilt 作用域

不同的 @Inject 依赖可以拥有不同的生命周期

kotlin 复制代码
@Singleton
class SomeSingletonClass @Inject constructor()
  • 这个 SomeSingletonClass 只会被创建一次,整个应用生命周期都能共享
  • Hilt 自动管理它的生命周期,不会意外地创建多个实例

不同作用域示例:

kotlin 复制代码
@ActivityScoped
class SomeActivityScopedClass @Inject constructor()
  • ActivityScoped每个 Activity 会有自己的实例
  • SingletonComponent全局单例
  • ViewModelScoped与 ViewModel 生命周期一致

📌 4. @Inject 不能用于接口,需要 @Module 提供

如果 @Inject 用在 接口 上,会报错:

kotlin 复制代码
interface ApiService {
    fun fetchData(): String
}

❌ 直接 @Inject 不行:

kotlin 复制代码
class ApiServiceImpl @Inject constructor() : ApiService {
    override fun fetchData() = "API Data"
}

👉 必须使用 @Module 提供接口实例

kotlin 复制代码
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun provideApiService(): ApiService {
        return ApiServiceImpl()
    }
}

📌 关键点

  • 如果是普通类,@Inject constructor() 就够了
  • 如果是接口,必须用 @Module@Provides 提供

🎯 结论

方式 使用场景 作用
@Inject constructor() 普通类 让 Hilt 知道如何创建这个类
@Inject lateinit var Activity、Fragment、ViewModel 让 Hilt 自动注入对象实例
@Module + @Provides 接口或第三方库 让 Hilt 提供无法直接 @Inject 的对象

🚀 一句话总结

@Inject 让 Hilt 知道如何创建对象,而 @Inject lateinit var 让 Hilt 自动注入对象!


二 Hilt其他注解

Android Hilt 中,除了 @Inject 之外,还有多个核心注解,它们负责不同的依赖注入功能,包括作用域管理、模块提供依赖、绑定接口、生命周期管理等。以下是 Hilt 的核心注解及其详细解析,并附上代码示例。


📌 1. @HiltAndroidApp

作用

  • 标记 Application 类,让 Hilt 生成依赖注入的代码
  • 必须Application 类上使用

✅ 示例

kotlin 复制代码
@HiltAndroidApp
class MyApplication : Application()

🚀 关键点

✅ Hilt 会在应用启动时初始化依赖注入

✅ 生成 Hilt_MyApplication 代码,Hilt 依赖的入口

必须加,否则 Hilt 无法工作


📌 2. @AndroidEntryPoint

作用

  • 用于 ActivityFragmentService,让它们支持 Hilt 依赖注入
  • 必须加 ,否则 Hilt 无法注入对象

✅ 示例

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var someClass: SomeClass  // 自动注入
}

🚀 关键点

ActivityFragmentService 必须加 ,否则 @Inject 不会生效

✅ Hilt 会自动在内部生成依赖注入代码

Fragment 依赖的 Activity 也必须有 @AndroidEntryPoint,否则会崩溃


📌 3. @Inject

作用

  • 用于 构造函数字段,让 Hilt 知道如何创建和注入对象

✅ 示例

构造函数注入

kotlin 复制代码
class SomeClass @Inject constructor() {
    fun doSomething() = "Hello Hilt!"
}

字段注入

kotlin 复制代码
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var someClass: SomeClass
}

🚀 关键点

构造函数上加 @Inject,Hilt 知道如何创建对象

字段加 @Inject,Hilt 会自动提供依赖


📌 4. @Module + @InstallIn

作用

  • 提供无法直接 @Inject 的对象(如接口、第三方库)
  • 定义依赖的作用域

✅ 示例

kotlin 复制代码
@Module
@InstallIn(SingletonComponent::class) // 全局单例
object AppModule {
    @Provides
    @Singleton
    fun provideApiService(): ApiService {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

🚀 关键点

@Module 让 Hilt 知道这里提供依赖

@InstallIn 确定依赖的作用域(SingletonComponent 表示全局单例)


📌 5. @Provides

作用

  • 提供对象实例 (适用于无法 @Inject 的情况,如第三方库)

✅ 示例

kotlin 复制代码
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
    @Provides
    fun provideSomeClass(): SomeClass {
        return SomeClass()
    }
}

🚀 关键点

如果 SomeClass 不能 @Inject,就用 @Provides 提供

返回类型就是 Hilt 提供的类型


📌 6. @Binds

作用

  • 用于接口的实现绑定
  • @Provides 更高效(少了一次方法调用)

✅ 示例

kotlin 复制代码
interface ApiService {
    fun fetchData(): String
}

class ApiServiceImpl @Inject constructor() : ApiService {
    override fun fetchData() = "API Data"
}

@Module
@InstallIn(SingletonComponent::class)
abstract class AppModule {
    @Binds
    abstract fun bindApiService(impl: ApiServiceImpl): ApiService
}

🚀 关键点

@Binds 只能用于 abstract 方法,不能有逻辑

@Provides 更高效,但 @Provides 更灵活


📌 7. 作用域注解

作用

  • 控制 对象的生命周期,防止重复创建
  • 适用于 @Provides@Inject 提供的对象

✅ 示例

kotlin 复制代码
@Singleton
class SomeSingletonClass @Inject constructor()
作用域 适用范围 生命周期
SingletonComponent 全局 应用生命周期
ActivityRetainedComponent ViewModel Activity 重新创建时依然存在
ActivityComponent Activity Activity 销毁时释放
FragmentComponent Fragment Fragment 销毁时释放

📌 8. @HiltViewModel

作用

  • 让 ViewModel 支持 Hilt 注入
  • 简化 ViewModel 创建

✅ 示例

kotlin 复制代码
@HiltViewModel
class MainViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()
}

🚀 关键点

@HiltViewModel 必须配合 @AndroidEntryPointActivityFragment

ViewModel 不用手动创建,Hilt 自动管理


📌 9. @EntryPoint

作用

  • 用于无法使用 @AndroidEntryPoint 的类
  • ContentProviderBroadcastReceiver

✅ 示例

kotlin 复制代码
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
    fun getSomeClass(): SomeClass
}

// 使用 EntryPoint
val someClass = EntryPointAccessors
    .fromApplication(context, MyEntryPoint::class.java)
    .getSomeClass()

🚀 关键点

适用于无法直接 @Inject 的情况

Hilt 依然能提供依赖


🎯 结论

注解 作用
@HiltAndroidApp 让 Hilt 初始化依赖注入(必须加在 Application
@AndroidEntryPoint ActivityFragmentService 支持 Hilt
@Inject 构造函数注入 & 字段注入
@Module + @InstallIn 提供无法 @Inject 的依赖
@Provides 直接提供实例(如第三方库)
@Binds 绑定接口实现(比 @Provides 高效)
@Singleton 作用域管理(全局单例)
@HiltViewModel Hilt ViewModel 支持
@EntryPoint 用于 BroadcastReceiverContentProvider

🚀 总结 :Hilt 通过 @Inject@Module@Provides 等注解,让 对象创建 & 生命周期管理 自动化,大幅减少样板代码,提高可维护性!

相关推荐
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android